Подтвердить что ты не робот

Вернуться по ссылке в PHP

Я попробовал Google, попробовал PHP-документацию, искал Qaru для ответа, но не нашел ничего удовлетворительного. Я читал книгу, в которой автор использовал функцию "Возвращение по ссылке", но никогда не объяснял, что это такое. Код, используемый автором

function &getSchool() {
    return $this->school;
}

Может кто-нибудь объяснить простыми словами с примером об этой концепции.

4b9b3361

Ответ 1

Предположим, что у вас есть этот класс:

class Fruit {
    private $color = "red";

    public function getColor() {
        return $this->color;
    }

    public function &getColorByRef() {
        return $this->color;
    }
} 

Класс имеет частное свойство и два метода, которые позволяют вам получить к нему доступ. Один возвращает значение (поведение по умолчанию), а другое - по ссылке. Разница между ними заключается в следующем:

  • При использовании первого метода вы можете внести изменения в возвращаемое значение, и эти изменения не будут отображаться внутри частного свойства Fruit, потому что вы на самом деле изменяете копию значения свойства.
  • При использовании второго метода вы фактически возвращаете псевдоним для Fruit::$color - другое имя, по которому вы ссылаетесь на одну и ту же переменную. Поэтому, если вы что-то делаете с ним (включая изменение его содержимого), вы фактически выполняете одно и то же действие по значению свойства.

Вот какой код для его проверки:

echo "\nTEST RUN 1:\n\n";
$fruit = new Fruit;
$color = $fruit->getColor();
echo "Fruit color is $color\n"; 
$color = "green"; // does nothing, but bear with me
$color = $fruit->getColor();
echo "Fruit color is $color\n"; 

echo "\nTEST RUN 2:\n\n";
$fruit = new Fruit;
$color = &$fruit->getColorByRef(); // also need to put & here
echo "Fruit color is $color\n"; 
$color = "green"; // now this changes the actual property of $fruit
$color = $fruit->getColor();
echo "Fruit color is $color\n"; 

Посмотрите на действие.

Предупреждение: Я чувствую себя обязанным упомянуть, что ссылки, хотя у них есть законное использование, являются одной из тех функций, которые должны использоваться только редко, и только если вы сначала тщательно рассмотрели какие-либо альтернативы. Менее опытные программисты склонны чрезмерно использовать ссылки, потому что видят, что они могут помочь им решить определенную проблему, не заметив при этом недостатки использования ссылок (как расширенная функция, ее нюансы далеко не очевидны).

Ответ 2

Простое правило: если вы помещаете & перед именем функции в PHP, вы можете использовать &, когда вы вызываете функцию (то есть возвращаете значение), как если бы она была переменная, а не функция.

Что это.


Легче думать об этом как о "PHP, позволяющем ссылаться на возвращаемое значение", а не на PHP, возвращающемся по ссылке. Как упоминалось выше, вы просто размещаете &, чтобы сообщить PHP, что вы этого хотите, если вы его не поместите и попробуйте сделать $var =& somefunction(), вы получите сообщение об ошибке "Только переменные должны быть назначены по ссылке".

Чтобы устранить некоторую путаницу с ответом Джона. На самом деле нет необходимости иметь две отдельные функции, возвращаемые по ссылке, и одну возвращаемую по значению; вне какой-либо конвенции по проекту. & позволяет ему возвращаться по ссылке, он не заставляет его возвращаться по ссылке.

например. та же функция, которая используется как для ссылочных, так и для неосновных присвоений

\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

Ссылки велики, однако, если вы не знакомы с ними, соблюдайте следующие правила:

  • рассмотрим только использование ссылок, если вы имеете дело с крупными массивами или аналогичными структурами, не относящимися к объектам.
  • никогда не ссылается на объект (если его можно избежать)
  • позволяет только функции передавать по ссылке, если значение поддерживается в статическом свойстве или атрибуте объекта (т.е. это не временная переменная внутри функции)

Исключения, очевидно, будут очень утилитарными (т.е. когда вы действительно хотите поделиться значением, чтобы упростить код для его манипулирования).

Опять же, НИКОГДА НЕОБХОДИМЫЕ ОБЪЕКТЫ (это бессмысленно!)

Ответ 3

Пример, который вы опубликовали, вероятно, с PHP4 или ранее. Больше нет необходимости возвращать объекты по ссылке, поскольку они почти всегда выполняются таким образом автоматически в PHP5 +.

Возвращение по ссылке полезно, если вы хотите использовать функцию для найдите, к какой переменной следует привязать ссылку. Не используй обратная ссылка для увеличения производительности. Двигатель будет автоматически оптимизировать это самостоятельно. Верните ссылки только тогда, когда у вас есть веская техническая причина для этого.

Смотрите вернуть ссылки в документах PHP