函数名前的&
表示什么?
这是否意味着$result
是通过引用而不是按值返回的?
如果是,那么它是否正确?我记得你不能返回对局部变量的引用,因为一旦函数退出它就会消失。
function &query($sql) {
// ...
$result = mysql_query($sql);
return $result;
}
此处的语法在练习中使用了哪些?
答案 0 :(得分:8)
这是否意味着
$result
是通过引用而不是按值返回的?
是
此处的语法在练习中使用了哪些?
这在PHP 4脚本中更为普遍,默认情况下,对象按值传递。
答案 1 :(得分:7)
要回答你问题的第二部分,我必须在那里使用它:魔术吸气剂!
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中解决一些恶意设计的问题,但它仍然有用。
但老实说,我现在想不到另一个例子。但我敢打赌,有一些罕见的用例...
答案 2 :(得分:5)
这是否意味着
$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
此处的语法在练习中使用了哪些?
实际上,只要您希望函数的调用者在不告诉他的情况下操作被调用者拥有的数据,就可以使用它。这很少使用,因为它违反了封装 - 您可以将返回的引用设置为您想要的任何值;被调用者将无法验证它。
nikic提供了一个很好的例子,说明何时在实践中使用它。
答案 3 :(得分:0)
<?php
// You may have wondered how a PHP function defined as below behaves:
function &config_byref()
{
static $var = "hello";
return $var;
}
// the value we get is "hello"
$byref_initial = config_byref();
// let's change the value
$byref_initial = "world";
// Let's get the value again and see
echo "Byref, new value: " . config_byref() . "\n"; // We still get "hello"
// However, let’s make a small change:
// We’ve added an ampersand to the function call as well. In this case, the function returns "world", which is the new value.
// the value we get is "hello"
$byref_initial = &config_byref();
// let's change the value
$byref_initial = "world";
// Let's get the value again and see
echo "Byref, new value: " . config_byref() . "\n"; // We now get "world"
// If you define the function without the ampersand, like follows:
// function config_byref()
// {
// static $var = "hello";
// return $var;
// }
// Then both the test cases that we had previously would return "hello", regardless of whether you put ampersand in the function call or not.