2017-11-06 1 views
0

Ich vermute stark, dass ich meinen Gesamtcode falsch entwerfe, aber ist es möglich, statische Werte zu erben?Vererbung von statischen Werten

Ich habe eine Basisklasse, BaseModel, in der ich einen __callStatic Anruf habe. BaseModel erstreckt sich in verschiedene Modelltypen, und in jedem habe ich eine public static $type; mit einem String-Wert, der den Typ notiert. Wenn ich self::$type im callStatic Anruf in BaseModel rufe, bekomme ich null zurück, was nach der Tat sinnvoll ist. Ich bin mir jedoch nicht sicher, wie ich den Typ der Klasse, die den Anruf tätigt, bekommen kann, ohne den Code callStatic in jede Klasse zu kopieren (bin ich nicht sicher, ob ich magische Methoden in Merkmale einbauen kann?).

Gerade jetzt, ich tue nichts Phantasie:

public static function __callStatic($method, $params) { 
    var_dump(self::$type); 
} 

in BaseClass. Aber ich kann nicht herausfinden, wie ich dieses Problem angehen soll, wenn es überhaupt möglich ist.

Antwort

1

Sie suchen nach Late Static Bindings, die mit dem Schlüsselwort static verwendet werden könnte.

self (und auch __CLASS__) wird immer zur Kompilierzeit ausgewertet, so dass es immer ohne Wissen um die Vererbung und den aufrufenden Kontext ausgeführt wird.

static versucht jedoch, diese Einschränkung zu lösen, indem der aufrufende Kontext zur Laufzeit ausgewertet wird.

class a { 

    public static $foo = "A"; 

    public static function __callStatic($method, $params) { 
     echo static::$foo . "\n"; 
    } 
} 

class b extends a { 
    public static $foo = "B"; 
} 

a::test(); 
b::test(); 
+0

Dies ist spät statische Bindung, oder? Zufällig habe ich diese Seite direkt nach dem Erstellen dieser Frage gefunden. Sucks, wenn ich an die "richtige" Google-Suche denke, nachdem ich eine Frage gestellt habe. – RhoVisions