Область видимости PHP - PullRequest
3 голосов
/ 30 мая 2011

У меня есть несколько классов в приложении, которое я сейчас создаю, и я хочу, чтобы один получил доступ к некоторым функциям-членам другого, но я не могу этого сделать.

Первый класс называется MySQLDB:

class MySQLDB{
public $connection;

function __construct(){
//connects to database
}

function login($username, $password){
//queries database...
}
}

Тогда у меня есть класс с именем Session:

class Session{
//variables
//constructor

function processlogin($username, $password){
$database->login($username, $password);
}

Тогда после этого у меня есть два объявления класса:

$database = new MySQLDB();
$session = new Session();

Независимо от того, куда я поместил эти утверждения относительно классов, я все равно получаю ту же ошибку:

PHP Notice:  Undefined variable: database in C:\inetpub\wwwroot\cmu\include\session.php on line 52
PHP Fatal error:  Call to a member function login() on a non-object in C:\inetpub\wwwroot\cmu\include\session.php on line 52

Я видел несколько предложений, которые предлагали бы поместить новый объект базы данных в объявление класса Session, но я хочу избежать этого, потому что я использую класс базы данных в нескольких других местах в коде, и я не хочу открывать несколько подключения к базе данных.

Ответы [ 4 ]

4 голосов
/ 30 мая 2011

вы можете передать ссылку на экземпляр MySQLDB в конструкторе Session.

class Session{
    public $db;

    function __construct(&$db=null){
        if($db == null)
            $this->db = new MySQLDB();
        else
            $this->db = $db;
    }
    // ....
}

$database = new MySQLDB();
$session = new Session($database);
4 голосов
/ 30 мая 2011

, поскольку вы хотите иметь доступ к глобальной переменной, вы можете получить доступ к ней с помощью global:

function processlogin($username, $password){
    global $database;
    $database->login($username, $password);
}

или используйте переменную в качестве параметра для конструктора и запомните ссылку на объект базы данных в классе Session:

class Session{

    private $database;

    function __construct($database){
        $this->$database = $database;
    }

    function processlogin($username, $password){
        $this->database->login($username, $password);
    }

}

и тогда вы звоните:

$database = new MySQLDB();
$session = new Session($database);

это удобно, если вы используете дополнительные функции afterwords, которым также требуется доступ к объекту базы данных.

2 голосов
/ 30 мая 2011

$database не определен внутри processlogin и не передан в качестве параметра, поэтому функция не имеет к нему доступа.

Вы можете передать его в качестве параметра конструктора в Session:

class Session {
    private $db;

    public function __construct($database) {
        $this->db = $database;

    public function processlogin($username, $password){
        $this->$db->login($username, $password);
    }
}

$database = new MySQLDB();
$session = new Session($database);
2 голосов
/ 30 мая 2011

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

function processlogin($username, $password){
global $database;
$database->login($username, $password);
}

Несмотря на то, что это сработает, я настоятельно рекомендую прочитать о механизме внедрения зависимостей, в котором вы'передать переменную $database в качестве параметра методу processlogin () или установить его как закрытый член этого класса в конструкторе / сеттере.Таким образом, соединение с базой данных будет взаимозаменяемым, и вы получите больше гибкости в своем коде.

...