$el = array_shift($instance->find(..))
上記のコードはどういうわけか厳格な標準の警告を報告していますが、これは報告しません:
function get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
それで、とにかくいつ警告を報告しますか?
$el = array_shift($instance->find(..))
上記のコードはどういうわけか厳格な標準の警告を報告していますが、これは報告しません:
function get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
それで、とにかくいつ警告を報告しますか?
get_arr()
関数)は厳密な標準通知(テスト済みのPHP5.2およびPHP5.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()
メソッドが配列値を返すため、この動作は非常に直感的ではありません。
strictモードでこのエラーを回避するには、メソッドのシグネチャを変更して、参照を使用しないようにします。
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バージョンではおそらくエラーになります。
2番目のコードブロックは、次のように記述した場合にエラーをスローします(&
関数シグネチャのに注意してください)。
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()
マニュアルのプロトタイプに示されていますが」、その関数の拡張定義に続く注意文書はなく、パラメータが実際に参照によって渡されるという明確な説明もありません。
おそらくこれは/ understanded /です。しかし、理解できなかったため、エラーの原因を特定することが困難でした。
コードを再現する:
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);
2番目のスニペットも機能しないためです。
array_shift
は、引数を変更する修飾子関数です。したがって、パラメータが参照であることが期待され、変数ではないものを参照することはできません。ここでRasmusの説明を参照してください:厳格な基準:変数のみを参照で渡す必要があります
そうですね、そのような明らかなケースでは、関数の前に「@」を使用することで、いつでもPHPにメッセージを抑制するように指示できます。
$monthly_index = @array_shift(unpack('H*', date('m/Y')));
すべてを抑制することは、最良のプログラミング手法の1つではない可能性がありますこの方法でエラーが、特定の場合(このような場合)には便利で許容範囲内です。
結果として、あなたの友人の「システム管理者」は、汚染が少ないことに満足すると確信していますerror.log
。