PHP类范围

时间:2011-05-30 19:13:50

标签: php oop 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类声明中,但我想避免这样做,因为我在代码中使用数据库类的其他几个地方而且我不想打开多个与数据库的连接。

4 个答案:

答案 0 :(得分:4)

由于您希望对全局设置变量进行访问,因此您可以使用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);

这会派上用场,如果你使用更多的函数后,还需要访问数据库对象。

答案 1 :(得分:4)

您可以将引用传递给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);

答案 2 :(得分:2)

您正在创建两个全局变量。如果您正在执行此类操作,则需要使用“global”关键字声明要在函数中使用的变量:

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

尽管这会有效,但我强烈建议您阅读Dependecy Injection机制,其中您将$database变量作为参数传递给processlogin()方法,或者将其设置为构造函数中该类的私有成员/二传手。这样,数据库连接将是可互换的,您将在代码中获得更大的灵活性。

答案 3 :(得分:2)

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