81
$el = array_shift($instance->find(..))

上記のコードはどういうわけか厳格な標準の警告を報告しますが、これはそうではありません:

function get_arr(){
    return array(1, 2);
}
$el = array_shift(get_arr());

とにかく、いつ警告を報告しますか?

4

6 に答える 6

93

次のコードを検討してください。

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);
于 2010-03-01T09:14:24.443 に答える
7

$instance->find()変数への参照を返します。

この参照を最初に変数に格納せずに、関数の引数として使用しようとすると、レポートが取得されます。

これはメモリリークの防止に役立ち、次のPHPバージョンではおそらくエラーになります。

2番目のコードブロックは、次のように記述されている場合、エラーをスローします(&関数シグネチャのに注意してください)。

function &get_arr(){
    return array(1, 2);
}
$el = array_shift(get_arr());

したがって、迅速な(そしてそれほど良くない)修正は次のようになります:

$el = array_shift($tmp = $instance->find(..));

基本的に、最初に一時変数に割り当てを行い、その変数を引数として送信します。

于 2010-03-01T09:00:28.453 に答える
3

このコード:

$monthly_index = array_shift(unpack('H*', date('m/Y')));

次のように変更する必要があります。

$date_time = date('m/Y');
$unpack = unpack('H*', $date_time);
array_shift($unpack);
于 2016-03-07T21:36:53.517 に答える
3

2 番目のスニペットも機能しません。それが理由です。

array_shift引数を変更する修飾子関数です。したがって、そのパラメーターが参照であると想定され、変数ではないものを参照することはできません。ここで Rasmus の説明を参照してください:厳格な標準: 変数のみを参照渡しする必要があります

于 2010-03-01T09:24:10.083 に答える