Что значит запускать функцию PHP с амперсанда?

129

Я использую библиотеку Facebook с таким кодом:

class FacebookRestClient {
...
    public function &users_hasAppPermission($ext_perm, $uid=null) {
        return $this->call_method('facebook.users.hasAppPermission', 
        array('ext_perm' => $ext_perm, 'uid' => $uid));
    }
...
}

Что означает символ & в начале определения функции и как мне использовать такую ​​библиотеку (в простом примере)

Алекс Макп
источник

Ответы:

157

Амперсанд перед именем функции означает, что функция вернет ссылку на переменную вместо значения.

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

См. « Возврат ссылок» .

Доминик Роджер
источник
1
Итак, не вдаваясь в подробности, вы должны вызвать (с созданием экземпляра класса) что-то вроде $ results = $ facebook-> users_hasAppPermission ($ param1, $ param2); ? Думаю, я не уверен в нюансах здесь, но спасибо за помощь.
Alex Mcp
2
Ага - я бы просто так это назвал.
Доминик Роджер
16

Как уже упоминалось, он возвращает ссылку. В PHP 4 объекты присваивались по значению, как и любое другое значение. Это очень неинтуитивно и противоречит тому, как работает большинство других языков.

Чтобы обойти проблему, ссылки использовались для переменных, указывающих на объекты. В PHP 5 ссылки используются очень редко. Я предполагаю, что это устаревший код или код, пытающийся сохранить обратную совместимость с PHP 4.

troelskn
источник
Это официальная PHP-библиотека Facebook, FWIW.
Alex Mcp 04
4
@Alex: В этом случае они, вероятно, делают это, чтобы защитить случайных хакеров, которые используют php4, от самих себя. Вы не должны делать этого в своем собственном коде - он устарел.
troelskn
3
«Это очень неинтуитивно и противоречит тому, как работает большинство других языков». Я не мог не согласиться.
Гонки за легкостью на орбите
5
@WildlyInaccurate: Назначение объектов по ссылке по умолчанию, что происходит в .NET и Java (я думаю), крайне неинтуитивно. В большинстве других языков присваивание выполняется путем копирования, независимо от того, есть ли у вас «объект», примитив или что-то еще, и, поскольку так было с незапамятных времен, это то, к чему мир должен был привязаться.
Гонки легкости на орбите
4
Является ли что-то интуитивным, скорее всего, довольно субъективным. Но для языков, которые в остальном похожи на PHP, обычно объекты передаются по ссылке. Что касается ООП, я бы сказал, что это наиболее интуитивно понятный способ, поскольку ООП инкапсулирует состояние, поэтому программы обычно ссылаются на это состояние, а не на его клонирование.
troelskn 05
4

Это часто известно в PHP как возврат по ссылке или возврат по ссылке .

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

Документация PHP по возвращаемому справочнику

Ссылки в PHP это просто другое название , присвоенное содержание переменной. Ссылки PHP не похожи на указатели в программировании на C , они не являются фактическими адресами памяти, поэтому их нельзя использовать для арифметики указателей.

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

$populationCount = 120;

function &getPopulationCount() {
  global $populationCount;
  return $populationCount;
}

$countryPopulation =& getPopulationCount();
$countryPopulation++;
echo "\$populationCount = $populationCount\n"; // Output: $populationCount = 121 
echo "\$countryPopulation = $countryPopulation\n"; //Output: $countryPopulation = 121 

Функция, getPopulationCount()определенная с предыдущим &, возвращает ссылку на содержимое или значение $populationCount. Итак, увеличивая $countryPopulation, также увеличивается $populationCount.

Элиша Сено
источник