gpt4 book ai didi

php - 使用 __call() 在重载函数中使用引用

转载 作者:可可西里 更新时间:2023-10-31 22:46:00 25 4
gpt4 key购买 nike

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 中,这会引发 fatal error .

最佳答案

我设法找到了一个解决方案,尽管它是一个 hack。

您仍然可以将引用存储在数组中,并将数组作为参数传递,这将通过 __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() 引用的函数不是这种情况!

关于php - 使用 __call() 在重载函数中使用引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11311379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com