用“&”号启动PHP函数意味着什么?


129

我正在使用Facebook库,其中包含以下代码:

class FacebookRestClient {
...
    public function &users_hasAppPermission($ext_perm, $uid=null) {
        return $this->call_method('facebook.users.hasAppPermission', 
        array('ext_perm' => $ext_perm, 'uid' => $uid));
    }
...
}

函数定义开头的&是什么意思,以及如何使用这样的库(在一个简单的示例中)

Answers:


157

函数名称前的与号表示函数将返回对变量的引用,而不是值。

当您要使用函数查找引用应绑定到哪个变量时,按引用返回很有用。不要使用引用返回来提高性能。引擎将自动自动对此进行优化。仅在有充分的技术理由时才返回引用。

请参阅返回参考


1
因此,无需太详细,您将调用(实例化了类)类似$ results = $ facebook-> users_hasAppPermission($ param1,$ param2); ?我想我不确定这里的细微差别,不过感谢您的帮助。
Alex Mcp

2
是的-我会这样称呼它。
多米尼克·罗杰

16

如前所述,它正在返回参考。在PHP 4中,对象是按值分配的,就像其他任何值一样。这是非常不直观的,与大多数其他语言的工作方式相反。

为了解决这个问题,引用被用于指向对象的变量。在PHP 5中,很少使用引用。我猜这是遗留代码或试图保持与PHP 4向后兼容性的代码。


这是官方的Facebook PHP库FWIW。
亚历克斯麦普

4
@Alex:在这种情况下,他们可能正在这样做是为了保护使用php4的临时黑客免受他们的攻击。您不应该在自己的代码中执行此操作-已过时。
troelskn

3
“这是非常不直观的,并且与大多数其他语言的工作方式背道而驰。”我完全同意。
在轨道进行轻度比赛

5
@WildlyInaccurate:默认情况下,通过引用分配对象(这在.NET和Java中(我认为))非常不直观。在大多数其他语言中,赋值是通过复制完成的,无论您是否拥有“对象”或原始图元或其他任何东西,并且自从时间开始以来就是这种情况,这就是世界应该坚持的目标。
Lightness Races in Orbit

4
某些事物是否直观可能很主观。但是对于与PHP相似的语言,规范是通过引用传递对象。关于OOP,我想说这是最直观的方法,因为OOP是关于封装状态的,所以程序通常会引用该状态,而不是克隆它。
troelskn

4

在PHP中,这通常称为返回参考按参考返回

当您要使用函数查找引用应绑定到哪个变量时,按引用返回很有用。不要使用引用返回来提高性能。引擎将自动自动对此进行优化。仅在有充分的技术理由时才返回引用。

PHP文档返回参考

PHP中的引用只是分配给变量内容的另一个名称。PHP引用与C编程中的指针不同,它们不是实际的内存地址,因此不能用于指针算术。

返回引用的概念尤其会使初学者感到困惑,因此举个例子将很有帮助。

$populationCount = 120;

function &getPopulationCount() {
  global $populationCount;
  return $populationCount;
}

$countryPopulation =& getPopulationCount();
$countryPopulation++;
echo "\$populationCount = $populationCount\n"; // Output: $populationCount = 121 
echo "\$countryPopulation = $countryPopulation\n"; //Output: $countryPopulation = 121 

getPopulationCount()用前面定义的函数&返回对的内容或值的引用$populationCount。因此,递增$countryPopulation,也递增$populationCount

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.