我目前正在构建的应用程序中有几个类,我想让其中一个访问另一个的一些成员函数,但我似乎做不到。
第一个类称为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);