Поэтому у меня есть класс. В его конструкторе я включаю код, который соединяет меня с моей базой данных через расширение 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-Style, как получить доступ к переменной в MyClass?
function doIt() { $query = "SELECT * FROM myTable"; $result = $mysqli->multi_query($query); }
Вызов этой функции приводит к
Примечание. Неопределенная переменная: mysqli in … on line … Fatal error: вызов функции-члена multi_query () для не-объекта в … on line …
Таким образом, кажется, что область действия переменной неверна. Кто-нибудь знает, как это исправить? Было бы лучше, если MyClass не нуждался бы в дополнительной ссылке или что-то в mysqli, так как я хотел бы сохранить ее отдельно.
Переменная $mysqli
доступна только внутри области конструктора. Измените свой конструктор так:
class MyClass { public function __construct() { include("dbconnect"); $this->mysqli = $mysqli; } }
вclass MyClass { public function __construct() { include("dbconnect"); $this->mysqli = $mysqli; } }
Теперь вы можете использовать $this->mysqli
в других методах этого объекта.
Переменная имеет ту же область действия, что и любая другая переменная внутри функции: она действительна только внутри функции. Как только функция вернется, она исчезнет. Если вы хотите «сохранить» переменную для других функций в классе, сделайте ее членом класса:
class MyClass { var $member = null; function foo() { $localVar = $this->member; $this->anotherMember = 'bar'; // $anotherMember is now available for other functions } }
Повторное использование кода через include
не является хорошим, потому что оно не дает вам никакого контроля над тем, как будут использоваться переменные. Я бы подумал о реструктуризации вещи, как о создании функции, которая устанавливает соединение с БД, а затем returns
дескриптор БД.
То, что вы ищете, – это ключевое слово «global». В общем, однако, я бы избегал глобальных изменений и переосмыслил ваш дизайн.