2009-12-27 31 views
53

T_PAAMAYIM_NEKUDOTAYIM suena muy exótico, pero definitivamente absolutamente absurdo para mí. He seguido todo abajo de estas líneas de código:¿Qué significa esto? "Error de parse: error de sintaxis, T_PAAMAYIM_NEKUDOTAYIM inesperado"

<?php 
Class Context { 
    protected $config; 

    public function getConfig($key) { // Here's the problem somewhere... 
    $cnf = $this->config; 
    return $cnf::getConfig($key); 
    } 

    function __construct() { 
    $this->config = new Config(); 
    } 
} 
?> 

En el constructor se crea un objeto de configuración. Aquí está la clase:

final class Config { 
    private static $instance = NULL; 
    private static $config; 

    public static function getConfig($key) { 
    return self::$config[$key]; 
    } 

    public static function getInstance() { 
    if (!self::$instance) { 
     self::$instance = new Config(); 
    } 
    return self::$instance; 
    } 

    private function __construct() { 
    // include configuration file 
    include __ROOT_INCLUDE_PATH . '/sys/config/config.php'; // defines a $config array 
    $this->config = $config; 
    } 
} 

Ni idea de por qué esto no funciona/lo que significa el error ...

+0

posible duplicado de [PHP espera T \ _PAAMAYIM \ _NEKUDOTAYIM?] (Http://stackoverflow.com/questions/592322/php-expect-t-paamayim-nekudotayim) –

Respuesta

61

T_PAAMAYIM_NEKUDOTAYIM es la resolución de doble alcance de colon cosita PHP usa - ::

rápido vistazo a su código, creo que esta línea:

return $cnf::getConfig($key); 

debería ser

return $cnf->getConfig($key); 

La primera es la forma de llamar a un método estáticamente: este código sería válido si $ cnf contuviera una cadena que también fuera una clase válida. La sintaxis -> es para invocar un método en una instancia de una clase/objeto.

+0

Esto suena como una razón casi perfecta para * nunca * contemplar el uso de PHP. Seguramente no habría sido tan difícil producir un mensaje de error decente? – paxdiablo

+11

Es hebreo, porque Zend Engine fue desarrollado inicialmente por Andi Gutmans y Zeev Suraski, que son de Israel (ver http://en.wikipedia.org/wiki/Zend_Engine) –

+16

De la Wikipedia: "En PHP, la resolución del alcance el operador también se llama Paamayim Nekudotayim (en hebreo: פעמיים נקודתיים, pronunciado [paʔamajim nəkudotajim]), que significa "dos puntos" o "dos puntos" en hebreo "-> Frente al hecho de que el 99,9% de todos los desarrolladores no hablo hebreo muy bien, debo comprometerme: me encanta Objective-C. Y ahora sé por qué. – openfrog

2

El error se ha reducido a un "uso inadecuado" del operador de dos puntos dobles:

return $cnf::getConfig($key); 

como mediante el uso de la :: que está intentando llamar a un método estático de la clase misma. En su ejemplo, desea llamar a un método no estático en un objeto instanciado.

Creo que lo que desea es:

return $cnf->getConfig($key); 
+0

La respuesta de @ benlumley anterior lo expresó mucho mejor :) – richsage

2

:: En su ejemplo

return $cnf::getConfig($key) 

probablemente debería ser:

return $cnf->getConfig($key) 

Y hacer getConfig no estáticos

10

Sólo mis dos centavos para los futuros visitantes que tienen este problema.

Ésta es la sintaxis correcta para PHP 5.3, por ejemplo, si se llama método estático del nombre de la clase:

MyClassName::getConfig($key); 

Si anteriormente asigna el nombre de clase a la variable $ CNF, se puede llamar al método estático de ella (estamos hablando de PHP 5.3):

$cnf = MyClassName; 
$cnf::getConfig($key); 

Sin embargo, esta sintaxis no funciona en PHP 5.2 o menos, y hay que utilizar el siguiente:

$cnf = MyClassName; 
call_user_func(array($cnf, "getConfig", $key, ...otherposibleadditionalparameters...)); 

Esperanza esto ayuda a las personas que tienen este error en la versión 5.2 (no sé si esta era la versión de openfrog).

1

si todavía necesita usar el doble de colon luego asegurarse de que su en PHP 5.3+

+3

tenga en cuenta [la respuesta de tomasofen] (http://stackoverflow.com/a/17333414/499214) ya lo está diciendo. ¿Tal vez le gustaría votarlo en lugar de publicar su propio conocimiento y fragmentarlo? –

Cuestiones relacionadas