Для чего нужен амперсанд (&) в PHP?

Ответ

В PHP амперсанд (&) — это оператор, который работает со ссылками. Он позволяет двум или более переменным указывать на одну и ту же область памяти.

Основные применения:

  1. Передача аргументов в функцию по ссылке: Без амперсанда функция работает с копией значения. С амперсандом — напрямую с оригинальной переменной.

    function addPrefix(&$string) {
        $string = 'Mr. ' . $string;
    }
    
    $name = 'Smith';
    addPrefix($name); // Передаем $name по ссылке
    echo $name; // Вывод: Mr. Smith (оригинальная переменная изменена)
  2. Возврат ссылки из функции: Позволяет функции возвращать не значение, а ссылку на переменную.

    class Config {
        private $settings = [];
    
        public function &getValueRef($key) {
            return $this->settings[$key];
        }
    }
    
    $config = new Config();
    $ref = &$config->getValueRef('timeout');
    $ref = 30; // Это изменит значение непосредственно в $settings['timeout']
  3. Создание ссылки между переменными:

    $original = 100;
    $reference = &$original; // $reference теперь псевдоним для $original
    $reference = 200;
    echo $original; // Вывод: 200

Важно понимать:

  • В современном PHP (начиная с версии 5+) объекты всегда передаются по ссылке по умолчанию, поэтому явное использование & для объектов обычно избыточно.
  • Чрезмерное использование ссылок может усложнить чтение кода и отслеживание побочных эффектов, поэтому их применяют осознанно, в основном для оптимизации работы с большими массивами или в специфических паттернах.

Ответ 18+ 🔞

Слушай, я тут вспомнил, как один мой знакомый, тот ещё распиздяй, пытался в PHP разобраться и на амперсанд наткнулся. Ну и охуел, конечно. Говорит: "Что за значок, как будто хуй с винтом?" А это, ёпта, просто ссылка, всё гениальное — просто.

Вот смотри, чтобы не быть таким же мудем, запомни главное: этот самый & — он как твой пьяный кореш, который всегда указывает на одну и ту же бутылку. Две переменные могут смотреть на одну ячейку памяти, и если одну пнуть, вторая тоже ойкнет.

Где эта хитрая жопа применяется:

  1. Передача в функцию по ссылке. Без амперсанда функция работает с ксерокопией, а с ним — лезет прямо в оригинал, как сосед в твой холодильник. Смотри, как просто:

    function addPrefix(&$string) {
        $string = 'Mr. ' . $string;
    }
    
    $name = 'Smith';
    addPrefix($name); // Суём $name прямо по ссылке
    echo $name; // Вывод: Mr. Smith (оригинал уже навечно испорчен)

    Без & после функции $name так и остался бы 'Smith', а тут — всё, приехали, переименовали.

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

    class Config {
        private $settings = [];
    
        public function &getValueRef($key) {
            return $this->settings[$key];
        }
    }
    
    $config = new Config();
    $ref = &$config->getValueRef('timeout');
    $ref = 30; // И эта хуйня прямиком в приватный массив $settings влезет и поменяет его

    Удобно, но доверия ебать ноль, если не понимаешь, что делаешь.

  3. Просто связать две переменные. Самый простой способ запутать себя и всех вокруг на два месяца вперёд.

    $original = 100;
    $reference = &$original; // Теперь $reference — это не переменная, а кличка для $original
    $reference = 200;
    echo $original; // Вывод: 200. Сам от себя охуел? Ага.

А теперь главное, чтобы не облажаться:

  • В современных версиях PHP объекты уже сами по себе передаются как ссылки. Не надо тыкать & перед объектом — это как пришить хуй к пальто, бесполезно и выглядит идиотски.
  • Злоупотреблять этим — верный путь к коду, который через полгода будешь читать и думать: "Какого хуя тут происходит?". Используй только когда реально надо, например, чтобы не копировать овердохуища данных в памяти. А так — да похуй, работай с копиями, спокойнее спать будешь.