4
class a
{
    public function f(&$ref1, &$ref2)
    {
        $ref1 = 'foo';
        $ref2 = 'bar';
    }
}

class b
{
    public function __call($methodName, $arguments)
    {
        $a = new a();
        call_user_func_array(array(
            $a, $methodName
        ), $arguments);
    }
}

$ref1 = 'X';
$ref2 = 'Y';
$b = new b();
$b->f($ref1, $ref2);
var_dump($ref1, $ref2);

これにより、次の結果が得られます。

PHP Warning:  Parameter 1 to a::f() expected to be a reference, value given in /home/jon/sync_workspace/bugsync/tests/test.php on line 18
PHP Stack trace:
PHP   1. {main}() /test.php:0
PHP   2. b->f() /test.php:23
PHP   3. b->__call() /test.php:23
PHP   4. call_user_func_array() /test.php:17
string(1) "X"
string(1) "Y"

PHP 5.4 で上記を達成するにはどうすればよいですか (参照を使用して ref1 と ref2 を操作します)。

PHP 5.3 では & 構文 at を使用しましたが$b->f(&$ref1, &$ref2);(非推奨ですが)、PHP5.4 では致命的なエラーがスローされます。

4

2 に答える 2

6

ハックですが、解決策を見つけることができました。

引き続き参照を配列に格納し、その配列を引数として渡すことができます。これは __call() を通じて存続します。

class b
{
    public function __call($methodName, $arguments)
    {
        $a = new a();
        call_user_func_array(array(
            $a, $methodName
        ), reset($arguments));
    }
}
$ref1 = 'X';
$ref2 = 'Y';
$b = new b();
$b->f(array(&$ref1, &$ref2));

PHP マニュアルの状態:関数定義だけで、参照によって引数を正しく渡すことができます。(http://php.net/manual/en/language.references.pass.php) これは明らかに __call() 参照関数には当てはまりません!

于 2012-07-03T13:28:15.430 に答える
0

私はそれを取り戻します。これ、参照の配列を使用して実際に可能です。私が使用した完全なコードは次のとおりです。

class b
{
    public function __call($methodName, $arguments)
    {
        $a = new a();
        call_user_func_array(array(
            $a, $methodName
        ), $arguments[0]);
    }
}
$ref1 = 'X';
$ref2 = 'Y';
$b = new b();
$b->f( array( &$ref1, &$ref2));
var_dump($ref1, $ref2);

これは出力します

string(3) "foo"
string(3) "bar"

予想どおり、警告や通知はありません。

于 2012-07-03T13:28:52.617 に答える