我试图在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
,并根据存在多少个参数直接调用该方法。
答案 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();
答案 2 :(得分:0)
首先,尝试声明函数static。呼叫也应该是正常呼叫。以&符号为前缀已经回答。
class Foo
{
static $foobar = 5;
public static function &bar()
{
return self::$foobar;
}
}
电话:
$test1 =& Foo::bar();
另外,我看不出引用静态变量的正当理由。静态变量是一个不会在调用之间更改值的变量。它基本上是一个封装在命名空间中的“全局”变量。您只需要从类外部进行读访问,根据封装原则,写操作应在内部完成。不需要参考,真的..