Область переменных php oop

Поэтому у меня есть класс. В его конструкторе я включаю код, который соединяет меня с моей базой данных через расширение 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». В общем, однако, я бы избегал глобальных изменений и переосмыслил ваш дизайн.