使用类中的$ this从空值创建默认对象

时间:2012-12-02 15:25:47

标签: php exception pdo

我在这里找到的PHP PDO Wrapper Class略有不同:http://www.imavex.com/php-pdo-wrapper-class/

这是我正在使用的新构造函数:

public function __construct($dsn, $user='', $passwd='') {
    $options = array(
        PDO::ATTR_PERSISTENT => true, 
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    );

    try {
        parent::__construct($dsn, $user, $passwd, $options);
    } catch (PDOException $e) {
        $this->error = $e->getMessage();
    }
}

error是此类的私有变量,在类的开头定义,位于constructor.strong文本上方

当我像这样使用它时

$database = new Database(
        'mysql:host=' . $config['mysql_host'] . ';port=' . $config['mysql_port'] . ';dbname=' . $config['mysql_database'],
        $config['mysql_username'],
        $config['mysql_password']
);

它显示了以下错误:从空值创建默认对象,指向数据库类文件,位于$this->error = $e->getMessage();行。

抛出异常的原因是因为我还没有设置mysql用户名和密码,所以不用担心。我试图找出它为什么会出现这个错误以及如何修复它。

1 个答案:

答案 0 :(得分:2)

似乎由于db类扩展了PDO,当PDO构造函数抛出异常$时,它变为NULL。

class db extends PDO {
    public function __construct($dsn, $user="", $passwd="") {
        $options = array(
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );

        try {
            parent::__construct($dsn, $user, $passwd, $options);
        } catch (PDOException $e) {
            echo "Got PDOException\n";
            var_dump($this);
        }
    }
}


new db('mysql:host=localhost;port=3306;dbname=something', 'invaliduser', 'invalidpass');

如果您运行该代码,您将获得此输出:

Got PDOException
NULL

要解决此问题,您可以删除有问题的行并检查db对象是否为null或删除try-catch并在实例化新数据库时执行异常处理。 或者,您可以重写类以将PDO对象存储在变量中,而不是扩展PDO。