web-dev-qa-db-fra.com

Comment accéder aux membres statiques d'une classe?

J'essaie d'accéder à un membre statique d'une classe.

ma classe est:

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;

Je reçois une erreur lors de l'impression. Comment puis-je imprimer 'A est mon nom'

35
KoolKabin

Si A est une classe, vous pouvez y accéder directement via A::$strName.

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

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

Mettre à jour:

Selon ce que vous avez dans votre tableau, si ce que j'aime définir en tant qu'objets class ou en littéraux class peut être un facteur déterminant. Je distingue ces deux termes par,

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

Si vous choisissez l'approche des littéraux de classe, utilisez une boucle foreach avec PHP 5.28. Une erreur de syntaxe est générée lorsque vous utilisez l'opérateur de résolution scope .

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

Alors, j'ai pensé à utiliser l'approche des objets de classe, mais la seule façon de sortir la variable statique était d'utiliser une instance d'objet et d'utiliser le mot clé self comme suit:

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;
    }
}

Et puis invoquer cette méthode lors d'une itération,

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

Pourquoi à ce moment-là déclarer la variable static? Cela élimine toute l'idée d'accéder à une variable sans avoir besoin d'instancier un objet. 

En bref, une fois que nous avons plus d’informations sur ce que vous souhaitez faire, nous pouvons continuer et fournir de meilleures réponses.

90
Anthony Forloney

Si vous voulez une version de travail pour PHP 5.2, vous pouvez utiliser reflection pour accéder à la propriété statique d'une classe.

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

$lstClass = array('A');

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

Démo: http://ideone.com/HFJCW

10
HoLyVieR

Vous avez une erreur de syntaxe avec un point-virgule manquant et, comme il s'agit d'un tableau, vous devez accéder à l'index 0, sinon ce serait essayer d'appeler la classe '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;

Devrait le réparer.

METTRE À JOUR

Si vous voulez parcourir un tableau pour appeler une variable de classe:

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

Vous ne savez pas pourquoi vous voulez cela, mais voilà. Et cela a été testé, aucune erreur n'a été générée, une réponse valide de A is my name a été reçue.

MODIFIER

Apparemment, cela ne fonctionne que sous PHP 5.3 

2
Brad F Jacobs

À l'intérieur d'une classe et souhaitez accéder à un membre de données statique, vous pouvez également utiliser static :: Au lieu de self ::

1
panjeh

Je trouve ensuite une solution simple, mais je ne sais pas si elle est bonne ou non. 

Mon sol est:

eval('return '.$x[0].'::$strName;');
0
KoolKabin