2012-06-28 33 views
58

Al principio me confundí por qué funcionan las dos llamadas al método en el constructor, pero ahora creo que lo entiendo. Las clases extendidas heredan los métodos de los padres como si estuvieran declarados en la clase en sí, Y los métodos existen en el padre, por lo que ambos deberían funcionar.formas múltiples de llamar al método padre en php

Ahora me pregunto si hay una forma preferida (es decir, mejor práctica) de llamar al método (a través de parent o this), y si estas son formas verdaderamente idénticas de ejecutar el mismo código, o si hay cualquier advertencia al usar una sobre la otra.

Lo siento, probablemente estoy más que pensando en esto.

abstract class Animal { 

    function get_species() { 

     echo "test"; 

    } 

} 

class Dog extends Animal { 

    function __construct(){ 

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

    } 

} 

$spike = new Dog; 

Respuesta

77

Hay tres escenarios (que se me ocurre) en el que se dice un método en una subclase dónde están las salidas de método en la clase padre:

  1. método no se sobrescribe por la subclase, sólo existe en padre.

    Esto es lo mismo que su ejemplo, y generalmente es mejor usar $this -> get_species(); Tiene razón en que en este caso los dos son efectivamente iguales, pero el método ha sido heredado por la subclase, por lo que no hay razón para diferenciar . Al usar $this, se mantiene constante entre los métodos heredados y los métodos declarados localmente.

  2. El método es sobrescrito por la subclase y tiene una lógica totalmente única del padre.

    En este caso, es posible que desee utilizar $this -> get_species(); porque no desea que se ejecute la versión principal del método. De nuevo, al usar consistentemente $this, no necesita preocuparse por la distinción entre este caso y el primero.

  3. El método amplía la clase principal, agregando lo que el método principal logra.

    En este caso, aún desea utilizar `$this -> get_species(); al llamar al método desde otros métodos de la subclase. El único lugar al que llamará el método principal sería el método que sobrescribe el método principal. Ejemplo:

    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."; 
        } 
    } 
    

El único escenario que se puede imaginar en el que tendría que llamar al método padres directamente fuera del método primordial sería si lo hicieran dos cosas diferentes y que sabía que necesitaba la versión de la matriz de el método, no el local.Esto no debería ser el caso, pero si lo hizo presentarse a sí misma, el camino limpio para abordar este sería la creación de un nuevo método con un nombre como get_parentSpecies(), donde lo único que hace es llamar al método parent:

function get_parentSpecies(){ 

    parent::get_species(); 
} 

Nuevamente, esto mantiene todo agradable y consistente, permitiendo cambios/modificaciones en el método local en lugar de depender del método principal.

+0

¿cómo lo haré sin "extender"? como si tuviera alguna "pierna" claass dentro de la clase "humana" pero realmente no necesito extenderla, ya que no necesito la funcionalidad "humana" de los padres. ahora, si crease un '$ leg = new leg()' dentro del 'humano', ¿cómo podría llamar a las funciones humanas desde dentro de una instancia leg '$ leg'? – user151496

+0

@ user151496 Una pierna no es una subclase de ser humano. Un humano tiene muchas piernas, pero una pierna no es un tipo de humano. Por lo tanto, no debes tener una clase de pierna que herede de humana, porque una pierna no es humana. – Beetle

+0

¿Harías de Leg una clase que tenga una interfaz de Leggy? O simplemente haz que la clase Humana implemente a Leggy? ¿Cómo podemos definir mejor que una pierna no es exclusiva de los humanos, sino también que las piernas humanas son exclusivamente humanas y una propiedad general de los humanos? – Anthony

5

A menos que yo estoy no entender la pregunta, casi siempre usaría $ this-> get_species debido a que la subclase (en este caso el perro) podría sustituir dicho método ya que extenderlo. Si el perro de la clase no redefine el método, ambas formas son funcionalmente equivalentes, pero si en algún momento en el futuro decides que quieres que el método get_species en dog imprima "dog", entonces deberías volver a revisar todo el código y cambialo.

Cuando usa $ this, en realidad es parte del objeto que creó y por lo tanto siempre será el más actualizado (si la propiedad que se utiliza ha cambiado de algún modo durante la vida del objeto) mientras el uso de la clase padre llama al método de clase estática.

+0

ese es un buen punto acerca de usar $ this en caso de que quiera anular el método. Gracias – jerry

Cuestiones relacionadas