2010-07-03 12 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! 
?> 

Quindi qual è la soluzione migliore?Override di membri statici in classi derivate in PHP

+7

sostituire self :: $ c con statico :: $ c – Artefacto

+0

@Artefacto Grazie, che funziona bene! –

risposta

9

Il modo migliore per risolvere questo è l'aggiornamento a PHP 5.3, dove sono disponibili late static bindings. Se questa non è un'opzione, purtroppo dovrai ridisegnare la tua classe.

+0

PHP 5.3 è compatibile con PHP 5.2? Il mio server è ancora in esecuzione su 5.2 – powerboy

+3

@powerboy È compatibile ** all'indietro **, ciò significa che gli script scritti per 5.2 verranno eseguiti su 5.3, per la maggior parte. Alcune cose minori potrebbero essere cambiate. Vedi qui: http://www.php.net/manual/en/migration53.php – deceze

0

Devi reimpiantare il metodo della classe base; provare con:

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

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

Come si vede, questa soluzione è molto inutile, perché la forza di ri-scrivere tutti i metodi di sottoclasse.

Il valore di self::$c dipende solo dalla classe in cui il metodo è stato effettivamente implementato, non dalla classe da cui è stato chiamato.

3

In base agli input di deceze e Undolog: Undolog è corretto, per PHP < = 5.2.

Ma con 5.3 e tardo attacchi statici che funzionerà, basta usare statico invece di sé all'interno della funzione - ora funzionerà ... // THX @ deceze per il suggerimento

per noi copiare passato la scansione del campione utenti StackOverflow - questo funzionerà:

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" 
Problemi correlati