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 中,我使用了 & 语法$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 回答