Вызов функции-члена для необъектного объекта, но объект это $ this, т.е. - PullRequest
1 голос
/ 17 декабря 2010

У меня есть простое расширение для классов 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: вызов функции-члена error () для необъектного объекта» в строке, содержащейся в перехватчике.

Я попытался заменить его на MyPDO :: error () для перехвата, но это, похоже, ничего не делает при ошибке. Я в тупике, в чем проблема.

1 Ответ

4 голосов
/ 17 декабря 2010

Похоже, ошибка в PDO. Следующее печатает «NULL», а не «объект (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,, поэтому попробуйте обновить до последней версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...