45 votes

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

109voto

Anthony Forloney Points 30083

Si A est une classe, vous pouvez y accéder directement par l'intermédiaire de la fonction A::$strName .

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

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

Mise à jour :

En fonction de ce que vous avez dans votre tableau, que ce soit ce que j'aime définir comme étant objets de la classe o classe littérale pourrait être un facteur. Je distingue ces deux termes par,

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

Si vous optez pour l'approche des littéraux de classe, alors l'utilisation d'un foreach avec PHP5.2.8, j'obtiens une erreur de syntaxe lors de l'utilisation de la fonction opérateur de résolution de la portée .

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

J'ai donc envisagé d'utiliser l'approche des objets de classe, mais la seule façon de produire la variable statique était d'utiliser une instance d'un objet et d'utiliser l'attribut self mot-clé comme ceci,

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 ensuite invoquer cette méthode lors de l'itération,

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

Et à ce moment-là, pourquoi déclarer la variable static du tout ? Cela va à l'encontre de l'idée même d'accéder à une variable sans avoir besoin d'instancier un objet.

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

10voto

HoLyVieR Points 5396

Si vous voulez une version fonctionnelle pour PHP5.2, vous pouvez utiliser réflexion 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

2voto

Brad F Jacobs Points 12725

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 vous essayez 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;

Ça devrait être réparé.

UPDATE

Si vous voulez itérer sur un tableau pour appeler une variable de classe :

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

Je ne sais pas pourquoi vous voulez ça, mais c'est comme ça. Et ceci a été testé, aucune erreur n'est apparue, la réponse valide de A is my name a été reçu.

EDIT

Apparemment, cela ne fonctionne que sous PHP 5.3.

0voto

KoolKabin Points 3645

J'ai trouvé la prochaine solution simple mais je ne sais pas si elle est bonne ou pas.

Ma solution est :

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

0voto

panjeh Points 56

À l'intérieur d'une classe, si vous souhaitez accéder à un membre statique de la classe, vous pouvez également utiliser la fonction statique: : au lieu de self: :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X