Возврат по ссылке в PHP

Я попробовал Googling, попробовал документацию PHP, искал стек переполнения для ответа, но не мог найти ничего удовлетворительного. Я читал книгу, в которой автор использовал возврат по ссылке, но никогда не объяснил, что это такое. Код, используемый автором

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

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

25
задан Dharman 14 July 2019 в 19:05
поделиться

2 ответа

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

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's color is $color\n"; 
$color = "green"; // does nothing, but bear with me
$color = $fruit->getColor();
echo "Fruit's color is $color\n"; 

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

См. Это в действии .

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

34
ответ дан 28 November 2019 в 20:44
поделиться

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

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

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

.
3
ответ дан 28 November 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: