2011-03-27 26 views
15

El manual de PHP diceAcceso PHP Clase Constantes

Como miembros estáticos, los valores constantes no se puede acceder desde una instancia del objeto.

lo que explica por qué no se puede hacer esto

$this->inst = new Classname(); 
echo $this->inst::someconstant; 

pero entonces ¿por qué este trabajo?

$this->inst = new Classname(); 
$inst = $this->inst; 
echo $inst::someconstant; 
+0

'$ inst :: someconstant' es válido * * sintaxis, pero es lo que realmente funciona? – deceze

+0

En mis pruebas lo hace. – pettazz

Respuesta

17

Desde el shell interactivo PHP:

php > class Foo { const A = 'a!'; } 
php > class Bar { public $foo; } 
php > $f = new Foo; 
php > $b = new Bar; 
php > $b->foo = $f; 
php > echo $b->foo::A; 
PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM, expecting ',' or ';' in php shell code on line 1 

La razón por la que la sintaxis anterior falla es que el intérprete PHP no sabe cómo resolver el doble de colon después de la referencia de la propiedad. Si esto es intencional o no es desconocido.

Este último sintaxis funciona porque no está pasando por la propiedad directamente, sino a través de una variable local, que el analizador acepta como algo que puede trabajar con:

php > $inst = $b->foo; 
php > echo $inst::A; 
a! 

(Por cierto, esta misma restricción está en su lugar para funciones anónimas como propiedades. No puedes llamarlas directamente usando parens, primero debes asignarlas a otra variable y luego llamarlas desde allí. Esto se ha corregido en el tronco de PHP, pero no sé si también arreglaron la sintaxis de dos puntos).

+0

Entonces, ¿realmente podría reducirse a un error en el analizador php que se solucionará en versiones posteriores? – pettazz

+1

Es una descuido o una decisión intencional. No estoy seguro de que lo llamaría un error. Los internos de PHP tienden a pensar que las personas se confunden fácilmente, por lo que intentan no dejar pasar la sintaxis "ambigua". El doble colon también se usa para referirse a métodos estáticos; un método estático invocado en una instancia de una clase sería completamente absurdo. Dicho esto, si fueran a restringir * ese * comportamiento, sería un error en tiempo de ejecución, no un error * parse *. – Charles

7

Para citar el manual:

A partir de PHP 5.3.0, es posible hacer referencia a la clase utilizando una variable. El valor de la variable no puede ser una palabra clave (por ejemplo, self, principal y estático).

Se va a utilizar este ejemplo:

$class = new MyClass(); 
echo $class::constant."\n"; // As of PHP 5.3.0 

Así $inst::someconstant se supone que funciona.

En cuanto a por qué $this->inst::someconstant da un error de análisis, no sé. PHP es divertido sobre algunas cosas.

0

php apoya acceder constantes de clase de una instancia de objeto. Código de abajo está trabajando (comprobado en phpv5.5.5):

<?php 
class superheroes{ 
    const kal_el = 'Superman'; 
} 

$instance = new superheroes; 
echo $instance::kal_el; 

Fuente: http://dwellupper.io/post/48/defining-class-constants-in-php

Cuestiones relacionadas