12 - Modificadores de acceso a atributos y métodos (protected)


En el concepto anterior presentamos la herencia que es una de las características fundamentales de la programación orientada a objetos.

Habíamos dicho que otro objetivo de la POO es el encapsulamiento (es decir ocultar todo aquello que no le interese a otros objetos), para lograr esto debemos definir los atributos y métodos como privados. El inconveniente es cuando debemos utilizar herencia.

Una subclase no puede acceder a los atributos y métodos privados de la clase padre. Para poder accederlos deberíamos definirlos como públicos (pero esto trae como contrapartida que perdemos el encapsulamiento de la clase)

Aquí es donde entra en juego el modificador protected. Un atributo o método protected puede ser accedido por la clase, por todas sus subclases pero no por los objetos que difinimos de dichas clases.

En el problema de las clases Operacion y Suma se producirá un error si tratamos de acceder a un atributo protected donde definimos un objeto del mismo:

<html>
<head>
<title>Pruebas</title>
</head>
<body>
<?php
class Operacion {
  protected $valor1;
  protected $valor2;
  protected $resultado;
  public function cargar1($v)
  {
    $this->valor1=$v;
  }
  public function cargar2($v)
  {
    $this->valor2=$v;
  }
  public function imprimirResultado()
  {
    echo $this->resultado.'<br>';
  }
}

class Suma extends Operacion{
  public function operar()
  {
    $this->resultado=$this->valor1+$this->valor2;
  }
}

$suma=new Suma();
$suma->valor1=10;
$suma->cargar2(10);
$suma->operar();
echo 'El resultado de la suma de 10+10 es:';
$suma->imprimirResultado();
?>
</body>
</html> 

Cuando se ejecuta esta línea:

$suma->valor1=10;

Aparece el mensaje de error:

Fatal error: Cannot access protected property Suma::$valor1

Retornar