Можно ли привязать параметр PDO к переменной-члену объекта?

С помощью PDOStatement::bindParam()можно связать параметр с переменной, что особенно полезно, когда подготовленный оператор выполняется несколько раз, каждый из которых имеет разные значения параметров. Например:

$dbh = new PDO('mysql:dbname=foo', 'eggyal', 'password1');
$qry = $dbh->prepare('DELETE FROM bar WHERE qux = ?');
$qry->bindParam(1, $qux, PDO::PARAM_INT);

while (true) {
  $qux = ... ;
  $qry->execute();
  // etc
}

Мои вопросы:

  1. Можно ли привязать параметр к переменной-члену объекта? Например:

    $qry->bindParam(1, $obj->qux, PDO::PARAM_INT);
    
  2. Если да, ток какой переменной-члену объекта привязан такой параметр: то, на которое ссылаются во время bindParam() вызов или то, на что ссылаются при выполнении оператора? Например:

    $obj->qux = 123;
    
    $obj = new stdClass();
    $obj->qux = 456;
    
    $qry->execute();  // which value is used for qux ?
    
  3. Где это поведение задокументировано (если вообще)?

1 ответ

Решение

PHP хранит ссылку на переменную, чтобы использовать ее. Когда вы звоните $qry->bindParam(1, $obj->qux, PDO::PARAM_INT)сохраненная ссылка является ссылкой на член экземпляра класса.

Когда вы меняете члена $obj->quxссылка остается той же, что и в вашем $obj, Однако, если вы реанимируете $obj в новый класс, то все ссылки будут изменены, но ваш старый объект все еще находится в памяти! Поэтому, когда вы назначаете новое значение новому $obj->qux, это не та же самая используемая переменная, поэтому работает $qry->execute будет использовать старое значение.

Я надеюсь, что я достаточно ясно

Другие вопросы по тегам