我试图从方法返回值作为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();
同样,我也看不出引用静态变量的正当理由。静态变量是在调用之间不改变值的变量。它基本上是一个包含在命名空间中的"全局"变量。您只需要从类外部进行读访问,根据封装原则,写应该在内部完成。不需要参考,真的…