Передача по ссылке

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

<?php
function foo(&$var)
{
    $var++;
}

$a = 5;
foo($a);
print $a; // В этом месте переменная $a указывает на значение 6

Замечание: В вызове функции отсутствует знак ссылки — знак указывают только в определении функции. Определения функции достаточно, чтобы правильно передать аргумент по ссылке.

По ссылке разрешается передавать:

  • Переменные: foo($a)
  • Ссылки, которые возвращаются функциями:

    <?php
    
    function foo(&$var)
    {
        $var++;
        print $var;
    }
    
    function &bar()
    {
        $a = 5;
        return $a;
    }
    
    foo(bar());
    Подробнее об этом рассказывает раздел о возврате по ссылке.

Другие выражения не передают по ссылке, поскольку результат будет неопределённым. Следующие примеры передачи по ссылке неправильные:

<?php

function foo(&$var)
{
    return $var++;
}

// Обратите внимание, перед названием функции отсутствует знак &
function bar()
{
    $a = 5;
    return $a;
}

foo(bar()); // Выдаёт предупреждение

foo($a = 5); // Выражение, а не переменная
foo(5); // Константа, а не переменная

class Foobar {}

foo(new Foobar()); // Вызывает уведомление с PHP 7.0.7
                  // Notice: Only variables should be passed by reference