Ответ 1
Означает ли это, что
$result
возвращается по ссылке, а не по значению?
Да.
Также, где этот синтаксис используется в практике?
Это более распространено в сценариях PHP 4, где по умолчанию объекты были переданы по значению.
Что означает &
перед именем функции?
Означает ли это, что $result
возвращается ссылкой, а не значением?
Если да, то это правильно? Насколько я помню, вы не можете вернуть ссылку на локальную переменную, поскольку она исчезает после выхода функции.
function &query($sql) {
// ...
$result = mysql_query($sql);
return $result;
}
Также, где этот синтаксис используется в практике?
Означает ли это, что
$result
возвращается по ссылке, а не по значению?
Да.
Также, где этот синтаксис используется в практике?
Это более распространено в сценариях PHP 4, где по умолчанию объекты были переданы по значению.
Чтобы ответить на вторую часть вашего вопроса, здесь место, где я должен был использовать его: Magic 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 выкинул бы ошибку, говоря что-то вроде "не может косвенно модифицировать перегруженное свойство".
Хорошо, это, вероятно, только хак, чтобы обойти некоторые maldesign в PHP, но он по-прежнему полезен.
Но, честно говоря, я не могу сейчас думать о другом примере. Но я уверен, что есть некоторые редкие случаи использования...
Означает ли это, что
$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 дает отличный пример того, когда это используется на практике.
<?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 change the value
$byref_initial = "world";
// Let get the value again and see
echo "Byref, new value: " . config_byref() . "\n"; // We still get "hello"
// However, lets make a small change:
// Weve 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 change the value
$byref_initial = "world";
// Let 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.