Строгие Стандарты: Только переменные должны быть переданы ссылкой

$el = array_shift($instance->find(..))

Вышеупомянутый код так или иначе сообщает о строгом предупреждении standars, но это не будет:

function get_arr(){
    return array(1,2);
}
$el = array_shift(get_arr());

Таким образом, когда это сообщит о предупреждении так или иначе?

81
задан user2864740 26 June 2014 в 19:39
поделиться

3 ответа

$ instance-> find () возвращает ссылку на переменную.

Вы получаете отчет, когда пытаетесь использовать эту ссылку в качестве аргумента функции, не сохраняя ее сначала в переменной.

Это помогает предотвратить утечки памяти и, вероятно, станет ошибкой в ​​следующих версиях PHP.

Ваш второй код вызовет ошибку, если он будет писать как (обратите внимание на сигнатуру функции &):

function &get_arr(){
    return array(1,2);
}
$el = array_shift(get_arr());

Таким образом, быстрое (и не очень хорошее) исправление будет:

$el = array_shift($tmp = $instance->find(..));

Обычно вы сначала выполняете присвоение временной переменной , и отправьте переменную в качестве аргумента.

7
ответ дан 24 November 2019 в 09:41
поделиться

Рассмотрим следующий код:

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);
93
ответ дан 24 November 2019 в 09:41
поделиться

Второй фрагмент тоже не работает, вот почему. array_shift - это функция-модификатор, которая изменяет свой аргумент, поэтому она ожидает, что ее параметр будет ссылкой, и вы не можете ссылаться на то, что не является переменной. См. Пояснения Расмуса здесь: Строгие стандарты: только переменные должны передаваться по ссылке

3
ответ дан 24 November 2019 в 09:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: