函数名前的&
表示什么?
这是否意味着$result
是通过引用而不是通过值返回的?如果是,那么是正确的吗?在我的记忆中,你不能返回对局部变量的引用,因为一旦函数退出,它就消失了。
function &query($sql) {
// ...
$result = mysql_query($sql);
return $result;
}
另外,在practice中如何使用这种语法?
发布于 2010-07-15 20:38:13
这是否意味着
$result
是通过引用而不是值返回的?
是。
还可以在practice中的哪里使用这样的语法?
这在PHP 4脚本中更为普遍,在PHP 4脚本中,默认情况下对象是通过值传递的。
发布于 2010-07-15 20:58:25
为了回答你的问题的第二部分,这里有一个我不得不用到的地方:魔法getters!
class FooBar {
private $properties = array();
public function &__get($name) {
return $this->properties[$name];
}
public function __set($name, $value) {
$this->properties[$name] = $value;
}
}
如果我没有在那里使用&
,这是不可能的:
$foobar = new FooBar;
$foobar->subArray = array();
$foobar->subArray['FooBar'] = 'Hallo World!';
相反,PHP会抛出一个错误,比如“不能间接修改重载属性”。
好吧,这可能只是为了避免PHP中的一些错误设计,但它仍然很有用。
但老实说,我现在想不出另一个例子。但我敢打赌有一些罕见的用例。
发布于 2010-07-15 22:35:10
这是否意味着
$result
是通过引用而不是值返回的?
不是的。不同之处在于,它可以通过引用返回。例如:
<?php
function &a(&$c) {
return $c;
}
$c = 1;
$d = a($c);
$d++;
echo $c; //echoes 1, not 2!
要通过引用返回,您必须执行以下操作:
<?php
function &a(&$c) {
return $c;
}
$c = 1;
$d = &a($c);
$d++;
echo $c; //echoes 2
还可以在practice中的哪里使用这样的语法?
在实践中,只要您希望函数的调用者在不通知被调用者的情况下操作被调用者拥有的数据,就可以使用。这很少使用,因为它违反了封装-您可以将返回的引用设置为您想要的任何值;被调用者将无法验证它。
nikic给出了一个很好的例子,说明了这一点在实践中的应用。
https://stackoverflow.com/questions/3255516
复制相似问题