Строгие стандарты: только переменные должны передаваться по ссылке

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

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

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

Итак, когда он все равно сообщит о предупреждении?

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

 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); 

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

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

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

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

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

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

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

В основном вы сначала назначаете временную переменную и отправляете переменную в качестве аргумента.

Причиной ошибки является использование внутренней функции PHP Data Data Structures, array_shift () [php.net/end]. Функция принимает массив как параметр. Хотя амперсанд указан в прототипе «array_shift ()» в «Руководстве», в расширенном определении этой функции нет предостерегающей документации, и нет никакого очевидного объяснения того, что этот параметр фактически передан по ссылке. Возможно, это / понято /. Однако я не понял, поэтому мне было трудно определить причину ошибки.

Воспроизведение кода:

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

Второй фрагмент не работает и поэтому. array_shift – это функция-модификатор, которая меняет свой аргумент, поэтому он ожидает, что его параметр будет ссылкой, и вы не можете ссылаться на то, что не является переменной. См. Объяснения Расмуса здесь: http://bugs.php.net/bug.php?id=48937

Этот код:

 $monthly_index = array_shift(unpack('H*', date('m/Y'))); 

Изменить на:

 $date_time = date('m/Y'); $unpack = unpack('H*', $date_time); array_shift($unpack); 

Ну, в очевидных случаях, вы всегда можете сказать PHP, чтобы подавлять сообщения, используя «@» перед функцией.

$monthly_index = @array_shift(unpack('H*', date('m/Y')));

Возможно, это не одна из лучших практик программирования, чтобы подавлять все ошибки таким образом, но в некоторых случаях (например, эта) она удобна и приемлема.

В результате я уверен, что ваш друг SysAdmin будет доволен менее загрязненным «error.log». 😉