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).