Що означає запускати функцію 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); ? Напевно, я не впевнений у нюансі тут, хоч дякую за допомогу.
Алекс Макп

2
Так - я б просто так називав.
Домінік Роджер

16

Як вже згадувалося, це повернення посилання. У PHP 4 об'єкти були призначені за значенням, як і будь-яке інше значення. Це вкрай неінтуїтивно і суперечить тому, як працює більшість інших мов.

Щоб вирішити проблему, були використані посилання на змінні, які вказували на об'єкти. У PHP 5 посилання дуже рідко використовуються. Я здогадуюсь, що це застарілий код або код, який намагається зберегти зворотну сумісність з PHP 4.


Це офіційна бібліотека PHP Facebook, FWIW.
Алекс Макп

4
@ Алекс: У цьому випадку вони, ймовірно, роблять це для захисту випадкових хакерів, які використовують php4, від них. Не слід робити це у власному коді - це застаріле.
troelskn

3
"Це вкрай неінтуїтивно і всупереч тому, як працює більшість інших мов" Я більше не могла погодитися.
Гонки легкості на орбіті

5
@WildlyInaccurate: Призначення об'єктів за посиланням за замовчуванням, що відбувається в .NET та Java (я думаю), є дуже неінтуїтивним. У більшості інших мов присвоєння виконується копією, чи є у вас "об'єкт", чи примітив, чи будь-що інше, і оскільки це було ще з світанку часу, саме це повинно було дотримуватися світ.
Гонки легкості на орбіті

4
Чи є щось інтуїтивним, мабуть, досить суб'єктивним. Але для мов, які інакше схожі на PHP, норма - передавати об'єкти за посиланням. Стосовно OOP, я б сказав, що це найбільш інтуїтивно зрозумілий спосіб, оскільки OOP - це інкапсуляція стану, тому програми зазвичай посилаються на цей стан, а не клонують його.
troelskn

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.