¿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'
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.
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
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
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::
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;');
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