2015-06-15 3 views
0

У меня есть метод в классе с этой подписью:Pass новых переменное в качестве ссылки

public static function execute($query, $data = array(), &$result = NULL, $onlyOne = true) 

Дело в том, чтобы выполнить SQL запрос с данными (если необходимо) и изменить результат переменного (если установлены верно) и, наконец, возвращает только первую строку, если вызывающий абонент заинтересован в ней только. Он обрабатывает ошибки SQL и т. Д., И в целом это удобная вещь, поскольку я пытаюсь уменьшить sql-запросы в сценарии до одной строки или двух (проверка результата).

Теперь у меня есть проблемы с этим:

Db::execute("query with :data", array(":data" => "data"), ($row = true)); 

РНР жалуется на $ строка не является переменной:

Strict standards: Only variables should be passed by reference 

Как я понимаю PHP прицелы Прицел функция шириной а не в масштабе блока (например, в C++). Поэтому $row должен быть переменной в моей области видимости и доступен для передачи в качестве ссылки (а не только для временного вызова функции). Если я объявлю это заранее, он работает, но несколько раздувает код. Есть ли способ сохранить объявление этой переменной в вызове функции следующим образом?

EDIT: добавить к принятому ответу. Ссылка может быть присвоено значение по умолчанию любой, поэтому я изменил свою подпись:

public static function execute($query, $data = array(), &$result = -1, $onlyOne = true) 

, который позволяет мне назвать его помощью:

Db::execute("query with :data", array(":data" => "data"), $row); 

без предварительного объявления переменной результата. Внутри я просто проверить, если $ результатов не -1 (или я могу проверить, если это NULL означающего новые пустые переменным), чтобы заполнить результат.

+1

'($ строка = истина)' не является переменной, это назначение. Использование присвоения таким образом эквивалентно передаче * установленного значения *, aka 'true'. Это должно быть просто '$ row', и вам не нужно предварительно объявлять переменные в PHP. – Sammitch

+0

Вы передаете только 3 аргумента, поэтому строка $ должна быть var, на которую можно ссылаться. Попробуйте: 'Db :: execute (« query with: data », array («: data »=>« data »), $ result, true);' – AbraCadaver

ответ

3
Db::execute("query with :data", array(":data" => "data"), ($row = true)); 
                  ^^^^^^^^^^^^^ 

Это задание. В PHP результат присваивания - это назначенное значение, поэтому вы передаете true в свою функцию. Этот аргумент определяется как ссылка, и вы не можете создать ссылку на true.

Вы должны были бы сделать:

$row = true; 
DB::execute(....., $row); 
+0

Хорошо спасибо, но почему результат присвоения - это значение и а не переменной, которой назначается? В скобках следует убедиться, что результат того, что находится внутри этого выражения, фактически передается, и результат должен быть переменной (а не его значением), но, по-видимому, это не так, как это работает в PHP ... Любой способ создать переменную для прохождения как ссылка со значением без предварительного объявления? – Resurrection

+0

php допускает '$ x = $ y = $ z = 42'. все три переменные становятся «42». когда вы используете '$ row = true' в списке аргументов метода, вы не передаете переменную' $ row', вы передаете результат выражения, что является значением 'true'. передача только переменной делает переменную ее собственным автономным выражением. –

+0

@Resurrection Или одним словом: http://php.net/manual/en/language.variables.basics.php <- первый абзац после первого блока кода – Rizier123

Смежные вопросы