Область действия PHP - PullRequest
       5

Область действия PHP

4 голосов
/ 17 сентября 2011

У меня есть файл, который объединяет мои повторно используемые функции в один файл (functions.php). Это include_once() на каждой странице, которая нуждается в этом. Я получаю сообщение об ошибке, когда мои пользовательские функции пытаются получить доступ к соединению MySQL вне их собственной области видимости. Источник немного похож на это:

<?php
    // functions.php
    $connect = mysql_connect("localhost", "user", "pass") or die("MySQL said: ".mysql_error());
    mysql_select_db("database", $connect) or die("MySQL said: ".mysql_error()); // no error

    /* ... */

    function getmotd($user) {           
        $query = "SELECT cid FROM `users`
        WHERE id = ".$user;
        $query = mysql_query($query, $connect); // error occurs here, $connect is not a valid MySQL link-resource
        /* ... */
    }
?>

Почему моя функция не имеет доступа к переменным, объявленным выше ее области видимости? Я могу получить успешное соединение, воспроизведя объявление $connect внутри функции.

Любое понимание того, как я могу обойти это или что я делаю здесь не так?

Ответы [ 2 ]

6 голосов
/ 17 сентября 2011

Используйте ключевое слово global.

Пример

function getmotd($user) {  
     global $connect;
    $query = "SELECT cid FROM `users`
    WHERE id = ".$user;
    $query = mysql_query($query, $connect); // error occurs here, $connect is not a valid MySQL link-resource
    /* ... */
}

Вы также можете сделать это следующим образом

function getmotd($user) {  
    $query = "SELECT cid FROM `users`
    WHERE id = ".$user;
    $query = mysql_query($query, $GLOBALS['connect']); // error occurs here, $connect is not a valid MySQL link-resource
    /* ... */
}

Если выЕсли вы хотите создавать повторно используемые коды, вам, вероятно, будет лучше с ООП.Создайте класс для базы данных, добавьте некоторые свойства для информации о базе данных и получите доступ к ним из функций, используя ключевое слово this.

5 голосов
/ 17 сентября 2011

Вы не можете получить доступ к $ connect, потому что это выходит за рамки функции; то есть PHP может видеть переменные внутри функции только тогда, когда она внутри нее. Вы можете использовать ключевое слово global, чтобы PHP знал, что переменная находится вне области действия функции, как предлагает Кемаль, но я думаю, что лучший способ - передать соединение в функцию. Это даст вам лучшую инкапсуляцию. Если вы научитесь писать свои функции (и более поздние классы) с передачей необходимых вам ресурсов и данных (практика, известная как «внедрение зависимостей»), вы обнаружите, что у вас есть более чистый и более понятный код. Вот пример:

function getmotd($db, $user) {
    $query = "SELECT cid FROM users WHERE id = " . (int)$user;
    $result = mysql_query($query, $db);
    /.../
}

$connect = mysql_connect(...);
mysql_select_db(...);
$motd = getmotd($connect, $user);

Надеюсь, это поможет.

...