wake-up-neo.com

Wie kann ich auf ein statisches Member einer Klasse zugreifen?

Ich versuche, auf ein statisches Member einer Klasse zuzugreifen.

meine Klasse ist:

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;

Beim Drucken wird ein Fehler angezeigt. Wie kann ich drucken 'A ist mein Name'

35
KoolKabin

Wenn A eine Klasse ist, können Sie direkt über A::$strName darauf zugreifen.

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

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

Aktualisieren:

Abhängig davon, was Sie in Ihrem Array haben, kann es ein Faktor sein, ob es sich dabei um class-Objekte oder class-Literale handelt. Ich unterscheide diese beiden Begriffe durch

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

Wenn Sie den Klassenliterals-Ansatz wählen, wird bei Verwendung einer foreach-Schleife mit PHP5.2.8 ein Syntaxfehler angezeigt, wenn Sie den scope resolution-Operator verwenden.

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

Also habe ich über die Verwendung des Klassenobjektansatzes nachgedacht, aber die einzige Möglichkeit, die statische Variable tatsächlich auszugeben, war mit einer Instanz eines Objekts und mit dem self-Schlüsselwort wie folgt:

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

Und dann diese Methode aufrufen, wenn Sie iterieren,

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

Warum deklarieren Sie an dieser Stelle überhaupt die Variable static? Es widerspricht der ganzen Idee, auf eine Variable zuzugreifen, ohne ein Objekt instanziieren zu müssen. 

Kurz gesagt, sobald wir mehr Informationen darüber haben, was Sie gerne tun würden, können wir fortfahren und bessere Antworten geben.

90

Wenn Sie eine funktionierende Version für PHP5.2 benötigen, können Sie mit reflection auf die statische Eigenschaft einer Klasse zugreifen.

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

10
HoLyVieR

Sie haben einen Syntaxfehler mit fehlendem Semikolon. Da es sich um ein Array handelt, müssen Sie auf den Index 0 zugreifen. Andernfalls wird versucht, die Klasse 'Array' aufzurufen.

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;

Sollte es beheben.

UPDATE

Wenn Sie ein Array zum Aufruf einer Klassenvariablen durchlaufen möchten:

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

Nicht sicher, warum du das willst, aber da gehst du hin. Und dies wurde getestet, es wurden keine Fehler ausgegeben, eine gültige Antwort von A is my name wurde empfangen.

EDIT

Anscheinend funktioniert das nur unter PHP 5.3 

2
Brad F Jacobs

Innerhalb einer Klasse können Sie auch auf ein statisches Datenelement zugreifen, indem Sie static :: Anstelle von self :: verwenden.

1
panjeh

Ich finde die nächste einfache Lösung, weiß aber nicht, ob sie gut ist oder nicht. 

Meine Lösung ist:

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