2012-01-10 18 views
5

Questo in realtà deriva da un problema specifico di WordPress, ma dietro c'è un punto di PHP più generale a cui sono interessato a conoscere la risposta.È possibile sostituire una funzione all'interno di una classe PHP?

classe L'WordPress è lungo queste linee:

class Tribe_Image_Widget extends WP_Widget { 
    function example_function(){ 
     // do something useful 
    } 
} 

C'è un modo in PHP che posso sostituire example_function() dall'esterno della classe?

Il motivo per cui voglio farlo è che la classe proviene dal plugin WP di qualcun altro (e ha diverse funzioni nella classe) e voglio continuare a ricevere gli aggiornamenti del plugin ma voglio che una delle funzioni sia adattata. Se cambio il plug-in, perderò ogni volta le mie modifiche. SO se ho il mio plugin che cambia solo quella funzione, evito il problema.

+0

Puoi impostare la classe originale come un astratto e impostare il metho d come metodo astratto? –

+0

Lookup: http://stackoverflow.com/questions/2994758/function-overloading-and-overriding-in-php –

+0

Dichiarare astratto sarà solo evitare che la classe originale da essere utilizzato direttamente e lui devono ancora modificalo ogni volta. – Narf

risposta

9

Sembra che quello che si vuole fare sia extend la classe e sovrascrivere quella particolare funzione.

Class Your_Tribe_Image_Widget extends Tribe_Image_Widget 
{ 
    function example_function() { 
    // Call the base class functionality 
    // If necessary... 
    parent::example_function(); 

    // Do something else useful 
    } 
} 
+0

Perfetto, grazie – user114671

1

Si potrebbe probabilmente avere un include_once al plugin di destinazione nella parte superiore del vostro file e quindi estendere la classe del target plug al posto della classe WP_Widget:

include_once otherPlugin.php 
class My_Awesome_Plugin_Overloaded extends Someone_Elses_Awesome_Plugin{ 
    function example_function(){ 
     return 'woot'; 
    } 
} 
1

Finché il metodo nella classe esistente non è stato contrassegnato come finale, puoi solo sottoclasse e sostituirlo

class My_Tribe_Image_Widget extends Tribe_Image_Widget { 
    //override this method 
    function example_function(){ 
     // do something useful 
    } 
} 
Problemi correlati