T_PAAMAYIM_NEKUDOTAYIM: что это и как исправить

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

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

Начать курс

Столкнулись с таинственной ошибкой T_PAAMAYIM_NEKUDOTAYIM? Не паникуйте!

Если вы когда-нибудь писали на PHP и видели сообщение об ошибке вроде PHP Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM), то знаете, как это может сбить с толку. Особенно когда вы только начинаете изучать язык, а тут какое-то загадочное слово на иврите. На самом деле, за этим длинным названием скрывается простая вещь — оператор разрешения области видимости (Paamayim Nekudotayim на иврите означает "двойное двоеточие").

В этом туториале мы разберём, почему возникает эта ошибка, как её исправить, и как избежать в будущем. Статья основана на реальном вопросе с Stack Overflow, который собрал тысячи просмотров — значит, проблема действительно популярная.

Что такое T_PAAMAYIM_NEKUDOTAYIM?

В PHP есть специальный оператор :: (двойное двоеточие). Он используется для доступа к статическим свойствам, методам и константам класса. Пример:

<?php
class MyClass {
    public static $value = 42;
    const PI = 3.14;
    
    public static function hello() {
        return "Привет из статического метода!";
    }
}

// Правильное использование ::
echo MyClass::$value;  // Выведет 42
echo MyClass::PI;      // Выведет 3.14
echo MyClass::hello(); // Выведет "Привет из статического метода!"
?>

Всё просто, пока вы не нарушаете синтаксис. Ошибка T_PAAMAYIM_NEKUDOTAYIM возникает, когда PHP встречает :: в неожиданном контексте или когда перед ним стоит не класс, а что-то другое (например, переменная).

5 самых частых причин ошибки

Давайте разберём типичные сценарии, которые приводят к этой ошибке. Каждый случай мы подкрепим примером кода и способом исправления.

1. Использование :: с объектом вместо класса

Самая распространённая ошибка новичков — попытка вызвать статический метод через объект, используя :: вместо ->.

Неправильно:

<?php
class Calculator {
    public static function add($a, $b) {
        return $a + $b;
    }
}

$calc = new Calculator();
echo $calc::add(5, 3); // Ошибка! PHP ожидает T_PAAMAYIM_NEKUDOTAYIM
?>

Правильно:

<?php
echo Calculator::add(5, 3); // Вызов через класс
// Или если метод не статический:
// echo $calc->add(5, 3);
?>

Запомните правило: для статических методов и свойств используйте :: с именем класса, для обычных — -> с объектом.

2. Пропущен class или неправильное имя класса

Иногда вы пишете ::, но PHP не может найти класс, потому что вы его не объявили или опечатались в имени.

Пример ошибки:

<?php
echo SomeClass::doSomething(); // Fatal error: Class 'SomeClass' not found
?>

Как исправить:

  • Проверьте, что класс объявлен (или подключён через require/include).
  • Убедитесь, что имя класса написано без ошибок.
  • Если класс в другом файле, проверьте путь к файлу.

3. Использование :: с переменной, которая не содержит класс

Бывает, что вы пытаетесь обратиться к статическому методу через переменную, но она содержит не строку с именем класса, а что-то другое.

Проблемный код:

<?php
class Logger {
    public static function log($msg) {
        echo "[LOG] $msg";
    }
}

$className = 123; // Это число, а не строка с именем класса
$className::log("Тест"); // Ошибка!
?>

Решение: всегда проверяйте, что переменная содержит корректное имя класса (строку).

<?php
$className = 'Logger';
if (class_exists($className)) {
    $className::log("Тест");
} else {
    echo "Класс не найден";
}
?>

4. Синтаксическая ошибка в выражении перед ::

Иногда ошибка возникает из-за того, что перед :: стоит не то, что ожидает PHP. Например, вы забыли скобку или написали лишний символ.

Пример:

<?php
class Math {
    const PI = 3.14159;
}

echo Math::PI(); // Ошибка! PHP думает, что PI — это метод, но это константа
?>

Константы вызываются без круглых скобок. Правильно: echo Math::PI;.

Ещё один хитрый случай — когда вы пытаетесь использовать :: после закрывающей скобки функции:

<?php
function getClassName() {
    return 'MyClass';
}

echo getClassName()::SOME_CONST; // Ошибка в старых версиях PHP
?>

В PHP 7+ это работает, но в PHP 5.х — нет. Если вы пишете для старых версий, сохраните результат в переменную:

<?php
$class = getClassName();
echo $class::SOME_CONST;
?>

5. Использование :: в неправильном контексте (вне класса)

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

Неправильно:

<?php
$value = 42;
echo $value::class; // Ошибка! $value — не объект и не класс
?>

Для проверки типа переменной используйте gettype() или var_dump(), а не ::class.

Как отлаживать ошибку T_PAAMAYIM_NEKUDOTAYIM?

Когда вы видите это сообщение, следуйте простому алгоритму:

  1. Посмотрите на номер строки в сообщении об ошибке. PHP всегда указывает, где произошёл сбой.
  2. Проверьте, что стоит перед ::. Это должно быть имя класса (строка) или переменная, содержащая имя класса.
  3. Убедитесь, что метод или свойство существуют и объявлены как public (или protected/private, если вы внутри

Блоги

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