PHP class scope


PHP class scope

我目前正在构建的应用程序中有几个类,我想让其中一个访问另一个的一些成员函数,但我似乎做不到。

第一个类称为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类声明中,但我希望避免这样做,因为我在代码中的其他几个位置使用了数据库类,并且我不想打开到数据库的多个连接。

由于您想要访问全局设置的变量,您可以使用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);

如果在词尾使用更多的函数,也需要访问数据库对象,那么这就派上了用场。

您可以在Session构造函数中传递对MySQLDB实例的引用。

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);

您正在创建两个全局变量。如果您正在做这样的事情,您需要用"global"关键字声明要在函数中使用的变量:

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

尽管这会起作用,但我强烈建议阅读Dependency注入机制,在该机制中,您可以将$database变量作为参数传递给processlogin()方法,或者在constructor/ssetter中将其设置为该类的私有成员。这样一来,数据库连接将是可互换的,您将在代码中获得更大的灵活性。

$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);