PHP переменная область видимости - PullRequest
1 голос
/ 24 февраля 2010

Итак, у меня есть класс. В его конструктор я включаю код, который связывает меня с моей базой данных через расширение mysqli:

class MyClass
{
    public function __construct()
    {
        include("dbconnect");
    }
}

dbconnect выглядит так:

$host = "localhost";
$user = "user";
$pass = "123";
$database = "myDatabase";

$mysqli = new mysqli($host, $user, $pass, $database);
$mysqli->set_charset('utf8-bin');

Теперь к моей проблеме: поскольку mysqli можно использовать в стиле OOP, как мне получить доступ к переменной в MyClass?

function doIt()
{    
    $query = "SELECT * FROM myTable";    
    $result = $mysqli->multi_query($query);
}

В результате вызова этой функции

Примечание: неопределенная переменная: mysqli in ... онлайн ... Неустранимая ошибка: вызов функции-члена multi_query () для необъекта в ... на линии ...

Так что, похоже, область действия переменной не верна. Кто-нибудь знает, как это исправить? Было бы лучше, если бы MyClass не требовалась дополнительная ссылка или что-то для mysqli, так как я хотел бы держать его отдельно.

Ответы [ 3 ]

5 голосов
/ 24 февраля 2010

Переменная $mysqli доступна только внутри области конструктора. Измените свой конструктор так:

class MyClass
{
    public function __construct()
    {
        include("dbconnect");
        $this->mysqli = $mysqli;
    }
}

Теперь вы можете использовать $this->mysqli в других методах для этого объекта.

2 голосов
/ 24 февраля 2010

Переменная имеет ту же область видимости, что и любая другая переменная внутри функции: она действительна только внутри функции. Как только функция вернется, она исчезнет. Если вы хотите «сохранить» переменную для другой функции в классе, сделайте ее членом класса:

class MyClass {
    var $member = null;

    function foo() {
        $localVar = $this->member;
        $this->anotherMember = 'bar';  // $anotherMember is now available for other functions
    }
}

Повторное использование кода через include не очень хорошо, потому что оно не дает вам никакого контроля над тем, как будут использоваться переменные. Я хотел бы подумать о реструктуризации, например, сделать функцию, которая устанавливает соединение с БД, а затем returns дескриптор БД.

0 голосов
/ 24 февраля 2010

То, что вы ищете, это "глобальное" ключевое слово. В общем, я бы избегал глобальных изменений и переосмыслил бы ваш дизайн

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...