266 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			266 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Class Inheritance
 | |
| localeTitle: Herencia de clase
 | |
| ---
 | |
| ## Herencia de clase
 | |
| 
 | |
| _REUTILIZA EL CÓDIGO CON HERENCIA EN LA PROGRAMACIÓN ORIENTADA A OBJETOS_
 | |
| 
 | |
| Aquí, hablaremos sobre cómo podemos reutilizar el código que escribimos sin tener ninguna duplicación de código mediante el uso de la herencia.
 | |
| 
 | |
| ### Clase de hombre
 | |
| 
 | |
| Esta es nuestra clase de `Man` :
 | |
| 
 | |
| ```php
 | |
| <?php 
 | |
|  class Man 
 | |
|  { 
 | |
|     // 1. Declare the class variables 
 | |
|     public $name; 
 | |
|     protected $age; 
 | |
|     public $height; 
 | |
|     public $fav_sports; 
 | |
|     private $fav_drinks; 
 | |
|  
 | |
|     // 2. Create a constructor method with 3 required parameters: name, age and height 
 | |
|     public function __construct($name, $age, $height) 
 | |
|     { 
 | |
|         // 2A. Assign the values of parameters to class properties 
 | |
|         // Also known as instance variables 
 | |
|         // Using "$this->property_name" 
 | |
|         $this->name = $name; 
 | |
|         $this->age = $age; 
 | |
|         $this->height = $height; 
 | |
|  
 | |
|         // 2B. Print out the man's attributes and values upon instantiation 
 | |
|         echo "Our man's name is: " . $this->name . "\n"; 
 | |
|         echo "He is " . $this->age . " years old and " . $this->height . " tall."; 
 | |
|     } 
 | |
|  
 | |
|     // 3. Create class methods 
 | |
|     public function giveFirmHandshakes() 
 | |
|     { 
 | |
|         return "I give firm handshakes."; 
 | |
|     } 
 | |
|  
 | |
|     public function beStubborn() 
 | |
|     { 
 | |
|         return "I am stubborn."; 
 | |
|     } 
 | |
|  
 | |
|     public function notPutToiletPaper() 
 | |
|     { 
 | |
|         return "It's not humanly possible to remember to put toilet paper rolls when they are finished"; 
 | |
|     } 
 | |
|  
 | |
|     // 4. Age getter method 
 | |
|     public function getAge() 
 | |
|     { 
 | |
|         return $this->age; 
 | |
|     } 
 | |
|  
 | |
|     // Age setter method 
 | |
|     public function setAge($age) 
 | |
|     { 
 | |
|         $this->age = $age; 
 | |
|     } 
 | |
|  
 | |
|     // 5. Favorite Drinks setter method 
 | |
|     public function setFavDrinks($drinks = array()) 
 | |
|     { 
 | |
|         if ($drinks) { 
 | |
|             $this->fav_drinks = $drinks; 
 | |
|         } 
 | |
|     } 
 | |
|  
 | |
|     // Favorite Drinks getter method 
 | |
|     public function getFavDrinks() 
 | |
|     { 
 | |
|         return $this->fav_drinks; 
 | |
|     } 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| ### Hombre saludable
 | |
| 
 | |
| Digamos que queremos crear otra clase llamada `HealthyMan` que tenga todas las propiedades y métodos de la clase `Man` .
 | |
| 
 | |
| Sin tener que volver a escribir todo el código para la clase `Man` , podemos reutilizar ese código usando la palabra clave extendido.
 | |
| 
 | |
| ```php
 | |
| <?php 
 | |
|  class HealthyMan extends Man 
 | |
|  { 
 | |
|  
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| Ahora tenemos todas las propiedades y métodos de clase de Man inside `HealthyMan` . Podemos crear `HealthyMan` instancia de la clase `HealthyMan` para verificar esto realmente rápido.
 | |
| 
 | |
| ```php
 | |
| <?php 
 | |
|  $jackie = new HealthyMan('Jackie', 25, '5\' 5"'); 
 | |
|  // => Our man's name is: Jackie 
 | |
|  // => He is 25 years old and 5' 5" tall. 
 | |
| ```
 | |
| 
 | |
| Podemos seguir adelante y establecer los deportes y bebidas favoritos de HealthyMan aka Jackie.
 | |
| 
 | |
| ```php
 | |
| <?php 
 | |
|  $jackie->fav_sports = ['swimming', 'weight training']; 
 | |
|  print_r($jackie->fav_sports); 
 | |
|  // => 
 | |
|  // Array 
 | |
|  // ( 
 | |
|  //     [0] => swimming 
 | |
|  //     [1] => weight training 
 | |
|  // ) 
 | |
|  
 | |
|  $jackie->setFavDrinks(['Matcha tea', 'Oolong Tea']); 
 | |
|  print_r($jackie->getFavDrinks()); 
 | |
|  // => 
 | |
|  // Array 
 | |
|  // ( 
 | |
|  //     [0] => Matcha tea 
 | |
|  //     [1] => Oolong Tea 
 | |
|  // ) 
 | |
| ```
 | |
| 
 | |
| Ahora veamos si podemos llamar a los métodos de clase de Man como `giveFirmHandshakes()` , `beStubborn()` y `notPutToiletPaper()` .
 | |
| 
 | |
| ```php
 | |
| <?php 
 | |
|  echo "\n" . $jackie->giveFirmHandshakes(); 
 | |
|  // => I give firm handshakes. 
 | |
|  
 | |
|  echo "\n" . $jackie->beStubborn(); 
 | |
|  // => I am stubborn. 
 | |
|  
 | |
|  echo "\n" . $jackie->notPutToiletPaper(); 
 | |
|  // => It's not humanly possible to remember to put toilet paper rolls when they are finished 
 | |
| ```
 | |
| 
 | |
| Obtenemos todo esto simplemente heredando la clase Man usando la palabra clave extended.
 | |
| 
 | |
| ### Un verdadero hombre sano
 | |
| 
 | |
| Si simplemente heredamos la clase `HealthyMan` de `Man` y no hacemos nada con ella, entonces supera todo el propósito.
 | |
| 
 | |
| La clase HealthyMan tiene propiedades adicionales como `body_fat_percentage` y `workout_per_week` , y métodos como `eatHealthy()` , `meditateDaily()` y `laughOften()` .
 | |
| 
 | |
| Ya que estas son propiedades personales, podemos establecer la visibilidad de las protegidas o privadas y crear métodos de establecimiento / obtención para la encapsulación completa.
 | |
| 
 | |
| ```php
 | |
| <?php 
 | |
|  class HealthyMan extends Man 
 | |
|  { 
 | |
|     /** 
 | |
|      * HealthyMan properties 
 | |
|      */ 
 | |
|     private $body_fat_percentage; 
 | |
|     private $workout_per_week; 
 | |
|  
 | |
|     /** 
 | |
|      * HealthyMan methods 
 | |
|      */ 
 | |
|     public function eatHealthy() 
 | |
|     { 
 | |
|         return "I only eat healthy meals."; 
 | |
|     } 
 | |
|  
 | |
|     public function meditateDaily() 
 | |
|     { 
 | |
|         return "I set aside 20 minutes daily to meditate."; 
 | |
|     } 
 | |
|  
 | |
|     public function laughOften() 
 | |
|     { 
 | |
|         return "I watch funny TV shows to unwind myself."; 
 | |
|     } 
 | |
|  
 | |
|     /** 
 | |
|      * HealthyMan Setters and Getters 
 | |
|      */ 
 | |
|     public function setBodyFatPercentage($fat_percentage) 
 | |
|     { 
 | |
|         $this->body_fat_percentage  = $fat_percentage; 
 | |
|     } 
 | |
|  
 | |
|     public function getBodyFatPercentage() 
 | |
|     { 
 | |
|         return $this->body_fat_percentage; 
 | |
|     } 
 | |
|  
 | |
|     public function setWorkoutPerWeek($workout_times) 
 | |
|     { 
 | |
|         $this->workout_per_week = $workout_times; 
 | |
|     } 
 | |
|  
 | |
|     public function getWorkoutPerWeek() 
 | |
|     { 
 | |
|         return $this->workout_per_week; 
 | |
|     } 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| Podemos llamar a estos métodos para ver si funcionan como se espera:
 | |
| 
 | |
| ```php
 | |
| <?php 
 | |
|  
 | |
|  echo "\n" . $jackie->eatHealthy(); 
 | |
|  // => I only eat healthy meals. 
 | |
|  
 | |
|  echo "\n" . $jackie->meditateDaily(); 
 | |
|  // => I set aside 20 minutes daily to meditate. 
 | |
|  
 | |
|  echo "\n" . $jackie->laughOften(); 
 | |
|  // => I watch funny TV shows to unwind myself. 
 | |
|  
 | |
|  $jackie->setBodyFatPercentage(12); 
 | |
|  echo "\nBody Fat %: " . $jackie->getBodyFatPercentage(); 
 | |
|  // => Body Fat %: 12 
 | |
|  
 | |
|  $jackie->setWorkoutPerWeek(5); 
 | |
|  echo "\nWorkout Times Per Week: " . $jackie->getWorkoutPerWeek(); 
 | |
|  // => Workout Times Per Week: 5 
 | |
| ```
 | |
| 
 | |
| Hemos reutilizado con éxito el código existente e implementado una clase secundaria.
 | |
| 
 | |
| ### ¿Es él ese obstinado?
 | |
| 
 | |
| A pesar de que heredó `beStubborn()` de la clase Man, ya que Jackie es un hombre sano, solo es terco solo de vez en cuando. Podemos tener el método `beStubborn()` Healthy Man para decir "Soy terco de vez en cuando" en lugar de simplemente "Soy obstinado" al anular el método de la clase padre.
 | |
| 
 | |
| ```php
 | |
| <?php 
 | |
|  class HealthyMan extends Man 
 | |
|  { 
 | |
|     ..... 
 | |
|     ..... 
 | |
|  
 | |
|     public function beStubborn() 
 | |
|     { 
 | |
|         return "I am stubborn once in a while."; 
 | |
|     } 
 | |
|  
 | |
|     ..... 
 | |
|     ..... 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| Ahora, cuando podamos el método `beStubborn()` Jackie, veremos una salida diferente a la anterior:
 | |
| 
 | |
| ```php
 | |
| <?php 
 | |
|  echo "\n" . $jackie->beStubborn(); 
 | |
|  // => I am stubborn once in a while. 
 | |
| ```
 | |
| 
 | |
| Esto demuestra cómo funciona la sustitución de métodos en OOP.
 | |
| 
 | |
| Al utilizar la sustitución de métodos, básicamente estamos volviendo a declarar el método de la clase primaria dentro de la clase secundaria.
 | |
| 
 | |
| De esta manera, cualquier instancia de la clase principal mantiene su método original, mientras que cualquier instancia de la clase secundaria tiene el método modificado o anulado. |