在非对象上调用成员函数,但对象是$ this,即它本身?

时间:2010-12-17 12:24:05

标签: php mysql class pdo

如果查询出错,我对PDO和PDOStatement类进行了简单的扩展,以便进行错误记录。这是我简化的代码:

class MyPDO extends PDO
{
    public function __construct($db)
    {
        try
        {
            parent::__construct('mysql:host=localhost;dbname=' . $db, $user, $pass);
            $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
            $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('MyPDOStatement', array($this)));
        }
        catch(PDOException $e)
        {
            $this->error(array($e->getCode(), $e->getMessage(), '08006'));
        }
    }

    function query($query)
    {
        $stmt = parent::query($query);
        if ($stmt !== false)
            return $stmt;
        else
        {
            $this->error($this->errorInfo(), $query);
            return false;
        }
    }

    function error($info, $query = false)
    {
        // log error here
    }
}

显然,我已经覆盖了prepare()和exec()方法,以及语句类的execute()方法。当那些(或上面的query())有错误时,它们都可以正常工作。问题是当PDO无法连接到数据库时,我得到了“PHP致命错误:调用成员函数错误()对非对象”错误,包含在catch中。

我已经尝试用catch替换MyPDO :: error(),但这似乎没有做任何错误。我很难解决问题所在。

1 个答案:

答案 0 :(得分:4)

看起来像PDO中的错误。下面按预期打印“NULL”而不是“object(MyPDO)”。

class MyPDO extends PDO
{
    public function __construct() {
        try {
            parent::__construct(111);
        } catch(Exception $e) {
            var_dump($this);
        }
    }
}

$p = new MyPDO;

PDO :: construct似乎在对象完全初始化之前抛出异常。

他们说已经修复了http://bugs.php.net/bug.php?id=52053,所以请尝试升级到最新版本。