[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с __get и PDOStatement::bindParam
Placido
Проблема такая.
Когда в функции bindparam() (PDO) я пытаюсь связать перегруженное свойство (которое возвращает метод __get())
foreach ($this->modelfields as $field => $type)
{
$pdoparam = (stripos($type, 'int') === 0) ? PDO::PARAM_INT : PDO::PARAM_STR;
$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. Там пишут, что проблема решена: для того чтобы этот нотис не вылетал, нужно перед __get() ставить знак ссылки:
&__get(...
Но когда я пытаюсь это сделать, вылетает другой нотис + остается старый.
Notice: Only variable references should be returned by reference in ...

Что делать?



Спустя 2 часа, 3 минуты, 38 секунд (26.02.2012 - 15:32) Oyeme написал(а):
Для начало:

Replace this
$this->$param))

to this
$this->param))

ТОже самое

$this->$field


Это не Ваша ситуация.
&__get()

Спустя 10 минут, 46 секунд (26.02.2012 - 15:42) Placido написал(а):
С $this->$field и $this->$param все в порядке. Так и должно быть.
Проблема в была другом. Когда в перегруженном свойстве (отрабатывает __get()) возвращается null (когда его нет), bindParam пытается изменить параметр по каким-то своим внутренним правилам, так как связывает параметр как ссылку. Проблема решилась использованием bindValue вместо bindParam.
Unlike PDOStatement::bindValue(), the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called. 

Спустя 1 час, 7 минут, 28 секунд (26.02.2012 - 16:50) SlavaFr написал(а):
Цитата (Placido @ 26.02.2012 - 10:28)
public function __get($param)
{
if(isset($this->$param))

твое условие if(isset($this->$param)) не когда не будет выполненно, если ты на прямую вызываеш переменную $object->peremennaja.


Дело в том, что метод __get только тогда запускается, если переменная не найдена.

Спустя 18 минут, 8 секунд (26.02.2012 - 17:08) Placido написал(а):
Цитата (SlavaFr @ 26.02.2012 - 15:50)
твое условие if(isset($this->$param)) не когда не будет выполненно, если ты на прямую вызываеш переменную $object->peremennaja.
Дело в том, что метод __get только тогда запускается, если переменная не найдена.

Действительно!
Но __get мне все-таки нужен, потому что в некоторых случаях у меня не будет определена переменная $this->$field, и в этом случае мне нужно, чтобы вместо нее возвращался null. Переписал метод так
public function __get($param)
{
return null;
}

Спасибо за подсказку.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.