Avatar ·

Справочник по синтаксису PHP: что означают эти символы? (PHP Syntax)

Привет, коллеги! Я начинающий PHP-разработчик и постоянно путаюсь в символах, которые используются в PHP. Например, я вижу в чужом коде `->`, `=>`, `::`, `@`, `...` (три точки), `??` (два вопроса) и `?:` (вопрос с двоеточием). Я понимаю, что это какие-то операторы или синтаксические конструкции, но каждый раз, когда встречаю их в коде, мне приходится лезть в документацию или гуглить. Это сильно замедляет разработку. У меня есть конкретный пример. Я пытаюсь написать простую функцию для проверки возраста пользователя и вывода сообщения. Вот что у меня получилось: ```php $user = new User(); $user->name = 'Иван'; $user->age = 25; if ($user->age >= 18) { echo $user->name . ' совершеннолетний'; } else { echo $user->name . ' несовершеннолетний'; } ``` Но более опытный коллега сказал, что это можно записать короче с помощью тернарного оператора и оператора объединения с null. Я попробовал сделать так: ```php echo $user->name ?? 'Гость' . ($user->age >= 18 ? ' совершеннолетний' : ' несовершеннолетний'); ``` Но у меня получилась каша, и я не понимаю, как правильно комбинировать эти символы. Можете ли вы составить полный справочник по всем основным символам PHP (особенно тем, которые я перечислил) с примерами? Очень хочется иметь под рукой шпаргалку, чтобы не отвлекаться на поиск каждый раз. Спасибо! <<>>

Полный справочник основных символов PHP

Давайте разберём все ключевые символы, которые вызывают путаницу у новичков. Ниже — подробные объяснения с примерами.

1. -> (стрелка) — Доступ к свойству/методу объекта

Используется для обращения к свойствам и методам объекта.

class User {
    public $name;
    public function sayHello() {
        return "Привет, я {$this->name}";
    }
}

$user = new User();
$user->name = 'Иван';       // установка свойства
echo $user->sayHello();      // вызов метода

2. => (двойная стрелка) — Ассоциативные массивы и foreach

Используется для задания ключа при создании массива, а также в цикле foreach для получения пары ключ->значение.

// Создание ассоциативного массива
$person = [
    'name' => 'Мария',
    'age'  => 30
];

// Перебор массива
foreach ($person as $key => $value) {
    echo "{$key}: {$value}<br>";
}

3. :: (двойное двоеточие) — Статический доступ (Scope Resolution Operator)

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

class MathHelper {
    const PI = 3.14;
    public static function square($x) {
        return $x * $x;
    }
}

echo MathHelper::PI;          // доступ к константе
echo MathHelper::square(5);   // вызов статического метода

// Внутри класса для вызова родительского метода
class Child extends Parent {
    public function method() {
        parent::method();      // вызов метода родителя
        $this->doSomething();
    }
}

4. @ (собака) — Подавление ошибок

Подавляет вывод ошибок для выражения, к которому применяется. Используйте с осторожностью — лучше обрабатывать ошибки явно.

// Без @ выдаст Warning, если файл не найден
$content = @file_get_contents('nonexistent.txt');

// Лучший способ — проверка
if (file_exists('file.txt')) {
    $content = file_get_contents('file.txt');
}

5. ... (три точки) — Spread-оператор (распаковка массивов) и Variadic-аргументы

В PHP 5.6+ — для функций с переменным числом аргументов. В PHP 7.4+ — для распаковки массивов.

// Variadic-аргументы: функция принимает любое количество параметров
function sum(...$numbers) {
    return array_sum($numbers);
}
echo sum(1, 2, 3, 4); // 10

// Распаковка массива (PHP 7.4+)
$arr1 = [1, 2, 3];
$arr2 = [0, ...$arr1, 4]; // [0, 1, 2, 3, 4]

6. ?? (два вопроса) — Оператор объединения с null (Null Coalescing Operator)

Возвращает левый операнд, если он не равен null, иначе правый. Появился в PHP 7.0.

$username = $_GET['user'] ?? 'Гость';
// Эквивалентно: $username = isset($_GET['user']) ? $_GET['user'] : 'Гость';

// Можно цепочкой
$value = $a ?? $b ?? $c ?? 'default';

7. ?: (вопрос с двоеточием) — Тернарный оператор (сокращённая форма)

Сокращённая форма тернарного оператора. $a ?: $b возвращает $a, если оно приводится к true, иначе $b.

$name = $input ?: 'Аноним';
// Эквивалентно: $name = $input ? $input : 'Аноним';

// Полный тернарный оператор
$status = ($age >= 18) ? 'взрослый' : 'ребёнок';

Исправляем ваш пример

Теперь применим знания к вашему коду. Проблема была в приоритете операторов и неправильном использовании ??.

// Правильный вариант
$user = new User();
$user->name = 'Иван';
$user->age = 25;

echo ($user->name ?? 'Гость') . 
     ($user->age >= 18 ? ' совершеннолетний' : ' несовершеннолетний');

Объяснение:

  • ($user->name ?? 'Гость') — если имя не установлено, подставится 'Гость'
  • Тернарный оператор ($user->age >= 18 ? ... : ...) выбирает правильное сообщение
  • Скобки обязательны для правильного порядка вычислений

Бонус: Другие полезные символы

  • ??= — оператор присваивания с null-объединением (PHP 7.4+): $a ??= $b; — присвоит $b, если $a равно null
  • -> с ... — именованные аргументы (PHP 8.0+): func(name: 'Иван', age: 25)
  • # — однострочный комментарий (стиль оболочки)
  • /* */ — многострочный комментарий

Надеюсь, эта шпаргалка поможет вам быстрее ориентироваться в коде!

<<>>

Альтернативный подход: акцент на приоритет операторов и отладку

Когда вы комбинируете несколько операторов в одной строке (как в вашем примере), очень важно понимать приоритет операторов. В PHP он такой (от высшего к низшему для рассмотренных символов):

  1. ->, :: — самый высокий приоритет
  2. @ — подавление ошибок
  3. ?? — null-объединение
  4. ?: — тернарный оператор
  5. . — конкатенация строк

Именно поэтому ваш первоначальный код работал неправильно: ?? выполнился раньше, чем конкатенация, и получилась каша. Всегда используйте круглые скобки, если сомневаетесь. Вот отладочная версия вашего кода, которая наглядно показывает, что происходит:

// Разобьём на этапы
$name = $user->name ?? 'Гость';
$ageStatus = $user->age >= 18 ? ' совершеннолетний' : ' несовершеннолетний';
$result = $name . $ageStatus;
echo $result; // Иван совершеннолетний

Ещё один совет: для сложных выражений лучше использовать многострочную запись с временными переменными — это повышает читаемость и упрощает отлад