$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». 😉