1

Laravelフレームワーク、より具体的な-フォームマクロを操作しているときに、奇妙なエラーに遭遇しました。

最初は、Laravelに何か問題があると思いましたが、その後、すべてをコンテキストから外しました。

<?php

// placeholder function that takes variable as reference
$function = function(&$reference)
{
    // append to variable
    $reference = $reference . ':' . __METHOD__;
};

// test with straight call
$variable = 'something';
$function($variable);
echo $variable;


// test with call_user_func(), that gets called in Laravels case
$variable = 'something'; // reset
call_user_func($function, $variable);
echo $variable;

の最初の呼び出し$functionは正しく実行されますが、2回目の試行でcall_user_func()は、(Codepadからの抜粋)が生成されます。

Warning: Parameter 1 to {closure}() expected to be a reference, value given
PHP Warning: Parameter 1 to {closure}() expected to be a reference, value given

フィドル:Codepad @ Viper-7

これを書いている間、私はここでフィドルについて考えcall_user_func_array()ましたが、同じエラーが発生します。

参照について何か問題がありますか、それともこれはPHPのバグですか?

4

4 に答える 4

8

技術的には。のバグですが、これをPHPのバグと呼びますcall_user_func。ドキュメントにはこれが記載されていますが、おそらく非常に啓発的な方法ではありません。

call_user_func()のパラメータは参照によって渡されないことに注意してください。

の引数call_user_func()は参照によって渡されないと言う方がおそらく明確でしょう(ただし、技術的には何も言う必要はありません。この情報は関数のシグネチャにも埋め込まれていることに注意してください)。

いずれにせよ、これは、call_user_func最終的にターゲットの呼び出し可能オブジェクトを呼び出すときに、ZVAL渡される引数の(すべてのタイプの値のPHPエンジン内部データ構造)が「参照であること」としてマークされないことを意味します。クロージャは実行時にこれをチェックし、その署名が引数が参照でなければならないことを示しているため、文句を言います。

PHP <5.4.0では、参照による呼び出し時パスを使用することでこれを回避できます。

 call_user_func($function, &$variable);

ただし、E_DEPRECATED参照による呼び出し時のパスは非推奨の機能であるため、これにより警告が生成されます。この機能は完全に削除されているため、PHP5.4では致命的なエラーが発生します。

結論:call_user_funcこの方法で使用する良い方法はありません。

于 2012-10-11T12:37:13.690 に答える
3

これは機能します:

call_user_func_array($function, array(&$variable));
于 2012-10-12T01:33:21.997 に答える
2

このコードを使用しました

<?php
$myfunction = function &($arg=3)
{
    $arg = $arg * 2;
    return $arg;
};
echo $myfunction();
?>

チャームのように働いた。:)

于 2013-02-13T03:23:47.823 に答える
1

これを行うとどうなりますか?

call_user_func($function, &$variable);
于 2012-10-11T12:39:23.257 に答える