Простое правило : если вы поместите &
перед именем функции в PHP, вы можете использовать &
при вызове функции (т.е. это возвращаемое значение), как если бы она была переменная, а не функция.
Вот и все.
Проще думать, что это «PHP, позволяющий вам ссылаться на возвращаемое значение», а не PHP, возвращаемый по ссылке. Как упоминалось выше, вы просто помещаете &
, чтобы сообщить PHP, что вы этого хотите, если вы не разместите его и попытаетесь выполнить команду $var =& somefunction()
, вы получите ошибку «Только переменные должны быть назначены по ссылке».
Чтобы устранить путаницу с ответом Джона. На самом деле нет необходимости иметь две отдельные функции, одна из которых возвращается по ссылке, а другая - по значению; вне какой-то конвенции проекта. &
only позволяет ему возвращаться по ссылке, не заставляет возвращаться по ссылке.
например. одна и та же функция, используемая для справочных и нереферентных присвоений
\header('content-type: text/plain');
class Demo
{
protected $example = 'original value';
function & example()
{
return $this->example;
}
}
$demo = new Demo;
#1 - pass by value
$var1 = $demo->example();
$var1 = 'var1 value';
echo '$demo->example() => '.$demo->example().PHP_EOL;
echo PHP_EOL;
#2 - pass by reference
$var2 =& $demo->example();
$var2 = 'var2 value';
echo '$demo->example() => '.$demo->example().PHP_EOL;
echo '$var1 => '.$var1.PHP_EOL;
echo '$var2 => '.$var2.PHP_EOL;
echo PHP_EOL;
#3 - altering other references
$var3 =& $demo->example();
$var3 = 'var3 value';
echo '$demo->example() => '.$demo->example().PHP_EOL;
echo '$var1 => '.$var1.PHP_EOL;
echo '$var2 => '.$var2.PHP_EOL;
echo '$var3 => '.$var3.PHP_EOL;
echo PHP_EOL;
exit;
выход
$demo->example() => original value
$demo->example() => var2 value
$var1 => var1 value
$var2 => var2 value
$demo->example() => var3 value
$var1 => var1 value
$var2 => var3 value
$var3 => var3 value
Ссылки являются отличными, однако, если вы не знакомы с ними, пожалуйста, следуйте следующим правилам:
- рассмотрите возможность использования ссылок, только если вы имеете дело с большим массивом или подобными необъектными структурами данных
- никогда не ссылаться на объект (если вы можете избежать его)
- разрешает передачу функции только по ссылке, если значение поддерживается в статическом свойстве или атрибуте объекта (т. Е. Это не временная переменная внутри функции)
Исключения, очевидно, будут очень утилитарными (например, когда вы на самом деле хотите поделиться значением для упрощения кода для его манипулирования).
Опять же, НИКОГДА НЕ ОБРАЩАЕТСЯ К ОБЪЕКТАМ (это бессмысленно!)