$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.
Ваш второй код будет выдавать ошибку, если он пишет как (обратите внимание на & в сигнатуре функции):
function &get_arr(){
return array(1,2);
}
$el = array_shift(get_arr());
Так что быстрое (и не очень хорошее) исправление будет:
$el = array_shift($tmp = $instance->find(..));
Обычно вы сначала делаете присвоение временной переменной и отправляете переменную в качестве аргумента.
Причиной ошибки является использование внутренней функции Структуры данных программирования PHP, array_shift () [php.net/end].
Функция принимает массив в качестве параметра. Хотя в прототипе указан амперсанд array_shift()
в «Руководстве», в расширенном определении этой функции нет предупреждающей документации, а также нет никакого очевидного объяснения того, что параметр фактически передается по ссылке.
Возможно, это / понял /. Однако я не понял, поэтому мне было трудно определить причину ошибки.
Воспроизвести код:
function get_arr()
{
return array(1,2);
}
$array = get_arr();
$el = array_shift($array);
Второй фрагмент также не работает, и вот почему. array_shift
является функцией-модификатором, которая изменяет свой аргумент, поэтому ожидает, что ее параметр является ссылкой, и вы не можете ссылаться на то, что не является переменной. Смотрите объяснения Расмуса здесь: Строгие стандарты: только переменные должны передаваться по ссылке
Этот код:
$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». 😉