Все способы присваивания в языке PHP

Раздел: PHP -> Основы синтаксиса PHP

Операторы присваивания в PHP

Основной способ: оператор =

Оператор присваивания (=) используется для присвоения значения переменной. Левая часть содержит имя переменной, правая - выражение, результат которого будет присвоен. Значение копируется (для простых типов) или присваивается ссылка на объект (для объектов).

$name = 'Иван';
$age = 25;
$result = $age + 5;

В этом примере переменной $name присваивается строка, $age - число, $result - результат арифметической операции. После присваивания переменная $result будет равна 30.

Типичная ошибка:

путаница операторов = и == в условиях. Оператор = присваивает значение, а == сравнивает. Например, if ($count = 10) всегда истинно, так как присваивание возвращает присвоенное значение (10), которое приводится к true. Рекомендуется в условиях использовать === или ==.

Как сделать, чтобы две переменные ссылались на одну область памяти?

Используется ссылочное присваивание =&. Оно не копирует значение, а делает переменные ссылками на один и тот же участок памяти.

$a = 5;
$b =& $a;
$b = 10;
echo $a; // 10

Изменение $b меняет $a, так как обе переменные указывают на одно значение.

Проблема:

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

Как сократить присваивание с арифметической операцией?

Комбинированные операторы присваивания объединяют операцию и присваивание: +=, -=, *=, /=, %=, .= (для строк) и другие.

$x = 10;
$x += 5; // $x = $x + 5 → 15
$str = 'Hello';
$str .= ' World'; // $str = 'Hello World'

Цель: сделать код более лаконичным и читаемым.

Ошибка:

несоответствие типов. Например, $num += 'string' вызовет преобразование типов, что может привести к неожиданному результату.

Как присвоить элементы массива переменным в одну строку?

Используется конструкция list() или короткий синтаксис [] (доступен с PHP 7.1).

$info = ['John', 30, 'London'];
list($name, $age, $city) = $info;
// или
[$name, $age, $city] = $info;

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

[, $age] = $info; // пропущен первый элемент

Проблема:

конструкция list работает только с числовыми индексами, начиная с 0. Для ассоциативных массивов нужно использовать прямое обращение или деструктуризацию с ключами (с PHP 7.1):

['name' => $name, 'age' => $age] = $info;

Как присвоить значение, только если переменная равна null?

Null coalescing assignment (??=) с PHP 7.4. Присваивает значение, если переменная не определена или равна null.

$username = $_GET['user'] ?? 'guest';
// или в более короткой форме:
$username ??= 'guest';

Это удобно для установки значений по умолчанию.

Ошибка:

если переменная уже определена и не null, оператор не изменит её.

Как присвоить результат функции переменной?

Обычный оператор = принимает выражение, в том числе вызов функции.

$length = strlen('Hello'); // 5
$time = time();

Результат функции присваивается переменной.

Распространенный вопрос:

можно ли присвоить результат функции, возвращающей ссылку? Да, если функция возвращает ссылку (&), то присваивание по умолчанию создаст копию, если не использовать =&;.

Как присвоить одно значение нескольким переменным сразу?

Множественное присваивание выполняется цепочкой:

$a = $b = $c = 0;

Все три переменные получат значение 0. Это работает благодаря ассоциативности оператора справа налево.

Примечание:

для объектов такое присваивание делает все переменные ссылками на один объект, так как присваивание объекта копирует идентификатор.

Как присвоить значение в зависимости от условия?

Конструкция match возвращает значение, которое можно сразу присвоить (с PHP 8.0).

$status = match ($code) {
    200 => 'OK',
    404 => 'Not Found',
    default => 'Unknown'
};

Это альтернатива switch с присваиванием.

Особенность:

match требует строгого сравнения (===), в отличие от switch.

Расширенные примеры присваивания в PHP

Пример 1. Ссылочное присваивание и изменение массива

Пример
$arr = [1, 2, 3];
$ref =& $arr[0];
$ref = 100;
print_r($arr);
Array
(
    [0] => 100
    [1] => 2
    [2] => 3
)

Ссылка на элемент массива позволяет изменять его через другую переменную.

Пример 2. Комбинированные операторы с разными типами

Пример
$num = 15;
$num %= 4; // $num = 15 % 4 = 3
$text = 'PHP';
$text .= ' 8'; // 'PHP 8'
echo "$num, $text";
3, PHP 8

Операторы работают в соответствии с типами операндов.

Пример 3. Деструктуризация вложенного массива

Пример
$data = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob']
];
foreach ($data as ['id' => $id, 'name' => $name]) {
    echo "$id: $name\n";
}
1: Alice
2: Bob

Позволяет сразу извлекать значения из ассоциативных массивов внутри цикла.

Пример 4. Null coalescing assignment для массива с ключами

Пример
$config = ['host' => 'localhost'];
$config['port'] ??= 3306;
$config['host'] ??= 'default'; // не изменится, так как уже задан
print_r($config);
Array
(
    [host] => localhost
    [port] => 3306
)

Удобно при заполнении конфигурации значениями по умолчанию.

Пример 5. Цепочка присваивания с объектами

Пример
class User {
    public $name;
}
$user1 = new User();
$user1->name = 'Alice';
$user2 = $user1;
$user2->name = 'Bob';
echo $user1->name; // Bob
Bob

Объекты присваиваются по ссылке: $user2 указывает на тот же объект. Это особенность PHP, не требующая явного =&.

Пример 6. match с присваиванием и строковым результатом

Пример
$day = 3;
$dayName = match (true) {
    $day === 1 => 'Monday',
    $day === 2 => 'Tuesday',
    $day === 3 => 'Wednesday',
    default => 'Unknown'
};
echo $dayName;
Wednesday

match может использовать произвольные условия, присваивая результат.

Пример 7. Присваивание по ссылке при передаче аргумента

Пример
function addOne(&$value) {
    $value++;
}
$number = 10;
addOne($number);
echo $number; // 11
11

Использование ссылки в параметре функции изменяет исходную переменную.

Присваивание в PHP - comments

En
Assign php (php)