You are on page 1of 12

Programacin Orientada a Objetos en PHP

En un principio, PHP no era un lenguaje de programacin Orientado a Objetos o bien OOP que son sus siglas en ingls, con el avance de las tecnologas y con las nuevas versiones PHP fue agregando varias funcionalidades propias de la metodologa OOP. Dividiremos este tutorial en las siguientes secciones, que son las que definen si un lenguaje es orientado a objetos o no: Clases y Objetos Mtodos y atributos Herencia de clases Constructores y destructores Encapsulamiento

Clases y Objetos:
A diferencia de la programacin tradicional, la programacin orientada a objetos se base en clases y objetos. Una clase contiene atributos o propiedades y mtodos que son las funciones. Esto es muy importante tenerlo claro. Mtodo es sinnimo de Funcin. Atributo es sinnimo de Propiedad. La Clase sera algo as como un molde y a partir de ese molde se crean objetos. En PHP definimos una clase de la siguiente manera:
class Cliente { // Aqu va el cdigo de nuestra clase }

Mediante las lneas de cdigo de arriba se define la clase Cliente la cual utilizaremos para nuestro tutorial. Si bien este tutorial no est enfocado a definir los conceptos de la Programacin Orientada a Objetos, es bueno aclarar que el nombre de la clase no debe ser en plural, por este motivo nombramos Cliente en lugar de Clientes.

Mtodos y Atributos
Los mtodos y los atributos se definen codifican dentro de la clase. El atributo de una clase es una propiedad. Atributos: El orden y la prolijidad en programacin son muy importantes. Por lo tanto, comenzaremos analizar nuestra clase de arriba hacia abajo. Lo primero que se define en una clase son los atributos.

Por ejemplo: en nuestra clase de ejemplo Cliente un atributo seria Nombre, Apellido, Edad etc. Si nuestro ejemplo fuera una clase Automovil, los atributos serian: rueda,marca,modelo etc. Ms claro ahora? Muy bien, sigamos adelante definiendo los atributos de nuestra clase, para lo cual utilizaremos la palabra reservada private o si trabajas con versiones de PHP inferiores a 5.0 debers usar var, por lo tango nuestra clase se vera de la siguiente manera:
class Cliente { // estos valores de abajo son los atributos o propiedades de nuestra clase private $mNombre; private $mApellido; private $mDireccion; private $mPais; private $mTelefono; private $mEdad; private $mFechaNacimiento; }

En otras palabras, los atributos son visibles o accesibles dentro la propia clase. Si seguimos los estndares de Programacin Orientada a Objetos debemos definir los atributos como privados. Es decir, que sean accesibles solamente desde dentro de la clase misma, por lo tango utilizamos private. En otras palabras, ninguna otra clase y en ninguna otra parte de cdigo se podr cambiar un atributo perteneciente a Mtodos o Funciones: Un mtodo es lo mismo que una funcin, es una porcin de cdigo dentro de la clase que realiza una tarea y puede devolver un valor o no. Los primeros mtodos que definiremos en nuestra clase sern los que asignan valores a nuestros atributos. En este punto siempre hay discrepancia en la comunidad de programadores. La discusin est en si es mejor crear un mtodo para cada atributo o bien crear atributos pblicos y de esa manera evitamos la definicin de mtodos individuales. Esto puede sonar confuso, lo veremos con un ejemplo: Para que puedas ver la diferencia es necesario ver primero la forma que insume ms cdigo para que luego las puedas comparar. Entonces, volviendo a los mtodos, definiremos dos que se encargaran de asignar y retornar un valor a la propiedad nombre.

Mtodos que controlan nuestros atributos. Agregamos el siguiente cdigo inmediatamente despus de nuestras propiedades.
function setNombre($val) { $this->mNombre = $val; } function getNombre() { return $this->mNombre ; }

La clase Cliente con los mtodos quedara de la siguiente manera:


class Cliente { // esto de abajo son los atributos o propiedades de nuestra clase private $mNombre; private $mApellido; private $mDireccion; private $mPais; private $mTelefono; private $mEdad; private $mFechaNacimiento; function setNombre($val) //mtodo que asigna una valor a la propiedad nombre { $this->mNombre = $val; } function getNombre() //mtodo que retorna el valor asignado a la propiedad nombre { return $this->mNombre ; } }

El mtodo setNombre recibe un valor por parmetro y mediante la utilizacin de $this lo asignamos. Recuerda, $this se usa solo dentro de las clases. El mtodo getNombre funciona de forma inversa y retorna el valor de la propiedad, utilizamos return para devolverlo. El ejemplo de arriba es el ms recomendado, pero requiere ms lneas de cdigo, lo que se traduce en ms tiempo. Recin ahora estaramos en condiciones de realizar pruebas con nuestra clase. Luego, veremos la segunda manera de asignar valores a los atributos de la clase.

Probando nuestra clase:


Para probar lo que hemos venido aprendiendo hasta ahora crate una pgina php llamada prueba.php y agrega el cdigo siguiente:
require("classes/Cliente.php"); //creamos objeto para nuestro primer cliente $auxCliente = new Cliente(); //asignamos un nombre a nuestro objeto Cliente $auxCliente->setNombre("Ariel") ; //creamos objeto para nuestro segundo cliente $auxCliente2 = new Cliente(); //asignamos un nombre a nuestro segundo objeto Cliente $auxCliente2->setNombre("Pedro") ; //recuperamos el nombre que asignamos mediante el metodo getNombre echo "El nombre del primer cliente es: ".$auxCliente->getNombre()."<br>"; echo "El nombre del segundo cliente es: ".$auxCliente2->getNombre()."<br>";

Analizando un poco el cdigo, la primera lnea lo que hace es incluir el archivo que tiene la clase Cliente, una vez incluida en prueba.php ya podemos utilizarla.

Paso 1 para utilizar la clase:


Lo primero que hay que hacer para usar la clase es crear una instancia de la misma. Lo que nos da un objeto o modelo de esa clase, por lo tanto: $auxCliente = new Cliente(); nos crea un objeto llamado $auxCliente de la clase Cliente. Recuerden que es un objeto y esta vaco en lenguaje cotidiano. Es un molde. Usando un trmino ms humano, el cliente no tiene nombre, apellido, telfono etc por el momento.

Paso 2, asignar valores a los atributos:


Al tener ya nuestro objeto podemos asignarle un nombre al cliente, lo hacemos utilizando el mtodo correspondiente de la siguiente manera:
//asignamos un nombre a nuestro objeto Cliente $auxCliente->setNombre("Ariel") ;

Ya tenemos un cliente, ahora creamos otro de la siguiente manera.


//creamos objeto para nuestro segundo cliente $auxCliente2 = new Cliente(); //asignamos un nombre a nuestro segundo objeto Cliente $auxCliente2->setNombre("Pedro") ;

La forma en al creamos nuestro segundo cliente es similar al primero, solo que ahora utilizaremos un nuevo objeto $auxCliente2. Recuerda, siempre que quieras obtener un nuevo objeto tienes que utilizar new Objeto() en nuestro ejemplo new Cliente().

Paso 3, verificar funcionamiento de la clase:


Una vez asignado el nombre a los dos clientes comprobamos que realmente cada cliente tenga su nombre y que cada cliente es un objeto distinto. Lo verificamos de la siguiente forma:
//recuperamos el nombre que asignamos mediante el mtodo getNombre echo "El nombre del primer cliente es: ".$auxCliente->getNombre()."<br>"; echo "El nombre del segundo cliente es: ".$auxCliente2->getNombre()."<br>";

El resultado ser:
//El nombre del primer cliente es: Ariel //El nombre del segundo cliente es: Pedro

Retomando el asunto relacionado a si debemos usar mtodos para controlar las propiedades de nuestra clase o no, debemos recurrir algunas modificaciones en nuestra clase. Como habrs observado la forma de asignar un valor a la propiedad mNombre fue utilizando el mtodo setNombre y para recuperar el valor utilizamos el mtodo getNombre que no son otra cosas que funciones pblicas definidas dentro de la clase. Existe una forma no siempre recomendada de controlar los atributos sin utilizar mtodos, esto es definiendo las propiedades como pblicas, para lo cual podemos utilizar var o public en vez de private.

La definicin de las propiedades quedara as:


class Cliente { // esto de abajo son los atributos o propiedades de nuestra clase public $mNombre; public $mApellido; public $mDireccion; public $mPais; public $mTelefono; public $mEdad; public $mFechaNacimiento; }

Muy importante observar nuestra clase ya no tiene los mtodos set y get que se encargaban de las propiedades. Cmo controlamos las propiedades sin los mtodos? Dado que las propiedades se definieron como pblicas es posible acceder a ellas desde cualquier parte del cdigo. Es decir, desde dentro de la clase mediante la utilizacin de $this y desde afuera. Probaremos nuestro segundo ejemplo con las siguientes lneas de cdigo:
require("classes2/Cliente.php"); //creamos objeto para nuestro primer cliente $auxCliente = new Cliente(); //asignamos un nombre a nuestro objeto Cliente $auxCliente->mNombre = "Ariel" ; //creamos objeto para nuestro segundo cliente $auxCliente2 = new Cliente(); //asignamos un nombre a nuestro segundo objeto Cliente $auxCliente2->mNombre = "Pedro" ; //recuperamos el nombre que asignamos mediante el metodo getNombre echo "El nombre del primer cliente es: ".$auxCliente->mNombre."<br>"; echo "El nombre del segundo cliente es: ".$auxCliente2->mNombre."<br>";

Dado que las propiedades son pblicas asignamos un nombre de la misma manera que asignamos un valor a una variable comn en PHP.
$auxCliente->mNombre = "Ariel" ;

Lo mismo para recuperar el valor de la propiedad, accedemos directamente as $auxCliente ->mNombre Todo muy bien. Ahora, cul es la mejor forma? Esto es muy relativo y depende de la aplicacin que ests desarrollando. Lo que si es cierto es que si utilizas el mtodo ms sencillo te estaras saliendo de los estndares de desarrollo de aplicaciones orientadas a objetos. Existen empresas que son muy rigurosas en estas metodologas y exigen a sus programadores la aplicacin de estas reglas para que el cdigo fuente final sea uniforme. Este tutorial pretende ser lo ms profesional posible, por lo tanto mostramos las dos formas. Depende del programador cual usar.

Qu otro uso tienen los Mtodos?


Los mtodos no son solo tiles para manejar las propiedades. De hecho esta es una de las tareas menos importante que realizan los mtodos. Podemos utilizar un mtodo para calcular la edad de la persona basada en la fecha de nacimiento. Agregamos lo siguiente a nuestra clase:
function setFechaNacimiento($val) Nacimiento { $this->mFechaNacimiento = $val; } function getEdad() //mtodo que retorna el valor asignado a la propiedad edad { return $this->mEdad ; } function calcularEdad() { $fecha_nacimiento = $this->mFechaNacimiento; list($y, $m, $d) = explode("-", $fecha_nacimiento); $y_dif = date("Y") - $y; $m_dif = date("m") - $m; $d_dif = date("d") - $d; //mtodo que asigna una valor a la propiedad Fecha de

if ((($d_dif < 0) && ($m_dif == 0)) || ($m_dif < 0)) $y_dif--; $this->mEdad = $y_dif; return $y_dif; }

La funcin calcularEdad tiene el cometido de darnos la edad de un cliente basado en la fecha de nacimiento. Es sin duda un claro ejemplo de cmo podemos utilizar los mtodos. Vamos a probar el mtodo agregando el siguiente cdigo en una pgina PHP en blanco:
require("classes/Cliente.php"); //creamos objeto para nuestro primer cliente $auxCliente = new Cliente(); //asignamos un nombre a nuestro objeto Cliente $auxCliente->setNombre("Ariel") ; //asignamos fecha de nacimiento $auxCliente->setFechaNacimiento("1979-11-19") ; //calculamos edad $auxCliente->calcularEdad() ; //recuperamos el nombre que asignamos mediante el metodo getNombre echo "El Cliente: aos&lt;br&gt;"; ".$auxCliente->getNombre().", tiene ".$auxCliente->getEdad()."

Con esto ltimo terminamos el captulo relacionado a Mtodos y Propiedades.

Herencia de Clases
Sin duda es una de las caractersticas ms destacadas en los lenguajes orientados a objetos, y PHP cuenta con esta caracterstica. Cuando hablamos de herencia nos referimos a mtodos y propiedades que se importan de otra clase. Como la palabra lo dice, heredamos funciones que ya estn hechas. La herencia nos sirve para ahorrarnos trabajo y reutilizar cosas que ya estn hechas. Por ejemplo: si en nuestra empresa tenemos clientes, proveedores y empleados. Todos tienen cosas en comn, todos tienen nombre, apellidos, telfonos, pas etc. Llevndolo al plano analtico, todos son personas. Por lo tanto, podemos definir una clase Persona, la cual contenga todos los atributos y mtodos comunes al cliente, proveedor y empleado. Podemos decir que estas clases heredaran de Persona los atributos en comn.

Para comenzar definimos la clase Persona:


class Persona { // esto de abajo son los atributos o propiedades de nuestra clase private $mNombre; private $mApellido; private $mDireccion; private $mPais; private $mTelefono; private $mEdad; private $mFechaNacimiento; function setNombre($val) //mtodo que asigna una valor a la propiedad nombre { $this->mNombre = $val; } function getNombre() //mtodo que retorna el valor asignado a la propiedad nombre { return $this->mNombre ; } }

Y nuestra clase Cliente quedara as:


require("Persona.php"); class Cliente extends Persona { }

A primera vista parece vaca, sin mtodos ni propiedades. Pero, si prestamos atencin, vemos la palabra usada para heredar extends y a continuacin Persona. Esto, en otras palabras quiere decir que la clase Cliente hereda todas las propiedades y mtodos de Persona.

Para demostrar la utilidad de la herencia utilizaremos otra clase llamada Empleado.


require("Persona.php"); class Empleado extends Persona { }

Al heredar nos evitamos tener que definir los mtodos y propiedades para cada una de las clases por separado, evitando as el cdigo duplicado y aprovechamos al mximo la reutilizacin, uno de los principios bsicos de esta metodologa. Para probar que Cliente y Empleado heredaron utiliza los ejemplos de la seccin anterior.

Constructores y Destructores
Siempre que ejecutamos $auxCliente = new Cliente(); decimos que construimos el objeto Cliente. Se puede dar el caso que podramos querer ejecutar determinadas acciones en el mismo momento de creacin o construccin del objeto. Para esto usamos el constructor, que no es ms que un funcin que se ejecuta automticamente. En PHP5 el constructor se define con __construct en versiones anteriores el constructor se define con una funcin con el mismo nombre de la clase. Por ejemplo en nuestra clase Cliente el constructor se definira de la siguiente manera:
//constructor de la clase function __construct($val) { $this->mFechaNacimiento = $val; $this->calcularEdad(); }

En el ejemplo utilizamos el constructor para calcular la edad automticamente despus de instanciar el objeto.
//creamos objeto para nuestro primer cliente $auxCliente = new Cliente("1979-11-19"); echo "Edad del cliente:.$auxCliente->getEdad()." aos&lt;br&gt;";

El destructor de una clase se utiliza para realizar operaciones cuando se destruye el objeto, es decir cuando se elimina de la memoria. Esta funcionalidad es muy utilizada en sistemas de chat. Donde necesitamos actualizar la base de datos ni bien el visitante cierra la pgina.

Encapsulamiento
Es la capacidad de los objetos de tener otros objetos dentro de s mismo. Un buen ejemplo podra ser que una empresa tiene clientes. Por lo tanto, un objeto cliente podra estar dentro del objeto empresa.

Creamos nuestra clase Empresa


class Empresa { private $mCliente; function agregarCliente($unCliente) //mtodo que agrega el cliente { $this->mCliente = $unCliente; } function getCliente() //mtodo que retorna el cliente { return $this->mCliente ; } }

En un archivo de prueba agregamos el siguiente cdigo:


require("classes/Cliente.php"); require("classes/Empresa.php"); $auxEmpresa = new Empresa(); //creamos objeto para nuestro primer cliente $auxCliente = new Cliente(); //asignamos un nombre a nuestro objeto Cliente $auxCliente->setNombre("Ariel") ; //asignamos fecha de nacimiento $auxCliente->setFechaNacimiento("1979-11-19") ; //calculamos edad $auxCliente->calcularEdad() ; //agregamos el cliente dentro de la empresa $auxEmpresa->agregarCliente($auxCliente) ; //recuperamos el nombre que asignamos mediante el metodo getNombre echo "El Cliente: ".$auxEmpresa->getCliente()->getNombre().", tiene ".$auxEmpresa->getCliente()>getEdad()." aos&lt;br&gt;";

El mtodo agregarCliente introduce el objeto Cliente dentro del objeto Empresa y getCliente nos lo devuelve. Por lo tanto lo siguiente:
$auxEmpresa->getCliente()->getNombre()

You might also like