$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()
メソッドは変数ではなく、strict モードでは警告が生成されます。get_arr()
メソッドは配列値を返すため、この動作は非常に直感的ではありません。
厳密モードでこのエラーを回避するには、参照を使用しないようにメソッドのシグネチャを変更します。
function test_arr($a) {
var_dump($a);
}
署名を変更することはできないarray_shift
ため、中間変数を使用することもできます。
$inter = get_arr();
$el = array_shift($inter);
$instance->find()
変数への参照を返します。
この参照を最初に変数に格納せずに、関数の引数として使用しようとすると、レポートが取得されます。
これはメモリリークの防止に役立ち、次のPHPバージョンではおそらくエラーになります。
2番目のコードブロックは、次のように記述されている場合、エラーをスローします(&
関数シグネチャのに注意してください)。
function &get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
したがって、迅速な(そしてそれほど良くない)修正は次のようになります:
$el = array_shift($tmp = $instance->find(..));
基本的に、最初に一時変数に割り当てを行い、その変数を引数として送信します。
このコード:
$monthly_index = array_shift(unpack('H*', date('m/Y')));
次のように変更する必要があります。
$date_time = date('m/Y');
$unpack = unpack('H*', $date_time);
array_shift($unpack);
2 番目のスニペットも機能しません。それが理由です。
array_shift
引数を変更する修飾子関数です。したがって、そのパラメーターが参照であると想定され、変数ではないものを参照することはできません。ここで Rasmus の説明を参照してください:厳格な標準: 変数のみを参照渡しする必要があります