$el = array_shift($instance->find(..))
Вышеупомянутый код так или иначе сообщает о строгом предупреждении standars, но это не будет:
function get_arr(){
return array(1,2);
}
$el = array_shift(get_arr());
Таким образом, когда это сообщит о предупреждении так или иначе?
$ instance-> find ()
возвращает ссылку на переменную.
Вы получаете отчет, когда пытаетесь использовать эту ссылку в качестве аргумента функции, не сохраняя ее сначала в переменной.
Это помогает предотвратить утечки памяти и, вероятно, станет ошибкой в следующих версиях PHP.
Ваш второй код вызовет ошибку, если он будет писать как (обратите внимание на сигнатуру функции &):
function &get_arr(){
return array(1,2);
}
$el = array_shift(get_arr());
Таким образом, быстрое (и не очень хорошее) исправление будет:
$el = array_shift($tmp = $instance->find(..));
Обычно вы сначала выполняете присвоение временной переменной , и отправьте переменную в качестве аргумента.
Рассмотрим следующий код:
error_reporting(E_STRICT);
class test {
function test_arr(&$a) {
var_dump($a);
}
function get_arr() {
return array(1,2);
}
}
$t= new test;
$t->test_arr($t->get_arr());
Это приведет к следующему результату:
Strict Standards: Only variables should be passed by reference in `test.php` on line 14
array(2) {
[0]=>
int(1)
[1]=>
int(2)
}
Причина? Метод test::get_arr()
не является переменной, и в строгом режиме это вызовет предупреждение. Такое поведение крайне неинтуитивно, поскольку метод get_arr()
возвращает значение массива.
Чтобы обойти эту ошибку в строгом режиме, либо измените сигнатуру метода, чтобы он не использовал ссылку:
function test_arr($a) {
var_dump($a);
}
Поскольку вы не можете изменить сигнатуру array_shift
, вы также можете использовать промежуточную переменную:
$inter= get_arr();
$el= array_shift($inter);
Второй фрагмент тоже не работает, вот почему. array_shift
- это функция-модификатор, которая изменяет свой аргумент, поэтому она ожидает, что ее параметр будет ссылкой, и вы не можете ссылаться на то, что не является переменной. См. Пояснения Расмуса здесь: Строгие стандарты: только переменные должны передаваться по ссылке