Cuando a principios de los años 80 se empezó a experimentar la Programacion Orientada a Objetos (POO) esta ha ido suplantando la programacion tradicional, por esta razon y aunque PHP no sea orientado a objetos, PHP incorpora sus principales características para que podamos trabajar con clases y objetos.
Clases y Objetos
Para entender la programacion orientada a objetos debemos primero entender lo que es una clase, pero primero diremos que un objeto es un conjunto de atributos y metodos agrupados.
Una clase es un grupo de objetos que comparten los mismos atributos y métodos, veamos como podemos crear una clase llamada Imagen:
class Imagen {
// Aqui el codigo de la clase
}
?>
Metodos y atributos
Esta clase contendrá un seguido de atributos, que definiremos con la palabra reservada var, y metodos, que programaremos como funciones usando function.
Para crear un objeto de tipo imagen se ejecutará el constructor de la imagen que será el metodo con el mismo nombre que la clase o en PHP5 el metodo llamado __construct(), veamos un ejemplo:
class Imagen {
var $src; // Estos són los atributos
var $border; // de los objetos asociados
// Esta funcion es el constructor
function Imagen($src,$border) {
$this->src=$src;
$this->border=$border;
}
}
// Creamos un objeto imagen
$logo = new Imagen("logo.gif",3);
?>
Tambien podemos crear mas metodos ademas del constructor, vamos a completar el ejemplo con un método que imprima la imagen en el navegador del visitante:
class Imagen {
var $src;
var $border;
function Imagen($src,$border) {
$this->src=$src;
$this->border=$border;
}
// Esta funcion es un método de Imagen
function Imprimir() {
echo "
echo $this->src;
echo "\" border=\"";
echo $this->border;
echo "\">";
}
}
$logo = new Imagen("logo.gif",3);
// Llamamos el nuevo método
$logo->Imprimir();
?>
Puedes ver cómo efectivamente este ejemplo funciona y es un magnifico ejemplo de cómo nos puede simplificar algo rutinario como la creacion de multiples imagenes.
Heréncia de clases
Si resulta que hemos creado una clase pero que ademas vemos que hay unos determinados objetos de esta clase que comparten otras cualidades por lo que queremos englobarlos en una clase distinta, lo que podemos hacer es ponerlos en una subclase, los objetos de la subclase, mantendran todos los métodos y atributos de la clase padre y ademas compartiran los de la clase derivada.
Vamos a ver cómo podemos definir una subclase de la clase Imagen definida en la pagina anterior para imagenes de tamaño 468 x 60, esta subclase se llamará Banner y será de la siguiente manera:
// Definimos la subclase de Banner
class Banner extends Imagen {
// Esta es la nueva funcion Imprimir para banners
function Imprimir() {
echo "
echo $this->src;
echo "\" border=\"";
echo $this->border;
echo "\" width=\"468\" height=\"60\">";
}
}
?>
Y finalmente crearemos el objeto $banner_1 y lo imprimiremos:
$banner_1 = new Banner("anunciante1.gif",0);
$banner_1->Imprimir();
?>
Tener en cuenta que en el codigo de la subclase falta el código de la clase Imagen, sino no funcionará.
Vemos que no declaramos constructor para banner, podemos crearle un constructor especifico, pero si no lo hacemos cuando hagamos new Banner, llamaremos al constructor de la clase padre Imagen.
Cuando hacemos Imprimir() del objeto perteneciente a la base derivada Banner, se llama al metodo Imprimir de Banner y no al de Imagen aunque se llamen igual.
En PHP5, las cosas son un poco distintas, porque el motor Zend Engine 2, está preparado para trabajar con Objetos a fondo, esto implica una gran cantidad de cambios a nivel interno y los siguientes cambios externos:
Constructores y destructores
Si trabajamos con PHP5, para definir un costructor, usamos el método __construct, vamos a ver un ejemplo:
class Imagen {
var $src; // Estos són los atributos
var $border; // de los objetos asociados
// Esta funcion es el constructor
function __construct($src,$border) {
$this->src=$src;
$this->border=$border;
}
}
// Creamos un objeto imagen
$logo = new Imagen("logo.gif",3);
?>
Ademas tenemos la opcion de crear un destructor que se ejecutará cuando el objeto va a ser eliminado de´la memória, el constructor se define con el método __destruct.
Encapsulamiento
Este es un concepto nuevo en PHP5, el encapsulamiento permite el uso de variables y métodos internos a un objeto que no pueden ser accedidos internamente, de esta manera existen tres tipos de objetos:
public - Son accesibles desde todo el código.
protected - Son accesibles desde la clase actual y las clases derivadas.
private - Son accesibles desde la clase actual
Vamos a ver el ejemplo de antes pero con atributos protejidos:
class Imagen {
protected $src; // Estos són los atributos
private $border; // de los objetos asociados
// Esta funcion es el constructor
function __construct($src,$border) {
$this->src=$src;
$this->border=$border;
}
}
// Creamos un objeto imagen
$logo = new Imagen("logo.gif",3);
?>
Y estos son los cambios principales de PHP5, ademas de incorporat un constructor de copia
__clone
y algunas otras opciones