实例化数据库对象问题

时间:2012-09-08 16:01:16

标签: php autoload

我的数据库类有问题。我正在推动我需要的所有方法,在关闭类之后,我正在创建它的实例并将其影响到$ database变量。然后在索引页面上我不需要显式文件,因为我正在设置一个__autoload函数来为我做这个。但是,当我只是尝试使用$ database-> isConnected()方法时,我设置了实例,它不起作用。我必须在索引页面上创建$ database的另一个实例,意味着调用new dataBase();再一次,只有自动加载才有效。

这里我不需要任何代码,只是希望有人给我逻辑推理的原因。我想要比复制粘贴更好地理解事物。因为我找到了一种解决方法,只需在新页面上创建一个实例,然后在类页面中进行实例化。

1 个答案:

答案 0 :(得分:1)

以下是我从您的解释中得到的代码:

文件: database.php

class Database {
    isConnected() {
        //Some code
    }
}
$database = new Database();

文件: index.php

function __autoload ($class) {
     include $class+'.php';  //Note this is highly unsafe
}
$database->isConnected();

问题在于__autoload()没有按照您的想法行事。

__autoload()加载在引用时尚未定义的类。但PHP并不知道$database属于Database类。就它而言,它是一个未定义的变量。

所以,如果你这样做了:

文件: database.php

class Database {
    isConnected() {
        //Some code
    }
}

文件: index.php

$database = new Database();

PHP会意识到数据库没有定义,并调用__autoload()来加载database.php(假设__autoload()被正确定义)。然后构造函数将运行并且$database将被正确设置。

您应该做的是包括数据库文件(include 'database.php')或使用静态方法(例如Database::getDatabase();) - 引用该类,以便PHP知道它__autoload()