2017-10-05 4 views
0

Das folgende Beispiel einen Syntaxfehler aufgrund des folgenden Code hat:Zugriff auf eine statische Variable in einer Klasse

"another_key" => [ 2 => self::$someStr ] 

Mit etwas wie:

"another_key" => [ 2 => "bar" ] 

Ist die korrekte Syntax. Gibt es eine Möglichkeit, auf $ someStr zuzugreifen, anstatt die Zeichenfolge hart zu codieren?

<?php 

class Foo { 

    protected static $someStr = 'bar'; 

    private static $arr = [ 
    "some_key" => [ 1 ], 
    "another_key" => [ 2 => self::$someStr ] 
    ]; 
} 
+1

Gemäß der [PHP Docs] (http://php.net/manual/en/language.oop5.properties.php): '[Property] -Deklaration kann eine Initialisierung enthalten, aber diese Initialisierung muss ein konstanter Wert sein Das heißt, es muss in der Lage sein, zur Kompilierzeit ausgewertet zu werden und darf zur Auswertung nicht auf Laufzeitdaten angewiesen sein. Die Verwendung von 'self :: $ someStr 'erfordert eine Laufzeitauswertung –

Antwort

2

Sie können nicht auf statische Variablen innerhalb der Deklaration anderer statischer Variablen zugreifen. Sie können entweder eine Klassenkonstante deklarieren oder durch Zugriff über eine Funktion initialisieren. Eine Klasse Konstante würde wie folgt aussehen:

class Foo { 

    const someStr = 'bar'; 

    private static $arr = [ 
    "some_key" => [ 1 ], 
    "another_key" => [ 2 => self::someStr ] 
    ]; 
} 

Oder mit einer Funktion:

class Foo { 

    private static $someStr = 'bar'; 

    private static $arr = [ 
    "some_key" => [ 1 ], 
    "another_key" => [ 2 => null ] 
    ]; 

    private static function setKey(){ 
     self::$arr['another_key'] = [2 => self::$somStr]; 
    } 
} 

Sie würden dann Foo::setKey() an einem gewissen Punkt nennen, bevor die Variable zugreifen.

0

Wenn Sie auf eine Eigenschaft zugreifen möchten, um den Wert einer anderen Eigenschaft festzulegen, sollten Sie dies im Konstruktor der Klasse tun. Etwas wie dieses:

class Foo { 

    protected static $someStr = 'bar'; 

    private static $arr = [ 
     'some_key' => [1] 
    ]; 

    public function __constructor() 
    { 
     self::arr['another_key'] = [2 => self::$somStr]; 
    } 
} 

Damit dies funktioniert, müssen Sie Ihre Klasse instanziieren.

Sie können einige Beispiele für Eigenschaftsdeklarationen in der PHP documentation anzeigen.

+0

Diese Lösung setzt voraus, dass Die Klasse wurde an einem bestimmten Punkt im Stack instanziiert, da Variablen statisch sind, was nicht unbedingt wahr ist. – GentlemanMax

Verwandte Themen