Modelo de objetos en PHP5

Control de acceso a la clase

Atributos y métodos privados

Una de las ideas que están detrás de la programación orientada a objetos consiste en dividir un sistema complejo en muchos sistemas más sencillos (objetos) que colaboran entre sí para resolver un determinado problema.

Una vez que los objetos han sido diseñados (y se ha comprobado que funcionan correctamente) sólo interesa de ellos su funcionalidad, en absoluto interesa su implementación. El truco está en que escondiendo la implementación de cada mini-sistema se reducirá la complejidad del sistema global.

En general, cada objeto tendrá una serie de características (atributos), una funcionalidad (métodos internos) y un mecanismo de comunicación con el exterior (interfaz). Ocultar la implementación significa que otros objetos del sistema no deberían acceder a los mecanismos internos de un objeto. En lugar de ello deberían relacionarse con el objeto a través del mecanismo de comunicación.

Cada objeto encapsula sus atributos y métodos internos mediante el cualificador de acceso private y ofrece a sus usuarios una interfaz de comunicación mediante el cualificador public.

Como norma general, la interfaz de comunicación debería estar formada por métodos públicos (no por atributos) con el fin de conseguir mayor flexibilidad.

Los atributos y métodos marcados como private no son accesibles desde el exterior de la clase (ni desde clases derivadas de la clase actual). A estos elementos sólo tendrán acceso los métodos internos de la clase.

Por ejemplo, si se redefine la clase Vehiculo:

class Vehiculo
{
//// atributos publicos (no muy recomendable)
public $potencia;
public
$color;
public
$peso;

//// forma parte de la implementacion (privados)
private $velocidadMaxima;


//// constructor
function __construct($potencia,$peso)
{
$this->potencia = $potencia;
$this->peso = $peso;

return
true;

}


//// interfaz de comunicacion (metodos publicos)

//// relacionPesoPotencia()
//// devuelve la relacion peso/potencia
public function relacionPesoPotencia()
{
if (
$this->potencia>0)
{
return (
$this->peso/$this->potencia);
}

return -
1;

}

//// metodos para acceder al atributo velocidadMaxima
public function setVelocidadMaxima($velocidadMaxima)
{
if (
$velocidadMaxima<0)
{
return
false;
}

$this->velocidadMaxima = $velocidadMaxima;

return
true;

}

public function
getVelocidadMaxima()
{
return
$this->velocidadMaxima;

}

}

El atributo $velocidadMaxima sólo será accesible desde el interior de la clase, no desde el exterior. La única forma de acceder a esta característica del objeto es a través de la interfaz pública: métodos getVelocidadMaxima() y setVelocidadMaxima()

//// creamos un nuevo objeto (60 CV, 190 Kg)
$obj_vehiculo = new Vehiculo(60,190);

//// acceso a traves de la interfaz publica
echo $obj_vehiculo->getVelocidadMaxima()."<br>";

//// acceso a un atributo privado: ERROR
$obj_vehiculo->velocidadMaxima = 170;

//// modificamos el atributo
//// (a traves del metodo de acceso apropiado)
$obj_vehiculo->setVelocidadMaxima(180);

echo
$obj_vehiculo->getVelocidadMaxima()."<br>";

//// acceso a un atributo privado: ERROR
echo $obj_vehiculo->velocidadMaxima."<br>";

Existe otro cualificador de acceso: protected, que se utiliza para permitir el acceso a los miembros de una clase desde sus clases derivadas. Su funcionamiento se analiza más adelante.

 

Felipe Fernández Perera : Google+