T_PAAMAYIM_NEKUDOTAYIM: qué es y cómo solucionarlo

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Te topaste con el misterioso error T_PAAMAYIM_NEKUDOTAYIM? ¡No entres en pánico!

\n\n

Si alguna vez has programado en PHP y te ha aparecido un mensaje de error como PHP Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM), sabes lo desconcertante que puede ser. Sobre todo cuando estás empezando a aprender el lenguaje y te encuentras con una palabra tan críptica. En realidad, detrás de este nombre tan largo se esconde algo sencillo: el operador de resolución de ámbito (Paamayim Nekudotayim significa "doble dos puntos" en hebreo).

\n\n

En este tutorial, analizaremos por qué ocurre este error, cómo solucionarlo y cómo evitarlo en el futuro. Este artículo está basado en una pregunta real de Stack Overflow que ha acumulado miles de visitas, lo que demuestra que es un problema muy común.

\n\n

¿Qué es T_PAAMAYIM_NEKUDOTAYIM?

\n\n

En PHP existe un operador especial :: (doble dos puntos). Se utiliza para acceder a propiedades estáticas, métodos y constantes de una clase. Ejemplo:

\n\n
<?php\nclass MyClass {\n    public static $value = 42;\n    const PI = 3.14;\n    \n    public static function hello() {\n        return "¡Hola desde un método estático!";\n    }\n}\n\n// Uso correcto de ::\necho MyClass::$value;  // Muestra 42\necho MyClass::PI;      // Muestra 3.14\necho MyClass::hello(); // Muestra "¡Hola desde un método estático!"\n?>\n
\n\n

Todo es sencillo, hasta que rompes la sintaxis. El error T_PAAMAYIM_NEKUDOTAYIM ocurre cuando PHP se encuentra con :: en un contexto inesperado o cuando lo que está antes no es una clase, sino otra cosa (por ejemplo, una variable).

\n\n

Las 5 causas más comunes del error

\n\n

Veamos los escenarios típicos que provocan este error. Cada caso lo acompañaremos con un ejemplo de código y su solución.

\n\n

1. Usar :: con un objeto en lugar de con la clase

\n\n

El error más frecuente entre principiantes es intentar llamar a un método estático a través de un objeto usando :: en lugar de ->.

\n\n

Incorrecto:

\n
<?php\nclass Calculator {\n    public static function add($a, $b) {\n        return $a + $b;\n    }\n}\n\n$calc = new Calculator();\necho $calc::add(5, 3); // ¡Error! PHP espera T_PAAMAYIM_NEKUDOTAYIM\n?>\n
\n\n

Correcto:

\n
<?php\necho Calculator::add(5, 3); // Llamada a través de la clase\n// O si el método no es estático:\n// echo $calc->add(5, 3);\n?>\n
\n\n

Recuerda la regla: para métodos y propiedades estáticas usa :: con el nombre de la clase; para los normales, usa -> con el objeto.

\n\n

2. Clase faltante o nombre de clase incorrecto

\n\n

A veces escribes ::, pero PHP no encuentra la clase porque no la declaraste o te equivocaste en el nombre.

\n\n

Ejemplo de error:

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

Cómo solucionarlo:

\n
    \n
  • Verifica que la clase esté declarada (o incluida mediante require/include).
  • \n
  • Asegúrate de que el nombre de la clase esté escrito sin errores.
  • \n
  • Si la clase está en otro archivo, comprueba la ruta del archivo.
  • \n
\n\n

3. Usar :: con una variable que no contiene una clase

\n\n

Puede ocurrir que intentes acceder a un método estático a través de una variable, pero esta no contiene una cadena con el nombre de la clase, sino otro tipo de dato.

\n\n

Código problemático:

\n
<?php\nclass Logger {\n    public static function log($msg) {\n        echo "[LOG] $msg";\n    }\n}\n\n$className = 123; // Esto es un número, no una cadena con el nombre de la clase\n$className::log("Prueba"); // ¡Error!\n?>\n
\n\n

Solución: siempre verifica que la variable contenga un nombre de clase válido (una cadena de texto).

\n\n
<?php\n$className = 'Logger';\n                

Blogs

Book Recommendations