2012-06-28 12 views
58

All'inizio ero confuso perché entrambe le chiamate al metodo nel costruttore funzionano, ma ora penso di aver capito. Le classi estendenti ereditano i metodi del genitore come se fossero dichiarati nella classe stessa, E i metodi esistono nel genitore, quindi entrambi dovrebbero funzionare.diversi modi di chiamare il metodo genitore in php

Ora mi chiedo se c'è un modo preferito (vale a dire la migliore pratica) di chiamare il metodo (tramite parent o this) e se questi sono modi veramente identici di eseguire lo stesso codice, o se ci sono eventuali avvertimenti quando si utilizza uno sull'altro.

Scusa, probabilmente sto pensando troppo a questo.

abstract class Animal { 

    function get_species() { 

     echo "test"; 

    } 

} 

class Dog extends Animal { 

    function __construct(){ 

     $this->get_species(); 
     parent::get_species(); 

    } 

} 

$spike = new Dog; 

risposta

77

Ci sono tre scenari (che mi viene in mente), dove si potrebbe definire un metodo in una sottoclasse in cui le uscite metodo nella classe genitore:

  1. metodo non viene sovrascritto da sottoclasse, esiste solo in genitore.

    Questo è lo stesso del vostro esempio, e in generale è meglio usare $this -> get_species(); Hai ragione che in questo caso i due sono effettivamente la stessa, ma il metodo è stato ereditato dalla sottoclasse, quindi non c'è ragione per differenziare . Utilizzando $this rimani coerente tra metodi ereditati e metodi dichiarati localmente.

  2. Il metodo viene sovrascritto dalla sottoclasse e ha una logica totalmente univoca dal genitore.

    In questo caso, ovviamente, si desidera utilizzare $this -> get_species(); perché non si desidera eseguire la versione del metodo eseguita dal genitore. Ancora una volta, usando costantemente $this, non è necessario preoccuparsi della distinzione tra questo caso e il primo.

  3. Il metodo estende la classe padre, aggiungendo ciò che il metodo genitore ottiene.

    In questo caso, si desidera comunque utilizzare `$this -> get_species(); quando si chiama il metodo da altri metodi della sottoclasse. L'unico posto che chiamerai il metodo genitore sarebbe dal metodo che sovrascrive il metodo genitore. Esempio:

    abstract class Animal { 
    
        function get_species() { 
    
         echo "I am an animal."; 
    
        } 
    
    } 
    
    class Dog extends Animal { 
    
        function __construct(){ 
    
         $this->get_species(); 
        } 
    
        function get_species(){ 
    
         parent::get_species(); 
         echo "More specifically, I am a dog."; 
        } 
    } 
    

L'unico scenario posso immaginare dove si avrebbe bisogno di chiamare il metodo genitore direttamente al di fuori del metodo primario sarebbe se hanno fatto due cose diverse e si sapeva che aveva bisogno la versione del genitore di il metodo, non il locale.Questo non dovrebbe essere il caso, ma se lo facesse presentarsi, il modo pulito per avvicinarsi a questo potrebbe essere quella di creare un nuovo metodo con un nome come get_parentSpecies() dove tutto ciò che fa è chiamare il metodo parent:

function get_parentSpecies(){ 

    parent::get_species(); 
} 

Di nuovo, questo mantiene tutto bello e coerente, consentendo modifiche/modifiche al metodo locale piuttosto che affidarsi al metodo genitore.

+0

come farei senza "estendere"? come se avessi qualche claass "leg" all'interno della classe "human", ma non ho davvero bisogno di estenderlo, in quanto non ho bisogno della funzionalità "umana" del genitore. ora, se ho creato un '$ leg = new leg()' all'interno di 'human', come chiamerei le funzioni di human all'interno di un'istanza di gamba' $ leg'? – user151496

+0

@ user151496 Una gamba non è una sottoclasse di umani. Un umano ha molte gambe, ma una gamba non è un tipo di essere umano. Quindi non dovresti avere una classe di gamba che erediti dall'essere umano, perché una gamba non è un essere umano. – Beetle

+0

Vuoi creare una classe Leg che ha un'interfaccia di Leggy? Oppure fai in modo che le classi umane implementino Leggy? Come possiamo meglio definire che una gamba non è esclusiva per gli umani, ma anche che le gambe umane sono unicamente umane e una proprietà generale degli umani? – Anthony

5

A meno che non sto equivoco la questione, vorrei quasi sempre usare $ this-> get_species perché la sottoclasse (in questo caso il cane) potrebbe sovrascrivere il metodo dal momento che estenderla. Se il cane di classe non ridefinisce il metodo, allora entrambi i modi sono equivalenti dal punto di vista funzionale ma se in un certo momento in futuro decidi che il metodo get_species nel cane dovrebbe stampare "cane", allora dovresti tornare indietro attraverso tutto il codice e cambiarlo.

Quando si usa $ questo è in realtà parte dell'oggetto che è stato creato e quindi sarà sempre anche il più aggiornato (se la proprietà utilizzata è cambiata in qualche modo nel corso della vita dell'oggetto) mentre l'uso della classe genitore sta chiamando il metodo della classe statica.

+0

questo è un buon punto sull'utilizzo di $ this nel caso in cui voglio sovrascrivere il metodo. Grazie – jerry

Problemi correlati