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

时间:2011-12-15 15:41:22

标签: php reference php-5.3

我试图在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,并根据存在多少个参数直接调用该方法。

3 个答案:

答案 0 :(得分:0)

这只是将$ test1分配给$ foobar(即5)

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

这只是用10

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

如果要更新Foo中的值,请使用

$f->foobar = 10;

答案 1 :(得分:0)

它是否已经在PHP 5.2.5中起作用:http://codepad.org/uMEIK210(注意10作为最终结果)?

我想,你希望看到10次。

为此($test2也是对类字段的引用),您需要在两边指定&function &bar()$test2 =& Foo::bar();

请参阅docs

  

注意:与参数传递不同,此处您必须在两个地方使用&amp; - 表示您希望按引用返回,而不是副本,并且表明应该为$ myValue完成引用绑定,而不是通常的赋值。

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

$test2 =& Foo::bar();

最后提示

Do not use PHP references

答案 2 :(得分:0)

首先,尝试声明函数static。呼叫也应该是正常呼叫。以&符号为前缀已经回答。

class Foo
{
    static $foobar = 5;

    public static function &bar()
    {
        return self::$foobar;
    }
}

电话:

$test1 =& Foo::bar();

另外,我看不出引用静态变量的正当理由。静态变量是一个不会在调用之间更改值的变量。它基本上是一个封装在命名空间中的“全局”变量。您只需要从类外部进行读访问,根据封装原则,写操作应在内部完成。不需要参考,真的..