¿Cómo puedo acceder a un miembro estático de una clase?


Estoy intentando acceder a un miembro estático de una clase.

Mi clase es:

class A
{
    public static $strName = 'A is my name'
    public function xyz()
    {
        ..
    }
    ..
}
//Since I have bunch of classes stored in an array
$x = array('A');
echo $x::$strName;

Estoy recibiendo un error al imprimir. ¿Cómo puedo imprimir 'A es mi nombre'

Author: Adrian Cid Almaguer, 2010-09-29

5 answers

Si A es una clase, puede acceder a ella directamente a través de A::$strName.

class A {
    public static $strName = 'A is my name';
}

echo A::$strName; // outputs "A is my name"

Actualización:

Dependiendo de lo que tenga dentro de su matriz, si es lo que me gusta definir como objetos de clase o literales de clase podría ser un factor. Yo distingo estos dos términos por,

$objClasses = array(new A(), new B()); // class objects
$myClasses = array('A','B');           // class literals

Si vas al enfoque de literales de clase, entonces usando un bucle foreach con PHP5. 2. 8 Se me da un error de sintaxis al usar la resolución de alcance operador.

foreach ($myClasses as $class) {
     echo $class::$strName;
  //syntax error, unexpected '::', expecting ',' or ';'
}

Entonces pensé en usar el enfoque de objetos de clase, pero la única manera en que podía generar la variable estática era con una instancia de un objeto y usando la palabra clave self así,

class A {
    public static $strName = 'A is my name';

    function getStatic() {
        return self::$strName;
    }
}

class B {
    public static $strName = 'B is my name';

    function getStatic() {
        return self::$strName;
    }
}

Y luego invocar ese método al iterar,

foreach($objClasses as $obj) {
    echo $obj->getStatic();
}

Que en ese momento por qué declarar la variable static en absoluto? Derrota toda la idea de acceder a una variable sin la necesidad de instanciar un objeto.

En resumen, una vez que tenemos más información sobre lo que le gustaría hacer, entonces podemos continuar y proporcionar mejores respuestas.

 85
Author: Anthony Forloney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-29 03:25:16

Si desea una versión de trabajo para PHP5.2, puede usar reflection para acceder a la propiedad estática de una clase.

class A {
    static $strName= '123';
}

$lstClass = array('A');

foreach ($lstClass as $value) {
    $c = new ReflectionClass($value);
    echo $c->getStaticPropertyValue('strName');
}

Demo: http://ideone.com/HFJCW

 9
Author: HoLyVieR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-29 03:49:48

Tiene un error de sintaxis con punto y coma faltante y porque es un array necesita acceder al índice de 0, o de lo contrario estaría tratando de llamar a la clase 'Array'.

class A
{
    public static $strName = 'A is my name';

    public function xyz()
    {
        // left blank and removed syntax error
    }
}
$x = array('A');
echo $x[0]::$strName;

Debería arreglarlo.

UPDATE

Si desea iterar sobre una matriz para llamar a una variable de clase:

$x = array('A', 'B');
foreach ($x as $class) {
     echo $class::$strName;
}

No estoy seguro de por qué querrías eso, pero ahí lo tienes. Y esto ha sido probado, no se arrojaron errores, respuesta válida de A is my name fue recibir.

EDITAR

Aparentemente esto solo funciona bajo PHP 5.3

 2
Author: Brad F Jacobs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-29 02:42:23

Desde dentro de una clase y desea acceder a un miembro de datos estáticos propio también puede usar estática:: en lugar de auto::

 1
Author: panjeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-02 00:55:58

Encuentro la siguiente solución simple, pero no sé si es buena o no.

Mi soln es:

eval('return '.$x[0].'::$strName;');
 0
Author: KoolKabin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-29 08:57:52