在PHP中返回一个带有变量参数列表的方法作为引用


Return a method with variable list of arguments as reference in PHP

我试图从方法返回值作为PHP5.3中的引用。我可能以完全错误的方式进行,但我正在将一个旧项目与一些较新的5.3+功能结合起来。

下面是一个例子来解释发生了什么:

class Foo
{
    static $foobar = 5;
    function &bar()
    {
        return self::$foobar;
    }
}
// Doesn't work
//$test1 = &call_user_func_array(array("Foo","bar"),array());
// Doesn't work
//$test1 = &call_user_func_array("Foo::bar",array());
// Doesn't work
//$f = new Foo; $test1 = &call_user_func_array(array($f,"bar"),array());
// WORKS
//$test1 = &Foo::bar();
//Doesn't work
//$function = "Foo::bar";
//$test1 = &$function();
// WORKS
$f = new Foo; $test1 = &$f->bar();
$test2 = Foo::bar();
var_dump($test1);
var_dump($test2);
$test1 = 10;
echo "----------<br />";
var_dump($test1);
var_dump($test2);
var_dump(Foo::bar()); //returns 10 when working, 5 when not working

最后一个Foo::bar()应该返回一个10,因为当一切工作时,$test1应该是对Foo::$foobar的引用。

我意识到这个例子还使用了一些时髦的遗留PHP调用Foo::bar和方法bar()没有被指定为静态,但仍然能够通过::调用

任何帮助都将非常感激,因为到目前为止我唯一的修复方法就是在参数列表上设置一个switch,并根据存在的参数数量直接调用该方法。

这只是将$test1赋值给$foobar的值(即5)

$test1 = &$f->bar();

这只是用10

覆盖$test1中包含的值
$test1 = 10;

如果你想更新Foo中的值,使用

$f->foobar = 10;

它不是已经在PHP 5.2.5: http://codepad.org/uMEIK210(注意10作为最终结果)中工作了吗?

我猜,你想把10看三遍。

对于这个($test2也是对class字段的引用),你需要在两边指定&:function &bar()$test2 =& Foo::bar();

查看文档:

注意:与参数传递不同,这里必须在两个地方都使用&—表明您希望通过引用返回,而不是副本,并表明应该对$myValue进行引用绑定,而不是通常的赋值。

所以你只需要编辑一行来得到(可能)想要的3 × 10:

$test2 =& Foo::bar();

最后提示

不要使用PHP引用

首先,尝试将函数声明为静态。而且电话应该是正常的。以&作为已回答的前缀。

class Foo
{
    static $foobar = 5;
    public static function &bar()
    {
        return self::$foobar;
    }
}

调用:

$test1 =& Foo::bar();

同样,我也看不出引用静态变量的正当理由。静态变量是在调用之间不改变值的变量。它基本上是一个包含在命名空间中的"全局"变量。您只需要从类外部进行读访问,根据封装原则,写应该在内部完成。不需要参考,真的…