52 Stimmen

Wie greife ich auf statische Elemente einer Klasse zu?

Ich versuche, auf statische Elemente 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;

Ich erhalte einen Fehler beim Drucken. Wie kann ich drucken A ist mein Name

0 Stimmen

Ich denke, Sie wollen eine Instanz der Klasse A in das Array nicht das Zeichen 'A' (die nicht ein statisches Mitglied namens strName) haben

0 Stimmen

Gut ich habe eine Liste der Klasse in einem Array, die ich durchlaufen müssen

0 Stimmen

Der Aufruf eines statischen Mitglieds über eine Methode ist besser als die Reflexion gewählt worden.

118voto

Anthony Forloney Punkte 87227

Si A eine Klasse ist, können Sie direkt auf sie zugreifen über A::$strName .

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

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

Aktualisierung:

Je nachdem, was Sie in Ihrem Array haben, ob es das ist, was ich gerne als Klassenobjekte o Klasse Literale könnte ein Faktor sein. Ich unterscheide diese beiden Begriffe durch,

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

Wenn Sie den Ansatz der Klassenliterale wählen, dann verwenden Sie eine foreach Schleife mit PHP5.2.8 erhalte ich einen Syntaxfehler, wenn ich die Umfangsauflösungsoperator .

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

So dann dachte ich über die Verwendung der Klasse Objekte Ansatz, aber der einzige Weg, ich könnte tatsächlich die statische Variable war mit einer Instanz eines Objekts und mit der 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 rufen Sie diese Methode dann bei der Iteration auf,

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

Warum wird dann die Variable static überhaupt? Damit wird die ganze Idee des Zugriffs auf eine Variable zunichte gemacht, ohne dass ein Objekt instanziert werden muss.

Kurz gesagt, sobald wir mehr Informationen darüber haben, was Sie tun möchten, können wir Ihnen bessere Antworten geben.

0 Stimmen

Nun habe ich eine Liste der Klasse in einem Array, die ich zu durchlaufen haben, so müssen Sie mit Array zugreifen

0 Stimmen

Ich verstehe nicht ganz, was Sie damit bezwecken wollen.

0 Stimmen

Sieht richtig aus. Siehe php.net/manual/de/language.oop5.static.php . Das ist es, woran ich mich zu erinnern versuchte.

10voto

HoLyVieR Punkte 10735

Wenn Sie eine funktionierende Version für PHP5.2 wollen, können Sie Reflexion um auf die statische Eigenschaft einer Klasse zuzugreifen.

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

2voto

Jim Punkte 18298

Sie haben einen Syntaxfehler mit fehlendem Semikolon und da es sich um ein Array handelt, müssen Sie auf den Index 0 zugreifen, da sonst versucht würde, 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 das Problem beheben.

UPDATE

Wenn Sie über ein Array iterieren wollen, um eine Klassenvariable aufzurufen:

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

Ich weiß nicht, warum Sie das wollen, aber so ist es. Und dies wurde getestet, keine Fehler wurden ausgelöst, gültige Antwort von A is my name empfangen wurde.

EDIT

Offenbar funktioniert dies nur unter PHP 5.3

0 Stimmen

Dies war an einen gelöschten Kommentar gerichtet, zur Information: Ich habe es über die php -a cli-Werkzeug. Es hat gut funktioniert. Ich habe den Code geändert, um die ... da sie entfernt werden müssten, um keine Syntaxfehler zu verursachen. Und die B Klasse muss für die UPDATE richtig zu funktionieren.

0 Stimmen

Vergessen Sie nicht, dass ideone.com PHP5.2 verwendet und es unter PHP5.3 problemlos funktioniert.

1voto

panjeh Punkte 1211

Wenn Sie innerhalb einer Klasse auf ein eigenes statisches Datenelement zugreifen möchten, können Sie auch statisch:: anstelle von selbst::

0voto

KoolKabin Punkte 16167

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

Meine Lösung ist:

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

2 Stimmen

Ich würde mich nicht auf eval viel, kann es böse sein.

0 Stimmen

Kann es als Übel behandelt werden, wenn wir nur die festgelegten vordefinierten Befehle verwenden wollen

0 Stimmen

Ehrlich gesagt, würde ich es nicht einmal mit vordefinierten Befehlen verwenden. Nein, es sollte nicht sein böse so zu machen, wie Sie es tun, aber ich weiß, dass es bessere Lösungen gibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X