Справочник символов PHP: что означают ->, ::, @ и другие?

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Справочник символов PHP: от -> до ... — что они на самом деле значат?

Вы когда-нибудь смотрели на чужой PHP-код и чувствовали себя так, будто читаете древние иероглифы? Стрелки, двоеточия, странные знаки вопроса — всё это может напугать даже опытного разработчика. На самом деле за каждым символом стоит простая и логичная концепция.

Мы подготовили для вас полный справочник символов PHP, который превратит «магические знаки» в понятные инструменты. Этот гайд основан на популярнейшем вопросе с Stack Overflow и адаптирован специально для читателей pythonlib.ru. Погнали!

1. Стрелка -> (Оператор доступа к объекту)

Самый частый «иероглиф» в объектно-ориентированном PHP. Стрелка означает «возьми свойство или метод этого объекта».

class Cat {
    public $name = 'Мурка';
    public function meow() {
        return 'Мяу!';
    }
}

$cat = new Cat();
echo $cat->name;   // Мурка
echo $cat->meow(); // Мяу!

Запомните: левее стрелки всегда объект ($cat), правее — его свойство или метод без знака $.

2. Двойное двоеточие :: (Оператор разрешения области видимости)

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

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

echo MathHelper::PI;        // 3.14
echo MathHelper::square(5); // 25

Когда видите ::, мысленно подставляйте «статический» или «константа». Это ключ к пониманию.

2.1 Специальный случай: parent::

class Animal {
    protected function sound() {
        return '...';
    }
}

class Dog extends Animal {
    public function sound() {
        return parent::sound() . ' Гав!';
    }
}

3. Знак @ (Оператор подавления ошибок)

Один из самых спорных символов. @ перед выражением подавляет все ошибки, которые могут возникнуть при его выполнении.

$result = @file_get_contents('http://example.com');
// Если сайт недоступен, ошибка не выводится

Важно: не злоупотребляйте @! Это усложняет отладку. Используйте только когда действительно ожидаете ошибку и готовы её обработать.

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

Появился в PHP 7.0 и моментально стал любимчиком разработчиков. Он проверяет, существует ли переменная и не равна ли она null.

$username = $_GET['user'] ?? 'Гость';
// Если $_GET['user'] не задан, присваивается 'Гость'

// Старый способ:
$username = isset($_GET['user']) ? $_GET['user'] : 'Гость';

Работает цепочкой: $a ?? $b ?? $c — возьмёт первое НЕ null значение.

5. ?-> (Nullsafe Operator / Безопасный доступ к объекту)

Новинка из PHP 8.0. Позволяет «безопасно» обращаться к методам и свойствам объекта, который может быть null.

class User {
    public function getAddress() {
        return new Address();
    }
}

// Если пользователь не авторизован — $user = null
$city = $user?->getAddress()?->city;
// Вместо громоздкой проверки:
// if ($user && $user->getAddress()) { ... }

6. ... (Spread Operator / Оператор распаковки)

Три точки «разворачивают» массив или итерируемый объект. Очень удобно для передачи аргументов в функцию или объединения массивов.

function sum(...$numbers) {
    return array_sum($numbers);
}

echo sum(1, 2, 3, 4); // 10

// Распаковка массива при передаче:
$nums = [1, 2, 3];
echo sum(...$nums); // 6

// Объединение массивов:
$arr1 = [1, 2];
$arr2 = [3, 4];
$merged = [...$arr1, ...$arr2]; // [1, 2, 3, 4]

7. <=> (Spaceship Operator / Космический корабль)

Сравнивает два выражения и возвращает:

  • -1, если левое меньше
  • 0, если равны
  • 1, если левое больше
echo 1 <=> 2; // -1
echo 2 <=> 2; // 0
echo 3 <=> 2; // 1

// Идеально для сортировки:
$array = [3, 1, 2];
usort($array, fn($a, $b) => $a <=> $b);

8. === и !== (Операторы идентичности)

Тройной знак равенства проверяет не только значение, но и тип данных. Это защита от «магии» приведения типов.

var_dump(0 == false);  // true (приведение типов)
var_dump(0 === false); // false (разные типы)

var_dump('42' == 42);  // true
var_dump('42' === 42); // false

Золотое правило: в 99% случаев используйте ===, а не ==.

9. ...$variable (Named Arguments / Именованные аргументы)

С PHP 8.0 можно передавать аргументы по имени, а не по порядку. Синтаксис с троеточием позволяет «распаковать» ассоциативный массив в именованные аргументы.

function createUser($name, $email, $role = 'user') {
    return "{$name} ({$email}) - {$role}";
}

$params = ['name' => 'Иван', 'email' => 'ivan@mail.ru', 'role' => 'admin'];
echo createUser(...$params); // Иван (ivan@mail.ru) - admin

10. ->name() без присваивания (Fluent Interface / Текучий интерфейс)

Когда методы возвращают $this, можно выстраивать цепочки вызовов через ->:

class QueryBuilder {
    private $query = '';

    public function select($fields) {
        $this->query .= "SELECT {$fields} ";
        return $this;
    }

    public function from($table) {
        $this->query .= "FROM {$table} ";
        return $this;
    }

    public function get() {
        return $this->query;
    }
}

$sql = (new QueryBuilder())
    ->select('name, email')
    ->from('users')
    ->get();

echo $sql; // SELECT name, email FROM users

Часто задаваемые вопросы (FAQ)

Почему в PHP так много символов?

PHP развивается с

Блоги

Рекомендаций по книгам