2012-07-14 3 views
6

Ejemplo:clase de Acceso a la propiedad a través constante no funciona

class LOL{ 
    const 
    FOO = 1; 
} 

$x = new LOL; 
$arr = array('x' => $x); 

echo $x::FOO; // works 
echo $arr['x']::FOO; // works too 

Pero si hago mi instancia de clase de una propiedad, no puede acceder a la constante más:

class WWW{ 
    protected $lol; 

    public function __construct($lol){ 
    $this->lol= $lol;  
    } 

    public function doSMth(){ 
    echo $this->lol::FOO; // fail. parse error.. wtf 
    } 
} 

$w = new WWW; 
$w->doSMth(); 

:(

Sé que puedo hacer echo LOL::FOO, pero ¿qué pasa si el nombre de clase es desconocido? Desde esa posición solo tengo acceso a ese objeto/propiedad, y realmente no quiero que la clase WWW esté "al tanto" de ot sus clases y sus nombres. Simplemente debería funcionar con el objeto dado

+0

prueba this $ w = new WWW (new LOL); ? – Gntem

+0

Pero si no se conoce el nombre de la clase, ¿cómo se puede saber que tiene 'const FOO' para empezar? (a menos que todas sus clases estén implementando alguna interfaz o ampliando alguna clase) –

+0

porque espera que esa constante esté presente: P – Alex

Respuesta

1

Si no se conoce el nombre de la clase, puede usar ReflectionClass para obtener la constante. Tenga en cuenta que debe usar PHP 5 o superior.

Ejemplo:

$c = new ReflectionClass($this->lol); 
echo $c->getConstant('FOO'); // 1 

A partir de PHP 5.3.0, se puede acceder a través de la constante de una variable que contiene el nombre de la clase:

$name = get_class($this->lol); 
echo $name::FOO; // 1 

Para obtener más información, consulte Scope Resolution Operator - PHP

2

Puede hacer esto mucho más fácil asignando la propiedad lol a una variable local, como por ejemplo:

public function doSMth(){ 
    $lol = $this->lol; 
    echo $lol::FOO; 
} 

Esto es tonto, pero evita tener que usar reflejos.

0
$lol = &$this->lol; 
echo $lol::FOO; 
.. 
unset($lol); 
+1

Bienvenido a SO. Agregar una breve explicación es habitual cuando agrega una respuesta. –

Cuestiones relacionadas