2010-07-03 8 views
12
<?php 
class Base { 
    protected static $c = 'base'; 

    public static function getC() { 
    return self::$c; 
    } 
} 

class Derived extends Base { 
    protected static $c = 'derived'; 
} 

echo Base::getC(); // output "base" 
echo Derived::getC(); // output "base", but I need "derived" here! 
?> 

Also, was ist die beste Problemumgehung?Überschreiben von statischen Elementen in abgeleiteten Klassen in PHP

+7

selbst ersetzen :: $ c mit statischem :: $ c – Artefacto

+0

@Artefacto Danke, das funktioniert gut! –

Antwort

9

Der beste Weg, dies zu lösen, ist ein Upgrade auf PHP 5.3, wo late static bindings verfügbar sind. Wenn das nicht möglich ist, müssen Sie Ihre Klasse leider neu gestalten.

+0

Ist PHP 5.3 mit PHP 5.2 kompatibel? Mein Server läuft immer noch auf 5.2 – powerboy

+3

@powerboy Es ist ** rückwärts ** kompatibel, was bedeutet, dass Skripte, die für 5.2 geschrieben wurden, auf 5.3 ausgeführt werden, zum größten Teil. Einige kleinere Dinge haben sich möglicherweise geändert. Siehe hier: http://www.php.net/manual/en/migration53.php – deceze

0

Sie müssen die Basisklassenmethode neu implementieren; versuchen Sie mit:

Wie Sie sehen, ist diese Lösung sehr nutzlos, da Kraft, um alle Unterklasse Methoden neu schreiben.

Der Wert self::$c hängt nur von der Klasse ab, in der die Methode tatsächlich implementiert wurde, nicht von der Klasse, von der sie aufgerufen wurde.

3

Basierend auf decezes und Undologs Eingabe: Undolog ist richtig, für PHP < = 5.2.

Aber mit 5,3 und Späte statische Bindung wird es funktionieren, verwenden Sie nur statische statt Selbst innerhalb der Funktion - jetzt wird es funktionieren ... // THX @ deceze für den Hinweis

für uns Vergangenheit Scan kopieren Stackoverflow Benutzer - dies funktioniert:

class Base { 
    protected static $c = 'base'; 
    public static function getC() { 
    return static::$c; // !! please notice the STATIC instead of SELF !! 
    } 
} 

class Derived extends Base { 
    protected static $c = 'derived'; 
} 

echo Base::getC();  // output "base" 
echo Derived::getC(); // output "derived" 
Verwandte Themen