PHP Altruisas Ocio Eventos Cursos Las Palmas
/

El uso de Protected en la declaración de un método o atributo de una clase en PHP

Esta característica hace referencia a la visibilidad del método o atributo y se define en el momento de crear una clase. El significado es similar a utilizar private (solo visible desde el código de la clase), pero con la salvedad de que si se utiliza protected se puede acceder desde la propia clase y desde una clase hija de ésta. En definitiva, estamos dando visibilidad para que una clase hija pueda utilizar, atributo o método, en el código de creación de la subclase.

Ejemplo: clase madre: Animal, clase hija: Pez


1.- Fichero: Animal.class.php

<?php
class Animal {
      // Declaración de atributos
     private $color = "gris";
     private $peso = 10;
     // definición de los métodos
     public function getColor (){
       return $this->color;
     }
     public function setColor ($color){
       $this->color = $color;
     }
     public function getPeso (){
       return $this->peso;
     }
     public function setPeso ($peso){
        $this->peso = $peso;
     }
     public function anadir_un_kilo() { 
       $this->peso = $this->peso + 1; 
     }
     public function comer(){
       echo "Ñam ñam.<br>";
     }
     public function moverse (){
       echo "caminar dos metros hacia adelante.<br>";
     }
}//fin declaración de la clase
?>

2.- Fichero: Pez.class.php


<?php
 class Pez extends Animal {
    private $vive_en_el_mar; //tipo de pez
    //accesos
    public function getTipo () {
        if ($this->vive_en_el_mar){
        return"vive_en_el_mar";
        }else if ($this->vive_en_el_mar === falso){
           return "no_vive_en_el_mar";
        }else {
            return"";
        }
     }
   public function setTipo ($vive_en_el_mar){
      $this->vive_en_el_mar = $vive_en_el_mar;
   }
   //método
   public function nadar (){
   echo "Nado <br>";
   }
}?>

Con objeto de estudiar la visibilidad protegida, se añade el atributo $edad con visibilidad protegida (protected) a la clase Animal.

      // Declaración de atributos
     private $color = "gris";
     private $peso = 10;
     protected $edad = 0;
     // definición de los métodos
     [...], etc
?>

En la clase Pez crearemos un método llamado llamarAtributos ()


 public function llamarAtributos (){
    echo "Tipo : ".$this->vive_en_el_mar; // atributo privado de la clase Pez, correcto
    echo "<br>";
    echo "Edad: ".$this->edad; //atributo protegido en la clase madre, correcto
    echo "<br>";
    echo "Peso: ".$this->peso; //atributo privado en la clase madre, error. Debe pasar
    //por sus métodos públicos para leer o modificar el valor
    echo "<br>";
 }

La página de uso de las clases: uso.protected.php

<?php
   //cargar las clases
   include ('class/Animal.class.php');
   include ('class/Pez.class.php');
   //instanciar la clase Pez que llama al constructor
   //de la clase animal
   $pez = newPez ("gris", 8);
   //leer el peso con el acceso de la clase madre
   echo"El peso del pez es : ".$pez->getPeso()." kilos.<br>";
   //actualizar el tipo de pez
   $pez->setTipo(true);
   //llamada al método mostrando los atributos de la clase Pez
   //y Animal
   $pez->llamarAtributos();
?>

Ejecución del código del fichero de uso. Como puede observarse al ejecutar el código, el atributo $Peso no está accesible desde la subclase (clase hija) Pez, y esto es debido a que está declarada como privada. La recomendación es que si se quiere tener acceso desde las clases hijas deben declararse como protegidos (protected).

Deja una respuesta