Уведомление PHP при привязке перегруженного свойства в PDOStatement :: bindParam - PullRequest
4 голосов
/ 26 февраля 2012

Когда я пытаюсь связать перегруженное свойство в методе PDOStatement :: bindParam,

$stmt->bindParam(':'.$field.'', $this->$field, $pdoparam);
...

public function __get($param)
    {
        if(isset($this->$param))
            return $this->$param;
    }

Я получаю уведомление

Notice: Indirect modification of overloaded property Msgs::$posttime has no effect in ...

После некоторого исследования я обнаружил сообщение об ошибке аналогичного проблема на php.net.Предлагаемое решение заключается в добавлении определения & before __get.

&__get(...

Но когда я пытаюсь это сделать, я получаю еще одно уведомление

Notice: Only variable references should be returned by reference in ...

Версия PHP - 5.3.8.

Есть ли какое-либо решение этой проблемы?

Ответы [ 2 ]

5 голосов
/ 26 февраля 2012

PDOStatement::bindParam требует ссылки и потенциально изменяет переданный ей аргумент (преобразует его в наиболее подходящий тип или записывает в него результат, если это параметр OUT / INOUT).

PDOStatement::bindValue не принимает ссылку и не изменяет аргумент.

__get возвращает значение $this->$param, но фактически не делает его ссылкой на $this->$param, а создание ссылки на возвращаемое значение создает это уведомление. Это не относится к PDO, даже простой $x =& $this->$param вызовет то же самое уведомление. Используйте bindValue вместо bindParam, чтобы избежать этого.

Еще несколько пояснений по поводу нереференции __get: https://stackoverflow.com/a/5337433/1233508

0 голосов
/ 26 февраля 2012

Если вы изменили код на &__get(..., я думаю, вам также следует изменить следующую строку:

$stmt->bindParam(':'.$field.'', &$this->$field, $pdoparam);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...