$el = array_shift($instance->find(..))
Приведенный выше код каким-то образом сообщает о предупреждении о строгих стандартах, но это не так:
function get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
Так когда же он все равно сообщит о предупреждении?
get_arr()
функция) действительно создает уведомление о строгих стандартах (проверено PHP 5.2 и PHP 5.5).Ответы:
Рассмотрим следующий код:
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);
источник
current
предполагает, что указатель массива находится на первом элементе. В большинстве случаев это может быть верным предположением, но его следует остерегаться.array_shift()
в том, что он ожидает, что ссылка на изменение :-)$intermediate
значения, используя дополнительную пару круглых скобок.$el = array_shift( ( get_arr() ) );
. См. Stackoverflow.com/questions/9848295/…$instance->find()
возвращает ссылку на переменную.Вы получаете отчет, когда пытаетесь использовать эту ссылку в качестве аргумента функции, не сохраняя ее предварительно в переменной.
Это помогает предотвратить утечки памяти и, вероятно, станет ошибкой в следующих версиях PHP.
Ваш второй блок кода вызовет ошибку, если он напишет так (обратите внимание
&
на подпись функции):function &get_arr(){ return array(1, 2); } $el = array_shift(get_arr());
Итак, быстрое (и не очень хорошее) исправление:
$el = array_shift($tmp = $instance->find(..));
Обычно вы сначала присваиваете временную переменную и отправляете ее в качестве аргумента.
источник
array_shift($tmp = $instance->find(..))
не присваивает значение$instance->find(..)
для$tmp
и затем передает значение задания наarray_shift()
- , который не то же самое, передавая$tmp
себя, так не лучше исходной ситуации без уступки.Причина ошибки - использование внутренней функции структур данных программирования PHP, array_shift () [php.net/end].
Функция принимает в качестве параметра массив. Хотя в прототипе «
array_shift()
руководства» указан амперсанд, в расширенном определении этой функции нет какой-либо предупреждающей документации, а также нет никакого очевидного объяснения того, что параметр на самом деле передается по ссылке.Возможно, это / понятно /. Однако я не понял, поэтому мне было сложно определить причину ошибки.
Воспроизвести код:
function get_arr() { return array(1, 2); } $array = get_arr(); $el = array_shift($array);
источник
Этот код:
$monthly_index = array_shift(unpack('H*', date('m/Y')));
Необходимо заменить на:
$date_time = date('m/Y'); $unpack = unpack('H*', $date_time); array_shift($unpack);
источник
Второй фрагмент тоже не работает, вот почему.
array_shift
- функция-модификатор, изменяющая свой аргумент. Поэтому он ожидает, что его параметр будет ссылкой, и вы не можете ссылаться на то, что не является переменной. См. Объяснения Расмуса здесь: Строгие стандарты: только переменные должны передаваться по ссылкеисточник
Что ж, в таких очевидных случаях вы всегда можете указать PHP подавлять сообщения, используя символ «@» перед функцией.
$monthly_index = @array_shift(unpack('H*', date('m/Y')));
Возможно, такой способ подавления всех ошибок - не лучшая практика программирования , но в определенных случаях (например, в этом) это удобно и приемлемо.
В результате, я уверен, ваш друг "системный администратор" будет доволен менее загрязненным
error.log
.источник