Sei sulla pagina 1di 77

www.desarrolloweb.

com

Manual de PHP 5
Explicamos al detalle todas las caractersticas de PHP5, la nueva versin de
PHP, con caractersticas avanzadas de orientacin a objetos.

Autores del manual


Este manual ha sido realizado por los siguientes colaboradores de
DesarrolloWeb.com:
Miguel Angel Alvarez
Director de DesarrolloWeb.com http://www.desarrolloweb.com
(17 captulos)
Daniel Lpez
http://pichongol.blogspot.com
(1 captulo)
Manu Gutierrez
http: //www.tufuncion.com
(2 captulos)

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

1.Objetivos e introduccin al Manual de PHP 5


Este manual pretende dar un repaso a las nuevas caractersticas de PHP 5, que le diferencian de versiones
anteriores. Haremos especial hincapi en la orientacin a objetos. Comenzaremos por ver qu es PHP 5 y
obtener referencias para aprender PHP general en DesarrolloWeb.com y cmo instalar PHP 5 en nuestro
ordenador local para desarrollo.

1.1. Introduccin a PHP 5


Introduccin al manual del lenguaje PHP en su versin 5.
Vamos a comenzar con el manual de la ltima versin de PHP, lanzada recientemente al mercado:
PHP 5. Una esperada evolucin del, tal vez, ms popular de los lenguajes de programacin de
pginas y aplicaciones web del lado del servidor.
Este manual no va a tratar de explicar desde cero la programacin de aplicaciones del lado del
servidor con PHP, pues ese asunto lo tenemos detallado en el manual de PHP y pensamos que
merece la pena su lectura para empezar los primeros pasos en el lenguaje.
Si una persona no sabe lo que son las pginas dinmicas de servidor le recomendamos que
comience aclarando esos conceptos. Para ello, tenemos dos manuales que explican las nociones
de programacin del lado del cliente y servidor, ms bien tericas, desde dos puntos de vista:
Manual de pginas dinmicas y la Introduccin a los lenguajes del web.
Asimismo, queremos presentarte la seccin monotemtica de PHP, donde se concentran todos los
contenidos sobre PHP que dispone DesarrolloWeb.com. Tambin sera interesante el Manual del
lenguaje SQL y el Taller de MySQL, que sern muy tiles referencias para aclarar los conceptos de
acceso a bases de datos.

Introduccin a PHP 5
Con las primeras 2 versiones de PHP, PHP 3 y PHP 4, se haba conseguido una plataforma potente
y estable para la programacin de pginas del lado del servidor. Estas versiones han servido de
mucha ayuda para la comunidad de desarrolladores, haciendo posible que PHP sea el lenguaje
ms utilizado en la web para la realizacin de pginas avanzadas.
Sin embargo, todava existan puntos negros en el desarrollo PHP que se han tratado de solucionar
con la versin 5, aspectos que se echaron en falta en la versin 4, casi desde el da de su
lanzamiento. Nos referimos principalmente a la programacin orientada a objetos (POO) que, a
pesar de que estaba soportada a partir de PHP3, slo implementaba una parte muy pequea de
las caractersticas de este tipo de programacin.
Nota: la orientacin a objetos es una manera de programar que trata de modelar los procesos de
programacin de una manera cercana a la realidad: tratando a cada componente de un programa
como un objeto con sus caractersticas y funcionalidades. Podemos ver una pequea introduccin
en el artculo Qu es la programacion orientada a objetos.
El principal objetivo de PHP5 ha sido mejorar los mecanismos de POO para solucionar las carencias
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

de las anteriores versiones. Un paso necesario para conseguir que PHP sea un lenguaje apto para
todo tipo de aplicaciones y entornos, incluso los ms exigentes.

1.2. Instalar PHP 5 fcilmente


Cmo instalar PHP 5 en Windows en 5 minutos. Instalacin rpida y sencilla de PHP5 con Wamp
Server 2.
Para los que han instalado alguna vez PHP en Windows sabrn que es un proceso que requiere
varios pasos. Hay que instalar el servidor web Apache, luego el propio PHP y tambin la base de
datos MySQL para trabajar con PHP. En PHP 5 la cosa contina igual, pero existe un mtodo rpido
y sencillo de instalar PHP5 en nuestro sistema.
Para los que no han instalado nunca PHP5 hay que comentar que no tengan miedo para nada al
lenguaje, que es muy sencillo y agradecido. No cabe tampoco tener miedo de la instalacin o
configuracin de PHP, porque en este artculo vamos a explicar un modo de realizarla en 5
minutos y sin necesidad de conocimientos iniciales.
Os paso unas notas rpidas sobre el proceso de instalacin de PHP 5 en Windows por medio de un
programa que se llama Wamp Server 2, que os facilitar la tarea. Podrs comenzar a trabajar con
PHP 5 en 5 minutos!!
Instalacin de PHP 5
Lo primero es entrar en la
http://www.wampserver.com/en/

pgina

de

Wamp

Server,

que

es

la

siguiente:

Como haba comentado, Wamp Server es un programa que instala en un slo paso Apache + PHP +
MySQL y los configura para trabajar juntos.
Habra que hacer la descarga de la
http://www.wampserver.com/en/download.php

ltima

versin

de

Wamp

Server

en:

En la pgina de descarga te especifica claramente la lista de programas que va a instalar, as como


las versiones de los mismos. En el momento de escribir este artculo iban por la versin
WampServer 2.0, que instala esta lista de programas:

Apache 2.2.8
PHP 5.2.6 + PECL
SQLitemanager
MySQL 5.0.51b
Phpmyadmin
Una vez descargado el programa, lo ejecutamos para realizar la instalacin de Wamp Server 2. La
instalacin se basa en un asistente normal que nos solicitar varios datos tpicos de instalaciones,
como que aceptemos los trminos de la licencia. Luego nos saldr la ventana para acabar que
marcaremos que ejecute Wamp Server inmediatamente.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Si todo ha funcionado, en 1 minuto ms podremos comprobar si PHP 5 est funcionando en


nuestro ordenador. Slo tendramos que encender los servicios. Para ello Wamp Server tiene un
panel de control que se accede desde un icono de programa residente de la barra de tareas. Tiene
una forma rara, como un cuentakilmetros. Lo veremos en esta imagen:

Pulsamos el icono con el ratn (botn izquierdo, clic normal) y veremos abajo del todo una
instruccin que pone Put Online, que pondr todos los servicios en funcionamiento.

Ahora, para comprobar que los servicios funcionan slo nos queda abrir un navegador. Vamos a
escribir la siguiente direccin URL en la barra de direcciones:

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

http://localhost
Entonces nos tiene que salir la pgina de inicio del servidor Apache con PHP 5, personalizada por
Wamp, que es algo como esto:

Si no no sale nada puede que haya habido un problema o un error al iniciar los servicios,
generalmente el Apache, que utiliza el puerto 80 que a veces est ocupado por otro programa
como Skype o IIS. Lee la FAQ: No funciona el Wamp Server 2.
Ahora podremos colocar en nuestro servidor todas las pginas PHP que queramos probar o los
proyectos que hayamos creado anteriormente. El directorio donde generalmente se localiza la raz
de publicacin es: C:\wamp\www
En esa carpeta podramos subir cualquier archivo PHP 4 o PHP 5 y debera ejecutarse
perfectamente. Otra cosa que puede fallar es que los inicios de bloques de cdigo PHP que debis
utilizar son con <?php y no slo con <?, que est deshabilitado por defecto.
Os aseguro que leer este artculo os llevar ms tiempo que instalar PHP 5 en vuestro ordenador.
Con Wamp Server 2 es muy fcil.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

2. Introduccin a la orientacin a objetos en PHP 5


Aprendemos qu es la orientacin a objetos y vemos cmo era la aproximacin que
exista en las versiones anteriores del lenguaje. Comenzaremos a explicar los conceptos
ms bsicos de orientacin a objetos en PHP 5.

2.1. Modelo de orientacin a objetos de PHP 3 y 4


Para entender los cambios de PHP5 es interesante conocer primero cmo era el modelo de
objetos de las versiones anteriores.
La versin 3 de PHP ya soportaba la programacin orientada a objetos (POO), aunque es verdad
que la mayora de las caractersticas de este tipo de programacin no estaban implementadas
todava. En concreto, con PHP3 podamos crear clases e instanciar objetos. Las clases permitan
agrupar tanto mtodos como propiedades o atributos, pero la cosa se quedaba ah.
En PHP4, se reescribi el motor de PHP para hacerlo mucho ms rpido y estable, pero la POO,
que haba introducido la anterior versin del lenguaje, no se lleg a modificar prcticamente. Aun
as, durante la vigencia de PHP 4, la programacin orientada a objetos fue utilizada habitualmente,
a menudo en aplicaciones de gran tamao. Entornos donde se puso de manifiesto la falta de
potencia de la POO en PHP 4 y la necesidad de mejorarla en una nueva versin.
El mayor problema de la POO en las versiones 3 y 4 de PHP se basaba en que, cada vez que se
asignaba una variable que contena un objeto a otra variable, o se pasaba un objeto por parmetro
en una funcin, se realizaba una copia (un clon) de ese objeto y quedaba a disposicin del
programa en la nueva variable o parmetro.
$pepe = new persona("pepe");
$pepe2 = $pepe;
En un cdigo como el anterior, se tiene un objeto persona alojado en la variable $pepe y en la
segunda lnea de cdigo, se crea un clon de $pepe y se asigna a la variable $pepe2. En este caso y
siempre siguiendo el anterior modo de trabajo de PHP, aunque $pepe y $pepe2 contienen un
objeto idntico, no se trata del mismo objeto sino de una copia. Todo esto implica que el espacio
en memoria para guardar los dos objetos es el doble que si fuera un mismo objeto con dos
nombres distintos.
Esta situacin ocurra porque los objetos eran tratados del mismo modo que las variables
normales, que se pasan por valor en las funciones y en caso de asignarse, se realiza una copia de la
variable antes de asignarse al nuevo espacio.

Ejemplo del modo de trabajo con objetos de PHP 3 y 4


Vamos a realizar un ejemplo para ilustrar el modo de trabajo de PHP 3 y 4 con los objetos. En este
ejemplo podr quedar patente el proceso de clonacin de los objetos al ser pasados en una
funcin o al asignarse a otra variable.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Primero veamos una declaracin de un objeto muy simple. Se trata de una "caja" que tiene un
atributo que es el contenido y dos mtodos, uno para introducir nuevos contenidos en la caja y
otro para mostrar el contenido actual de la caja.
class Caja{
var $contenido;
function introduce($cosa){
$this->contenido = $cosa;
}
function muestra_contenido(){
echo $this->contenido;
}
}
Ahora vamos a ver unas pocas lneas de cdigo que hacen uso de la clase Caja para ilustrar el
modo de trabajo de los objetos en PHP 4. Vamos a instanciar el objeto, luego lo asignamos a otra
variable, con lo que se crear un clon de ese objeto, continuamos modificando el clon y veremos
que pasa.
$micaja = new Caja();
$micaja->introduce("algo");
$micaja->muestra_contenido();
echo "<br>";
$segunda_caja = $micaja;
$segunda_caja->introduce("contenido en segunda caja");
$segunda_caja->muestra_contenido();
echo "<br>";
$micaja->muestra_contenido();
En la primera lnea de cdigo se instancia la caja y se aloja el objeto en la variable $micaja. En la
segunda lnea se introduce el string "algo" en el contenido de la caja. Luego se muestra el
contenido, con lo que saldr el string "algo" en la pgina web.
En el segundo bloque de cdigo se asigna el objeto $micaja a la variable $segunda_caja, con lo que
se crea el mencionado clon del objeto $micaja y se asigna a la nueva variable. Luego se introduce
un nuevo contenido a la instancia alojada en la variable $segunda_caja. Atencin aqu, porque se
ha modificado el clon alojado en la variable $segunda_caja, dejando inalterable el objeto original
$micaja.
Para comprobarlo, se muestra el contenido del objeto $segunda_caja, con lo que aparece en la
pgina web el string "contenido en segunda caja". Tambin se muestra el contenido de $micaja,
que no se ha modificado a pesar de actualizar el contenido de su clon, con lo que se muestra el
string "algo".
Espero que no sea demasiado difcil de entender. Podis hacer la prueba por vosotros mismos
para comprender bien el ejercicio. De todos modos, vamos a hacer otro ejemplo en el que se
utiliza la clase Caja, que esperamos sirva para aclarar mejor el trabajo con objetos en PHP 3 y 4.
$micaja = new Caja();
$micaja->introduce("algo");
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

$micaja->muestra_contenido();
echo "<br>";
function vacia_caja($caja_vaciar){
$caja_vaciar->introduce("polvo");
}
vacia_caja($micaja);
$micaja->muestra_contenido();
En este ejemplo hemos creado una funcin que recibe por parmetro un objeto de la clase caja.
Como los parmetros en las funciones se reciben por valor en lugar de referencia, cuando se pasa
el parmetro del objeto caja, en el fondo lo que se est realizando es una copia de ese objeto, de
modo que dentro de la funcin se trabaja con un clon del objeto, en lugar del objeto mismo.
En el cdigo se instancia el objeto caja y se introduce "algo" en su contenido. Luego, se declara
una funcin que recibe el objeto y modifica su contenido, introduciendo el string "polvo" en el
contenido de la caja. En las siguientes lneas de cdigo, se llama a la funcin declarada
anteriormente, pasando por parmetro el objeto $micaja. Dentro de la funcin, como deca, se
modifica el contenido de la caja, aunque realmente se est modificando el contenido de un clon.
Por ltimo, se muestra el contenido del objeto $micaja. En este caso aparece "algo", a pesar de
que en la funcin ese "algo" se modific por "polvo". A pesar de poder parecer pesado, vuelvo a
repetir que en la funcin se modific un clon del objeto y no el objeto original.
Los comportamientos descritos anteriormente no son muy habituales en otros lenguajes de
programacin orientada a objetos, como Java, donde el objeto no se duplica cada vez que se
realiza una asignacin o paso por parmetro.
Para evitar el comportamiento que hemos descrito, PHP dispone de la opcin de paso de
parmetros por referencia, que se realiza con el carcter "&". Por ejemplo, para asignar el propio
objeto y no un clon podramos haber utilizado este cdigo:
$segunda_caja = &$micaja;
Para recibir un parmetro por referencia en lugar de por valor en una funcin utilizaramos esta
declaracin de funcin:
function vacia_caja(&$caja_vaciar){
La posibilidad de utilizar el carcter "&" para forzar un paso por referencia no deja de ser un
problema, puesto que nos obliga a utilizar ese mecanismo en mltiples lugares y es muy fcil
olvidarse del "&" en algn sitio, con lo que nuestro programa ya no realizar los resultados
esperados. Muchos programadores han gastado horas en encontrar el problema y en cualquier
caso, es una molestia tener que estar pendientes de incluir constantemente el signo "&" en el
cdigo para hacer que funcione como ellos desean.

2.2. Modelo de orientacin a objetos en PHP 5


Cmo trabaja PHP 5 con la orientacin a objetos. Listado de las novedades con respecto a los
objetos en versiones anteriores.
En el artculo anterior comentamos las carencias del modelo de orientacin a objetos en PHP 3 y 4,
que afortunadamente han quedado solventadas en la versin PHP 5.
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Como decamos, uno de los problemas ms bsicos de las versiones anteriores de PHP era la
clonacin de objetos, que se realizaba al asignar un objeto a otra variable o al pasar un objeto por
parmetro en una funcin. Para solventar este problema PHP5 hace uso de los manejadores de
objetos (Object handles), que son una especie de punteros que apuntan hacia los espacios en
memoria donde residen los objetos. Cuando se asigna un manejador de objetos o se pasa como
parmetro en una funcin, se duplica el propio object handle y no el objeto en si.
Nota: Tambin se puede realizar una clonacin de un objeto, para obtener una copia exacta,
pero que no es el propio objeto. Para ello utilizamos una nueva instruccin llamada "clone", que
veremos ms adelante.

Algunas caractersticas del trabajo con POO en PHP 5


Veamos a continuacin una pequea lista de las nuevas caractersticas de la programacin
orientada a objetos (POO) en PHP5. No vamos a describir exhaustivamente cada caracterstica. Ya
lo haremos ms adelante en este mismo manual.
1.- Nombres fijos para los constructores y destructores
En PHP 5 hay que utilizar unos nombres predefinidos para los mtodos constructores y
destructores (Los que se encargan de resumir las tareas de inicializacin y destruccin de los
objetos. Ahora se han de llamar __construct() y __destruct().
2.- Acceso public, private y protected a propiedades y mtodos
A partir de ahora podemos utilizar los modificadores de acceso habituales de la POO. Estos
modificadores sirven para definir qu mtodos y propiedades de las clases son accesibles desde
cada entorno.
3.- Posibilidad de uso de interfaces
Las interfaces se utilizan en la POO para definir un conjunto de mtodos que implementa una
clase. Una clase puede implementar varias interfaces o conjuntos de mtodos. En la prctica, el
uso de interfaces es utilizado muy a menudo para suplir la falta de herencia mltiple de lenguajes
como PHP o Java. Lo explicaremos con detalle ms adelante.
4.- Mtodos y clases final
En PHP 5 se puede indicar que un mtodo es "final". Con ello no se permite sobrescribir ese
mtodo, en una nueva clase que lo herede. Si la clase es "final", lo que se indica es que esa clase
no permite ser heredada por otra clase.
5.- Operador instanceof
Se utiliza para saber si un objeto es una instancia de una clase determinada.
6.- Atributos y mtodos static
En PHP5 podemos hacer uso de atributos y mtodos "static". Son las propiedades y
funcionalidades a las que se puede acceder a partir del nombre de clase, sin necesidad de haber
instanciado un objeto de dicha clase.
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

7.- Clases y mtodos abstractos


Tambin es posible crear clases y mtodos abstractos. Las clases abstractas no se pueden
instanciar, se suelen utilizar para heredarlas desde otras clases que no tienen porque ser
abstractas. Los mtodos abstractos no se pueden llamar, se utilizan ms bien para ser heredados
por otras clases, donde no tienen porque ser declarados abstractos.
8.- Constantes de clase
Se pueden definir constantes dentro de la clase. Luego se pueden acceder dichas constantes a
travs de la propia clase.
9.- Funciones que especifican la clase que reciben por parmetro
Ahora se pueden definir funciones y declarar que deben recibir un tipo especfico de objeto. En
caso que el objeto no sea de la clase correcta, se produce un error.
10.- Funcin __autoload()
Es habitual que los desarrolladores escriban un archivo por cada clase que realizan, como tcnica
para organizar el cdigo de las aplicaciones. Por esa razn, a veces resulta tedioso realizar los
incluyes de cada uno de los cdigos de las clases que se utilizana en un script. La funcin
__autoload() sirve para intentar incluir el cdigo de una clase que se necesite, y que no haya sido
declarada todava en el cdigo que se est ejecutando.
11.- Clonado de objetos
Si se desea, se puede realizar un objeto a partir de la copia exacta de otro objeto. Para ello se
utiliza la instruccin "clone". Tambin se puede definir el mtodo __clone() para realizar tareas
asociadas con la clonacin de un objeto.

2.3. Clases en PHP 5


Vemos que es una clase, y como podemos definirlas e instanciarlas.

Clases en PHP 5
Las clases en Programacin orientada a objetos (POO) son definiciones de los elementos que
forman un sistema, en este caso, definiciones de los objetos que van a intervenir en nuestros
programas.
Un objeto se define indicando qu propiedades y funcionalidades tiene. Justamente esas
declaraciones son lo que es una clase. Cuando se hace una clase simplemente se especifica qu
propiedades y funcionalidades tiene. Por ejemplo, un hombre podra tener como propiedades el
nombre o la edad y como funcionalidades, comer, moverse o estudiar.
En la clase hombre declararamos dos atributos: la edad o el nombre, que seran como dos
variables. Tambin deberamos crear tres mtodos, con los procedimientos a seguir para que el
hombre pueda comer, moverse o estudiar. Estos mtodos se definen declarando funciones dentro
de la clase.
El cdigo para definir una clase se puede ver a continuacin:

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

class hombre{
var $nombre;
var $edad;
function comer($comida){
//aqu el cdigo del mtodo
}
function moverse($destino){
//aqu el cdigo del mtodo
}
function estudiar($asignatura){
//aqu el cdigo del mtodo
}
}
Podr comprobarse que este cdigo no difiere en nada del de las versiones anteriores de PHP, que
ya soportaban ciertas caractersticas de la POO. Esta situacin cambiar a poco que exploremos las
caractersticas ms avanzadas de PHP 5, que implicarn mejoras que no estaban presentes en las
versiones anteriores

Instanciar objetos a partir de clases


Hemos visto que una clase es tan slo una definicin. Si queremos trabajar con las clases debemos
instanciar objetos, proceso que consiste en generar un ejemplar de una clase.
Por ejemplo, tenemos la clase hombre anterior. Con la clase en si no podemos hacer nada, pero
podemos crear objetos hombre a partir de esa clase. Cada objeto hombre tendr unas
caractersticas propias, como la edad o el nombre. Adems podr desempear unas funciones
como comer o moverse, ahora bien, cada uno comer o se mover por su cuenta cuando le sea
solicitado, sin interferir en principio con lo que pueda estar haciendo otro hombre.
Ya que estamos, vamos a ver cmo se generaran un par de hombres, es decir, cmo se
instanciaran un par de objetos de la clase hombre. Para ello utilizamos el operador new.
$pepe = new hombre();
$juan = new hombre();

Conclusin
Es importante darse cuenta de la diferencia entre un objeto y una clase. La clase es una definicin
de unas caractersticas y funcionalidades, algo abstracto que se concreta con la instanciacin de un
objeto
de
dicha
clase.
Un objeto ya tiene propiedades, con sus valores concretos, y se le pueden pasar mensajes (llamar
a los mtodos) para que hagan cosas.

2.4. Constructores en PHP 5


Vamos a ver qu es un constructor y para que sirven, adems de un sencillo ejemplo de una
clase que define un constructor.
Los constructores se encargan de resumir las acciones de inicializacin de los objetos. Cuando se
instancia un objeto, se tienen que realizar varios pasos en su inicializacin, por ejemplo dar valores

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

a sus atributos y eso es de lo que se encarga el constructor. Los constructores pueden recibir unos
datos para inicializar los objetos como se desee en cada caso.
La sintaxis para la creacin de constructor vara con respecto a la de PHP 3 y 4, pues debe llamarse
con un nombre fijo: __construct(). (Son dos guiones bajos antes de la palabra "construct")
A lo largo de los ejemplos de este manual vamos a ir creando un cdigo para gestin de un
videoclub. Vamos a empezar definiendo una clase cliente, que utilizaremos luego en nuestro
programa.
class cliente{
var $nombre;
var $numero;
var $peliculas_alquiladas;
function __construct($nombre,$numero){
$this->nombre=$nombre;
$this->numero=$numero;
$this->peliculas_alquiladas=array();
}
function dame_numero(){
return $this->numero;
}
}
El constructor en esta clase recibe el nombre y nmero que asignar al cliente, que introduce luego
en sus correspondientes propiedades. Adems inicializa el atributo pelculas_alquiladas como un
array, en este caso vaco porque todava no tiene ninguna pelcula en su poder.
Nota: En programacin orientada a objetos $this hace referencia al objeto sobre el que se est
ejecutando el mtodo. En este caso, como se trata de un constructor, $this hace referencia al
objeto que se est construyendo. Con $this->nombre=$nombre; estamos asignando al atributo
nombre del objeto que se est construyendo el valor que contiene la variable $nombre, que se
ha recibido por parmetro.

Luego hemos creado un mtodo muy sencillo para poder utilizar el objeto. Vamos a ver unas
acciones simples para ilustrar el proceso de instanciacin y utilizacin de los objetos.
//instanciamos un par de objetos cliente
$cliente1 = new cliente("Pepe", 1);
$cliente2 = new cliente("Roberto", 564);
//mostramos el numero de cada cliente creado
echo "El identificador del cliente 1 es: " . $cliente1->dame_numero();
echo "El identificador del cliente 2 es: " . $cliente2->dame_numero();
Este ejemplo obtendra esta salida como resultado de su ejecucin:
El identificador del cliente 1 es: 1
El identificador del cliente 2 es: 564

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

2.5. Sobrecarga de constructores en PHP


Cmo podemos fabricar por nosotros mismos un sistema de sobrecarga de mtodos, no
soportada de manera nativa en PHP, en el caso especfico de constructores, tan importante para
la reutilizacin del cdigo.
La Programacin Orientada a Objetos (POO) en PHP tiene una carencia que considero fundamental
y quien venga de otros lenguajes la echar seriamente en falta. Se trata de la sobrecarga de
mtodos, que es uno de los pilares fundamentales que hace de la POO una gran forma de crear
software ms verstil y que reutilice ms cdigo.

En este artculo estudiaremos una alternativa muy sencilla, pero totalmente funcional para poder
simular la sobrecarga de mtodos, de modo que aprovechemos sus posibilidades tal como si fuera
algo nativamente soportado por PHP. En concreto, encararemos el problema con los mtodos
constructores, de modo que podamos construir objetos con distintos juegos de parmetros.

Por qu no hay sobrecarga de mtodos en PHP?


Al notar la falta de sobrecarga de mtodos en la Programacin Orientada a Objetos implementada
en PHP, uno se puede quedar pensando por qu no existe en PHP? no se trata de una POO
devaluada debido a la carencia de sobrecarga? cmo puedo hacer clases que tengan
constructores que acepten varios juegos de parmetros?
Despus de analizar la situacin, podemos observar que en PHP sufrimos la carencia de sobrecarga
debido a que es un lenguaje poco estricto. En el caso de las funciones, PHP tiene la particularidad
de permitir invocarlas enviando un juego de parmetros diferente al que fue declarada. Sin
invocamos una funcin sin enviarle todos los parmetros, PHP dar mensajes de advertencia, pero
el cdigo se ejecuta. Si al invocar una funcin enviamos ms parmetros de los que tocaba, ni
siquiera nos da un mensaje de advertencia.
Es por ello que no pueden coexistir funciones con el mismo nombre y distintos juegos de
parmetros, porque PHP siempre va a utilizar la funcin que se declare (una nica vez), enviando
los parmetros de que disponga en el momento se su invocacin.

Cmo simular la sobrecarga de mtodos constructores?


La salida que nos queda para aprovechar las posibilidades de la sobrecarga de mtodos es
programarla "a mano". Se trata de un proceso sencillo de incorporar, aunque no cabe duda de que
es ms bonito cuando est admitido por el lenguaje de manera nativa.
Nota: Este ejemplo lo hemos aplicado a constructores, pero podra servirnos crear un esquema
similar con el que sobrecargar cualquier mtodo que necesitemos. Puedes ver cmo son los
constructores de PHP en un artculo anterior.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

El truco est en tener un mtodo "genrico" que no recibe parmetros y un mtodo especfico
para cada nmero de parmetros que pensemos aceptar. El mtodo "genrico" lo declaramos sin
indicar ningn parmetro y dentro de su cdigo utilizar la funcin de PHP func_get_args(), que nos
permite de manera genrica extraer todos los parmetros que pueda estar recibiendo la funcin.
Una vez sabemos el nmero de parmetros que nos han enviado en tiempo de ejecucin,
podemos invocar a la funcin especfica que tiene el cdigo a ejecutar cuando se recibe ese
nmero concreto de parmetros.
Viendo el cdigo del siguiente ejemplo y leyendo sus comentarios podremos entender mejor esta
tcnica.
class jugador
{
private $nombre;
private $equipo;
function __construct()
{
//obtengo un array con los parmetros enviados a la funcin
$params = func_get_args();
//saco el nmero de parmetros que estoy recibiendo
$num_params = func_num_args();
//cada constructor de un nmero dado de parmtros tendr un nombre de
funcin
//atendiendo al siguiente modelo __construct1() __construct2()...
$funcion_constructor ='__construct'.$num_params;
//compruebo si hay un constructor con ese nmero de parmetros
if (method_exists($this,$funcion_constructor)) {
//si exista esa funcin, la invoco, reenviando los parmetros que recib en el
constructor original
call_user_func_array(array($this,$funcion_constructor),$params);
}
}
//ahora declaro una serie de mtodos constructores que aceptan diversos nmeros de
parmetros
function __construct0()
{
$this>__construct1("Annimo");
}
function __construct1($nombre)
{
$this>__construct2($nombre, "Sin equipo");
}
function __construct2($nombre, $equipo)
{
$this>nombre = $nombre;
$this>equipo = $equipo;
}
}
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Podran existir otros mecanismos para obtener sobrecarga de constructores en PHP, pero ste que
hemos visto creo que es el ms limpio y el que mejor respeta la filosofa de la Programacin
Orientada a Objetos.

2.6. Destructores en PHP 5


Explicacin de los destructores en PHP5 y ejemplos de funcionamiento.
Los destructores son funciones que se encargan de realizar las tareas que se necesita ejecutar
cuando un objeto deja de existir. Cuando un objeto ya no est referenciado por ninguna variable,
deja de tener sentido que est almacenado en la memoria, por tanto, el objeto se debe destruir
para liberar su espacio. En el momento de su destruccin se llama a la funcin destructor, que
puede realizar las tareas que el programador estime oportuno realizar.
La creacin del destructor es opcional. Slo debemos crearlo si deseamos hacer alguna cosa
cuando un objeto se elimine de la memoria.
El destructor es como cualquier otro mtodo de la clase, aunque debe declararse con un nombre
fijo: __destruct().
En el cdigo siguiente vamos a ver un destructor en funcionamiento. Aunque la accin que realiza
al destruirse el objeto no es muy til, nos puede servir bien para ver cmo trabaja.
class cliente{
var $nombre;
var $numero;
var $peliculas_alquiladas;
function __construct($nombre,$numero){
$this->nombre=$nombre;
$this->numero=$numero;
$this->peliculas_alquiladas=array();
}
function __destruct(){
echo "<br>destruido: " . $this->nombre;
}
function dame_numero(){
return $this->numero;
}
}
//instanciamos un par de objetos cliente
$cliente1 = new cliente("Pepe", 1);
$cliente2 = new cliente("Roberto", 564);
//mostramos el numero de cada cliente creado
echo "El identificador del cliente 1 es: " . $cliente1->dame_numero();
echo "<br>El identificador del cliente 2 es: " . $cliente2->dame_numero();
Este cdigo es igual que el anterior. Slo se ha aadido el destructor, que imprime un mensaje en
pantalla con el nombre del cliente que se ha destruido. Tras su ejecucin obtendramos la
siguiente salida.
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

El identificador del cliente 1 es: 1


El identificador del cliente 2 es: 564
destruido: Pepe
destruido: Roberto
Como vemos, antes de acabar el script, se libera el espacio en memoria de los objetos, con lo que
se ejecuta el destructor y aparece el correspondiente mensaje en la pgina.
Un objeto puede quedar sin referencias y por lo tanto ser destruido, por muchas razones. Por
ejemplo, el objeto puede ser una variable local de una funcin y al finalizarse la ejecucin de esa
funcin la variable local dejara de tener validez, con lo que debe destruirse.
El cdigo siguiente ilustra cmo una variable local a cualquier mbito (por ejemplo, local a una
funcin), se destruye cuando ese mbito ha finalizado.
function crea_cliente_local(){
$cliente_local = new cliente("soy local", 5);
}
crea_cliente_local()
La funcin simplemente crea una variable local que contiene la instanciacin de un cliente.
Cuando la funcin se acaba, la variable local deja de existir y por lo tanto se llama al destructor
definido para ese objeto.
Nota: Tambin podemos deshacernos de un objeto sin necesidad que acabe el mbito donde
fue creado. Para ello tenemos la funcin unset() que recibe una variable y la elimina de la
memoria. Cuando se pierde una variable que contiene un objeto y ese objeto deja de tener
referencias, se elimina al objeto y se llama al destructor.

2.7. Modificadores de acceso a mtodos y propiedades en


PHP5
Son los Public, Protected y Private, que pueden conocerse porque ya se utilizan en otros
lenguajes orientados a objetos.
Veremos en este captulo los nuevos modificadores de acceso a los mtodos y atributos de los
objetos que se han incorporado en PHP 5. Estos modificadores de acceso no son otros que los
conocidos public, protected y private, que ya disponen otros lenguajes como Java.
Uno de los principios de la programacin orientada a objetos es la encapsulacin, que es un
proceso por el que se ocultan las caractersticas internas de un objeto a aquellos elementos que
no tienen porque conocerla. Los modificadores de acceso sirven para indicar los permisos que
tendrn otros objetos para acceder a sus mtodos y propiedades.

Modificador public
Es el nivel de acceso ms permisivo. Sirve para indicar que el mtodo o atributo de la clase es
pblico. En este caso se puede acceder a ese atributo, para visualizarlo o editarlo, por cualquier
otro elemento de nuestro programa. Es el modificador que se aplica si no se indica otra cosa.
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Veamos un ejemplo de clase donde hemos declarado como public sus elementos, un mtodo y
una propiedad. Se trata de la clase "dado", que tiene un atributo con su puntuacin y un mtodo
para tirar el dado y obtener una nueva puntuacin aleatoria.
class dado{
public $puntos;
function __construct(){
srand((double)microtime()*1000000);
}
public function tirate(){
$this->puntos=$randval = rand(1,6);
}
}
$mi_dado = new dado();
for ($i=0;$i<30;$i++){
$mi_dado->tirate();
echo "<br>Han salido " . $mi_dado->puntos . " puntos";
}
Vemos la declaracin de la clase dado y luego unas lneas de cdigo para ilustrar su
funcionamiento. En el ejemplo se realiza un bucle 30 veces, en las cuales se tira el dado y se
muestra la puntuacin que se ha obtenido.
Como el atributo $puntos y el mtodo tirate() son pblicos, se puede acceder a ellos desde fuera
del objeto, o lo que es lo mismo, desde fuera del cdigo de la clase.

Modificador private
Es el nivel de acceso ms restrictivo. Sirve para indicar que esa variable slo se va a poder acceder
desde el propio objeto, nunca desde fuera. Si intentamos acceder a un mtodo o atributo
declarado private desde fuera del propio objeto, obtendremos un mensaje de error indicando que
no es posible a ese elemento.
Si en el ejemplo anterior hubiramos declarado private el mtodo y la propiedad de la clase dado,
hubiramos recibido un mensaje de error.
Aqu tenemos otra posible implementacin de la clase dado, declarando como private el atributo
puntos y el mtodo tirate().
class dado{
private $puntos;
function __construct(){
srand((double)microtime()*1000000);
}
private function tirate(){
$this->puntos=$randval = rand(1,6);
}
public function dame_nueva_puntuacion(){
$this->tirate();
return $this->puntos;
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

}
}
$mi_dado = new dado();
for ($i=0;$i<30;$i++){
echo "<br>Han salido " . $mi_dado->dame_nueva_puntuacion() . " puntos";
}
Hemos tenido que crear un nuevo mtodo pblico para operar con el dado, porque si es todo
privado no hay manera de hacer uso de l. El mencionado mtodo es dame_nueva_puntuacin(),
que realiza la accin de tirar el dado y devolver el valor que ha salido.

Modificador protected
Este indica un nivel de acceso medio y un poco ms especial que los anteriores. Sirve para que el
mtodo o atributo sea pblico dentro del cdigo de la propia clase y de cualquier clase que herede
de aquella donde est el mtodo o propiedad protected. Es privado y no accesible desde cualquier
otra parte. Es decir, un elemento protected es pblico dentro de la propia clase y en sus
heredadas.
Ms adelante explicaremos la herencia y podremos ofrecer ejemplos con el modificador
protected.

Conclusin
Muchas veces el propio desarrollador es el que fija su criterio a la hora de aplicar los distintos
modificadores de acceso a atributos y mtodos. Poca proteccin implica que los objetos pierdan
su encapsulacin y con ello una de las ventajas de la POO. Una proteccin mayor puede hacer ms
laborioso de generar el cdigo del programa, pero en general es aconsejable.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

3.Herencia en PHP 5
Los mecanismos de herencia son una de las herramientas fundamentales que disponen los
desarrolladores en la programacin orientada a objetos. Vemos cmo funciona en PHP 5.

3.1. La herencia en PHP5


Explicamos la herencia en PHP 5, un proceso por el cual los objetos pueden heredar las
caractersticas de otros, de modo que se pueden hacer objetos especializados, basados en otros
ms generales.
La herencia es uno de los mecanismos fundamentales de la programacin orientada a objetos. Por
medio de la herencia, se pueden definir clases a partir de la declaracin de otras clases. Las clases
que heredan incluyen tanto los mtodos como las propiedades de la clase a partir de la que estn
definidos.
Por ejemplo, pensemos en la clase "vehculo". Esta clase general puede incluir las caractersticas
generales de todos los vehculos (atributos de la clase), como la matrcula, ao de fabricacin y
potencia. Adems, incluir algunas funcionalidades (mtodos de la clase) como podran ser,
arrancar() o moverse().
Ahora bien, en la prctica existen varios tipos de vehculos, como los coches, los autobuses y los
camiones. Todos ellos tienen unas caractersticas comunes, que han sido definidas en la clase
vehculo. Adems, tendrn una serie de caractersticas propias del tipo de vehculo, que, en
principio, no tienen otros tipos de vehculos. Por ejemplo, los camiones pueden tener una carga
mxima permitida o los autobuses un nmero de plazas disponibles. Del mismo modo, las clases
ms especficas pueden tener unas funcionalidades propias, como los camiones cargar() y
descargar(), o los autobuses aceptar_pasajeros() o vender_billete().
Lo normal en sistemas de herencia es que las clases que heredan de otras incluyan nuevas
caractersticas y funcionalidades, aparte de los atributos y mtodos heredados. Pero esto no es
imprescindible, de modo que se pueden crear objetos que hereden de otros y no incluyan nada
nuevo.

Sintaxis de herencia en PHP 5


La programacin orientada a objetos nos ofrece una serie de mecanismos para definir este tipo de
estructuras, de modo que se puedan crear jerarquas de objetos que heredan unos de otros.
Veremos ahora cmo definir estas estructuras de herencia en PHP 5. Para ello, continuando con
nuestro ejemplo de video club, vamos a crear los distintos tipos de elementos que se ofrecen en
alquiler.
Como todo el mundo conoce, los video clubs ofrecen distintos tipos de elementos para alquiler,
como pueden ser las pelculas (cintas de vdeo o DVD) y los juegos. Cada elemento tiene unas
caractersticas propias y algunas comunes. Hemos llamado "soporte" a la clase general, que
incluye las caractersticas comunes para todos los tipos de elementos en alquiler. Luego hemos
creado tres tipos de soportes distintos, que heredan de la clase soporte, pero que incluyen algunas
caractersticas y funcionalidades nuevas. Estos tipos de soporte sern "cinta_video", "dvd" y
"juego".
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

El esquema de herencia que vamos a realizar en este ejemplo se puede ver en la siguiente imagen.

Empezamos por la clase soporte. Su cdigo ser el siguiente:


class soporte{
public $titulo;
protected $numero;
private $precio;
function __construct($tit,$num,$precio){
$this->titulo = $tit;
$this->numero = $num;
$this->precio = $precio;
}
public function dame_precio_sin_iva(){
return $this->precio;
}
public function dame_precio_con_iva(){
return $this->precio * 1.16;
}
public function dame_numero_identificacion(){
return $this->numero;
}
public function imprime_caracteristicas(){
echo $this->titulo;
echo "<br>" . $this->precio . " (IVA no incluido)";
}
}
Los atributos que hemos definido son, ttulo, numero (un identificador del soporte) y precio.
Hemos aplicado a cada uno un modificador de acceso distinto, para poder practicar los distintos
tipos de acceso.
Hemos definido un constructor, que recibe los valores para la inicializacin del objeto. Un mtodo
dame_precio_sin_iva(), que devuelve el precio del soporte, sin aplicarle el IVA. Otro mtodo
dame_precio_con_iva(), que devuelve el precio una vez aplicado el 16% de IVA. El mtodo
dame_numero_identificacion(),
que
devuelve
el
nmero
de
identificador
y
imprime_caracteristicas(), que muestra en la pgina las caractersticas de este soporte.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Nota: Como se ha definido como private el atributo precio, este atributo slo se podr acceder
dentro del cdigo de la clase, es decir, en la propia definicin del objeto. Si queremos acceder al
precio desde fuera de la clase (algo muy normal si tenemos en cuenta que vamos a necesitar el
precio de un soporte desde otras partes de la aplicacin) ser necesario crear un mtodo que
nos devuelva el valor del precio. Este mtodo debera definirse como public, para que se pueda
acceder desde cualquier sitio que se necesite.
En todos los mtodos se hace uso de la variable $this. Esta variable no es ms que una referencia
al objeto sobre el que se est ejecutando el mtodo. En programacin orientada a objetos, para
ejecutar cualquiera de estos mtodos, primero tenemos que haber creado un objeto a partir de
una clase. Luego podremos llamar los mtodos de un objeto. Esto se hace con $mi_objeto>metodo_a_llamar(). Dentro de mtodo, cuando se utiliza la variable $this, se est haciendo
referencia al objeto sobre el que se ha llamado al mtodo, en este caso, el objeto $mi_objeto. Con
$this->titulo estamos haciendo referencia al atributo "titulo" que tiene el objeto $mi_objeto.
Si queremos probar la clase soporte, para confirmar que se ejecuta correctamente y que ofrece
resultados coherentes, podemos utilizar un cdigo como el siguiente.
$soporte1 = new soporte("Los Intocables",22,3);
echo "<b>" . $soporte1->titulo . "</b>";
echo "<br>Precio: " . $soporte1->dame_precio_sin_iva() . " euros";
echo "<br>Precio IVA incluido: " . $soporte1->dame_precio_con_iva() . " euros";
En este caso hemos creado una instancia de la clase soporte, en un objeto que hemos llamado
$soporte1. Luego imprimimos su atributo titulo (como el ttulo ha sido definido como public,
podemos acceder a l desde fuera del cdigo de la clase.
Luego se llaman a los mtodos dame_precio_sin_iva() y dame_precio_con_iva() para el objeto
creado.
Nos dara como resultado esto:
Los Intocables
Precio: 3 euros
Precio IVA incluido: 3.48 euros
En siguientes captulos vamos a ver cmo definir clases que hereden de la clase soporte.

3.2. La herencia en PHP 5, Segunda parte


Continuamos con los mecanismos de herencia en PHP5. Creamos clases que heredan de otra
clase y aprendemos a sobrescribir mtodos.
Como estamos viendo, los mecanismos de herencia en PHP5 son similares a los existentes en otros
lenguajes de programacin. Ahora vamos a relatar cmo construir una clase que hereda de otra.
Continuando con nuestro ejemplo de videoclub, vamos a construir una clase para los soportes de
tipo cinta de video. Las cintas de vdeo tienen un atributo nuevo que es la duracin de la cinta. No
tienen ninguna clase nueva, aunque debemos aprender a sobrescribir mtodos creados para el
soporte, dado que ahora tienen que hacer tareas ms especficas.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Sobrescribir mtodos
Antes de mostrar el cdigo de la clase cinta_video, vamos a hablar sobre la sobrescritura o
sustitucin de mtodos, que es un mecanismo por el cual una clase que hereda puede redefinir los
mtodos que est heredando.
Pensemos en una cafetera. Sabemos que existen muchos tipos de cafeteras y todas hacen caf,
pero el mecanismo para hacer el caf es distinto dependiendo del tipo de cafetera. Existen
cafeteras express, cafeteras por goteo y hasta se puede hacer caf con un calcetn. Nuestra
cafetera "padre" (de la que va a heredar todas las cafeteras) puede tener definido un mtodo
hacer_cafe(), pero no necesariamente todas las cafeteras que puedan heredar de esta hacen el
caf siguiendo el mismo proceso.
Entonces podemos definir un mtodo para hacer caf estndar, que tendra la clase cafetera. Pero
al definir las clases cafetera_express y cafetera_goteo, deberamos sobrescribir el mtodo
hacer_cafe() para que se ajuste al procedimiento propio de estas.
La sobrescritura de mtodos es algo bastante comn en mecanismos de herencia, puesto que los
mtodos que fueron creados para una clase "padre" no tienen por qu ser los mismos que los
definidos en las clases que heredan.
Veremos cmo sobrescribir o sustituir mtodos en un ejemplo de herencia, siguiendo nuestro
ejemplo de videoclub.

Sintaxis para heredar en PHP 5


Habamos comentado que el videoclub dispone de distintos elementos para alquilar, como cintas
de vdeo, DVD o juegos. Habamos creado una clase soporte, que vamos a heredar en cada uno de
los elementos disponibles para alquiler. Vamos a empezar por la clase cinta_video, cuyo cdigo
ser el siguiente.
class cinta_video extends soporte{
private $duracion;
function __construct($tit,$num,$precio,$duracion){
parent::__construct($tit,$num,$precio);
$this->duracion = $duracion;
}
public function imprime_caracteristicas(){
echo "Pelcula en VHS:<br>";
parent::imprime_caracteristicas();
echo "<br>Duracin: " . $this->duracion;
}
}
Con la primera lnea class cinta_video extends soporte estamos indicando que se est definiendo
la clase cinta_video y que va a heredar de la clase soporte.
Nota: Como se est heredando de una clase, PHP tiene que conocer el cdigo de la clase
"padre", en este caso la clase soporte. De modo que el cdigo de la clase soporte debe estar
incluido dentro del archivo de la clase cinta_video. Podemos colocar los dos cdigos en el

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

mismo fichero, o si estn en ficheros independientes, debemos incluir el cdigo de la clase


soporte con la instruccin include o require de PHP.
En la clase cinta_video hemos definido un nuevo atributo llamado $duracion, que almacena el
tiempo que dura la pelcula.
Aunque la clase sobre la que heredamos (la clase soporte) tena definido un constructor, la cinta
de vdeo debe inicializar la nueva propiedad $duracion, que es especfica de las cintas de video.
Por ello, vamos a sobrescribir o sustituir el mtodo constructor, lo que se hace simplemente
volviendo a escribir el mtodo. La gracia aqu consiste en que el sistema puede basar la nueva
declaracin del constructor en la declaracin que exista para la clase de la que hereda.
Es decir, ya se haba definido un constructor para la clase soporte, que inicializaba los atributos de
esta clase. Ahora, para la clase cinta_video, hay que inicializar los atributos definidos en la clase
soporte, ms el atributo $duracion, que es propio de cinta_video.
El cdigo del constructor es el siguiente:
function __construct($tit,$num,$precio,$duracion){
parent::__construct($tit,$num,$precio);
$this->duracion = $duracion;
}
En la primera lnea del constructor se llama al constructor creado para la clase "soporte". Para ello
utilizamos parent:: y luego el nombre del mtodo de la clase padre al que se quiere llamar, en este
caso __constructor(). Al constructor de la clase padre le enviamos las variables que se deben
inicializar con la clase padre.
En la segunda lnea del constructor se inicializa el atributo duracion, con lo que hayamos recibido
por parmetro.
Nos pasa lo mismo con el mtodo imprime_caracteristicas(), que ahora debe mostrar tambin el
nuevo atributo, propio de la clase cinta_video. Como se puede observar en el cdigo de la funcin,
se hace uso tambin de parent::imprime_caracteristicas() para utilizar el mtodo definido en la
clase padre.
Si queremos probar la clase cinta_video, podriamos utilizar un cdigo como este:
$micinta = new cinta_video("Los Otros", 22, 4.5, "115 minutos");
echo "<b>" . $micinta->titulo . "</b>";
echo "<br>Precio: " . $micinta->dame_precio_sin_iva() . " euros";
echo "<br>Precio IVA incluido: " . $micinta->dame_precio_con_iva() . " euros";
Lo que nos devolvera lo siguiente:
Los Otros
Precio: 4.5 euros
Precio IVA incluido: 5.22 euros
Pelcula en VHS:
Los Otros
4.5 (IVA no incluido)
Duracin: 115 minutos
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

3.3. La herencia en PHP5, Tercera parte


Creamos otras clases a partir de una clase padre, para continuar con nuestro ejemplo de
videoclub.
La clase soporte tiene otras clases que heredan de ella y que todava no hemos definido.
Veamos primero el cdigo de la clase "dvd", que es muy parecido al visto para la clase cinta_video.
Lo nico que cambia es que ahora vamos a definir otros atributos relacionados con los DVD, como
son los idiomas disponibles en el DVD y el formato de pantalla que tiene la grabacin.
class dvd extends soporte{
public $idiomas_disponibles;
private $formato_pantalla;
function __construct($tit,$num,$precio,$idiomas,$pantalla){
parent::__construct($tit,$num,$precio);
$this->idiomas_disponibles = $idiomas;
$this->formato_pantalla = $pantalla;
}
public function imprime_caracteristicas(){
echo "Pelcula en DVD:<br>";
parent::imprime_caracteristicas();
echo "<br>" . $this->idiomas_disponibles;
}
}
Nota:Para una explicacin detallada de este cdigo os referimos al captulo anterior,
donde se explicaba la clase cinta_video y la sobrescritura de mtodos.
Por su parte, la clase juego, tendr 3 nuevos atributos. Estos son "consola", para especificar la
consola para la que est creado este juego, "min_num_jugadores", para especificar el nmero de
jugadores mnimo y "max_num_jugadores", para especificar el mximo nmero de jugadores que
pueden participar en el juego.
Este ser el cdigo de la clase juego.
class juego extends soporte{
public $consola; //nombre de la consola del juego ej: playstation
private $min_num_jugadores;
private $max_num_jugadores;
function __construct($tit,$num,$precio,$consola,$min_j,$max_j){
parent::__construct($tit,$num,$precio);
$this->consola = $consola;
$this->min_num_jugadores = $min_j;
$this->max_num_jugadores = $max_j;
}
public function imprime_jugadores_posibles(){
if ($this->min_num_jugadores == $this->max_num_jugadores){
if ($this->min_num_jugadores==1)
echo "<br>Para un jugador";
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

else
echo "<br>Para " . $this->min_num_jugadores . " jugadores";
}else{
echo "<br>De " . $this->min_num_jugadores . " a " . $this->max_num_jugadores . "
Jugadores.";
}
}
public function imprime_caracteristicas(){
echo "Juego para: " . $this->consola . "<br>";
parent::imprime_caracteristicas();
echo "<br>" . $this->imprime_jugadores_posibles();
}
}
Nos fijamos en el constructor, que llama al constructor de la clase padre para inicializar algunos
atributos propios de los soportes en general.
Luego nos fijamos en el mtodo imprime_jugadores_posibles(), que muestra los jugadores
permitidos. Ha sido declarada como public, para que se pueda acceder a ella desde cualquier
lugar. Nos da un mensaje como "Para un jugador" o "De 1 a 2 Jugadores", dependiendo de los
valores min_num_jugadores y max_num_jugadores.
Por su parte, se sobrescribe la funcin imprime_caracteristicas(), para mostrar todos los datos de
cada juego. Primero se muestra la consola para la que se ha creado el juego. Los datos generales
(propios de la clase "soporte") se muestran llamando al mismo mtodo de la clase "parent" y el
nmero de jugadores disponibles se muestra con una llamada al mtodo
imprime_jugadores_posibles().
Podramos utilizar un cdigo como el que sigue, si es que queremos comprobar que la clase
funciona correctamente y que nos ofrece la salida que estbamos pensando.
$mijuego = new juego("Final Fantasy", 21, 2.5, "Playstation",1,1);
$mijuego->imprime_caracteristicas();
//esta lnea dara un error porque no se permite acceder a un atributo private del objeto
//echo "<br>Jugadores: " . $mijuego->min_num_jugadores;
//habria que crear un mtodo para que acceda a los atributos private
$mijuego->imprime_jugadores_posibles();
echo "<p>";
$mijuego2 = new juego("GP Motoracer", 27, 3, "Playstation II",1,2);
echo "<b>" . $mijuego2->titulo . "</b>";
$mijuego2->imprime_jugadores_posibles();
Este cdigo que utiliza la clase "juego" dar como salida:
Juego para: Playstation
Final Fantasy
2.5 (IVA no incluido)
Para un jugador
Para un jugador
GP Motoracer
De 1 a 2 Jugadores.
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

4.Programacin orientada a objetos en PHP 5


por la prctica
Continuamos mostrando muchas de las prcticas habituales que llevan a cabo los programadores
con la orientacin a objetos. Vemos cmo se implementa todo a travs de ejemplos en PHP 5.

4.1. Los atributos de los objetos pueden ser otros objetos


Los atributos o propiedades de los objetos pueden ser de cualquier tipo, incluso pueden ser otros
objetos.
Las caractersticas de los objetos, que se almacenan por medio de los llamados atributos o
propiedades, pueden ser de diversa naturaleza. La clase hombre puede tener distintos tipos de
atributos, como la edad (numrico), el nombre propio (tipo cadena de caracteres), color de piel
(que puede ser un tipo cadena de caracteres o tipo enumerado, que es una especie de variable
que slo puede tomar unos pocos valores posibles). Tambin puede tener una estatura o un peso
(que podran ser de tipo float o nmero en coma flotante).
En general, podemos utilizar cualquier tipo para los atributos de los objetos, incluso podemos
utilizar otros objetos. Por ejemplo, podramos definir como atributo de la clase hombre sus manos.
Dada la complejidad de las manos, estas podran definirse como otro objeto. Por ejemplo, las
manos tendran como caractersticas la longitud de los dedos, un coeficiente de elasticidad. Como
funcionalidades o mtodos, podramos definir agarrar algo, soltarlo, pegar una bofetada, o
cortarse las uas. As pues, uno de los atributos de la clase hombre podra ser un nuevo objeto,
con su propias caractersticas y funcionalidades. La complejidad de las manos no le importa al
desarrollador de la clase hombre, por el principio de encapsulacin, dado que este conoce sus
propiedades (o aquellas declaradas como public) y los mtodos (tambin los que se hayan
decidido declarar como pblicos) y no necesita preocuparse sobre cmo se han codificado.

Clase cliente del videoclub


Para continuar el ejemplo del videoclub, hemos creado la clase cliente que vamos a explicar a
continuacin. En los clientes hemos definido como atributo, entre otros, las pelculas o juegos
alquilados.
Nota:Como vemos, los objetos pueden tener algunos atributos tambin de tipo objeto. En
ese caso pueden haber distintos tipos de relaciones entre objetos. Por ejemplo, por
pertenencia, como en el caso de la clase hombre y sus manos, pues a un hombre le
pertenecen sus manos. Tambin se pueden relacionar los objetos por asociacin, como es el
caso de los clientes y las pelculas que alquilan, pues en ese caso un cliente no tiene una
pelcula propiamente dicha, sino que se asocia con una pelcula momentneamente.
La clase cliente que hemos creado tiene cierta complejidad, esperamos que no sea demasiada
para que se pueda entender fcilmente. La explicaremos poco a poco para facilitar las cosas.
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Atributos de la clase cliente


Hemos definido una serie de atributos para trabajar con los clientes. Tenemos los siguientes:
public $nombre;
private $numero;
private $soportes_alquilados;
private $num_soportes_alquilados;
private $max_alquiler_concurrente;
Como se puede ver, se han definido casi todos los atributos como private, con lo que slo se
podrn acceder dentro del cdigo de la clase.
El atributo nombre, que guarda el nombre propio del cliente, es el nico que hemos dejado como
pblico y que por tanto se podr referenciar desde cualquier parte del programa, incluso desde
otras clases. El atributo numero se utiliza para guardar el identificador numrico del cliente. Por su
parte, soportes alquilados nos servir para asociar al cliente las pelculas o juegos cuando este las
alquile. El atributo num_soportes_alquilados almacenar el nmero de pelculas o juegos que un
cliente tiene alquilados en todo momento. Por ltimo, max_alquiler_concurrente indica el nmero
mximo de soportes que puede tener alquilados un cliente en un mismo instante, no
permitindose alquilar a ese cliente, a la vez, ms que ese nmero de pelculas o juegos.
El nico atributo sobre el que merece la pena llamar la atencin es soportes_alquilados, que
contendr un array de soportes. En cada casilla del array se introducirn las pelculas o juegos que
un cliente vaya alquilando, para asociar esos soportes al cliente que las alquil. El array contendr
tantas casillas como el max_alquiler_concurrente, puesto que no tiene sentido asignar mayor
espacio al array del que se va a utilizar. Para facilitar las cosas, cuando un cliente no tiene
alquilado nada, tendr el valor null en las casillas del array.
Nota:Recordemos que los soportes fueron definidos en captulos anteriores de este manual
de PHP 5 , mediante un mecanismo de herencia. Soporte era una clase de la que heredaban
las pelculas en DVD, las cintas de vdeo y los juegos.
Constructor de la clase cliente
function __construct($nombre,$numero,$max_alquiler_concurrente=3){
$this->nombre=$nombre;
$this->numero=$numero;
$this->soportes_alquilados=array();
$this->num_soportes_alquilados=0;
$this->max_alquiler_concurrente = $max_alquiler_concurrente;
//inicializo las casillas del array de alquiler a "null"
//un valor "null" quiere decir que el no hay alquiler en esa casilla
for ($i=0;$i<$max_alquiler_concurrente;$i++){
$this->soportes_alquilados[$i]=null;
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

}
}
El constructor de la clase cliente recibe los datos para inicializar el objeto. Estos son $nombre,
$numero y $max_alquiler_concurrente. Si nos fijamos, se ha definido por defecto a 3 el nmero
mximo de alquileres que puede tener un cliente, de modo que, en el caso de que la llamada al
constructor no enve el parmetro $max_alquiler_concurrente se asumir el valor 3.
El atributo soportes_alquilados, como habamos adelantado, ser un array que tendr tantas
casillas como el mximo de alquileres concurrentes. En las ltimas lneas se inicializan a null el
contenido de las casillas del array.

4.2. Los atributos de los objetos pueden ser otros objetos,


2 parte
Mtodo dame_numero()
function dame_numero(){
return $this->numero;
}
Este mtodo simplemente devuelve el numero de identificacin del cliente. Como se ha definido el
atributo numero como private, desde fuera del cdigo de la clase, slo se podr acceder a este a
travs del mtodo dame_numero().
Mtodo tiene_alquilado($soporte)
function tiene_alquilado($soporte){
for ($i=0;$i<$this->max_alquiler_concurrente;$i++){
if (!is_null($this->soportes_alquilados[$i])){
if
($this->soportes_alquilados[$i]->dame_numero_identificacion()
>dame_numero_identificacion()){
return true;
}
}
}
//si estoy aqui es que no tiene alquilado ese soporte
return false;
}

==

$soporte-

Este recibe un soporte y devuelve true si est entre los alquileres del cliente. Devuelve false en
caso contrario.
A este mtodo lo llamamos desde dentro de la clase cliente, en la codificacin de otro mtodo.
Podramos haber definido entonces el mtodo como private, si penssemos que slo lo vamos a
utilizar desde dentro de esta clase. En este caso lo hemos definido como public (el modificador por
defecto) porque pensamos que puede ser til para otras partes del programa.
Este mtodo recibe un soporte (cualquier tipo de soporte, tanto cintas de vdeo, como DVDs o
juegos). Realiza un recorrido por el array de soportes alquilados preguntando a cada soporte que
tenga alquilado el cliente si su nmero de identificacin es igual que el del soporte recibido por
parmetro. Como el nmero de identificacin del soporte est definido como private en la clase
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

soporte, para acceder a su


dame_numero_identificacin().

valor

tenemos

que

utilizar

el

mtodo

de

soporte

Otra cosa importante. Como no es seguro que en el array de soportes alquilados haya algn
soporte (recordamos que si el cliente no tiene nada alquilado las casillas estn a null), antes de
llamar a ningn mtodo del soporte debemos comprobar que realmente existe. Esto se hace con
la funcin is_null() a la que le enviamos la casilla del array donde queremos comprobar si existe un
soporte. Si la funcin is_null() devuelve true es que tiene almacenado el valor null, con lo que
sabremos que no hay soporte. De manera contraria, si la casilla almacena un soporte, la funcin
is_null() devolver false.
Mtodo alquila($soporte)
function alquila($soporte){
if ($this->tiene_alquilado($soporte)){
echo "<p>El cliente ya tiene alquilado el soporte <b>" . $soporte->titulo . "</b>";
}elseif ($this->num_soportes_alquilados==$this->max_alquiler_concurrente){
echo "<p>Este cliente tiene " . $this->num_soportes_alquilados . " elementos alquilados. ";
echo "No puede alquilar ms en este videoclub hasta que no devuelva algo";
}else{
//miro en el array a ver donde tengo sitio para meter el soporte
$cont = 0;
while (!is_null($this->soportes_alquilados[$cont])){
$cont++;
}
$this->soportes_alquilados[$cont]=$soporte;
$this->num_soportes_alquilados++;
echo "<p><b>Alquilado soporte a: </b>" . $this->nombre . "<br>";
$soporte->imprime_caracteristicas();
}
}
Este mtodo sirve para alquilar una pelcula o juego por parte del cliente. Recibe el soporte a
alquilar y, en caso que el alquiler se pueda producir, debe introducir el objeto soporte recibido en
el array de soportes alquilados del cliente.
Lo primero que hace es comprobar que el cliente no tiene alquilado ese mismo soporte, utilizando
el mtodo tiene_alquilado() de la clase soporte. Si no lo tiene alquilado comprueba que todava
tiene capacidad para alquilar otro soporte, es decir, que no ha llegado al mximo en el nmero de
soportes alquilados.
Si se puede alquilar el soporte, lo introduce dentro del array soportes_alquilados en una posicin
vaca (una casilla donde antes hubiera un null), incrementa en uno el nmero de soportes
alquilados e imprime las caractersticas del soporte que se ha alquilado.
Mtodo devuelve($identificador_soporte)
function devuelve($identificador_soporte){
if ($this->num_soportes_alquilados==0){
echo "<p>Este cliente no tiene alquilado ningn elemento";
return false;
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

}
//recorro el array a ver si encuentro el soporte con identificador recibido
for ($i=0;$i<$this->max_alquiler_concurrente;$i++){
if (!is_null($this->soportes_alquilados[$i])){
if ($this->soportes_alquilados[$i]->dame_numero_identificacion() == $identificador_soporte){
echo "<p>Soporte devuelto: " . $identificador_soporte;
echo " <b>" . $this->soportes_alquilados[$i]->titulo . "</b>";
$this->soportes_alquilados[$i]=null;
$this->num_soportes_alquilados--;
return true;
}
}
}
//si estoy aqui es que el cliente no tiene ese soporte alquilado
echo "<p>No se ha podido encontrar el soporte en los alquileres de este cliente";
return false;
}
El mtodo devuelve recibe el identificador del soporte que debe devolver el cliente. Devuelve true
si se consigui devolver el soporte, false en caso contrario. Lo primero que hace es comprobar si el
cliente tiene alquilado algn soporte, comprobando que la variable num_soportes_alquilados no
sea cero.
Luego hace un recorrido por el array de soportes alquilados para ver si encuentra el soporte que
se desea devolver. Para cada soporte alquilado (cada casilla del array que no contenga el valor
null) comprueba si el identificador es el mismo que el recibido por parmetro. Cuando encuentra
el soporte, muestra un mensaje por pantalla y lo devuelve simplemente poniendo a null la casilla
correspondiente del array soportes_alquilados y decrementando en uno el atributo
num_soportes_alquilados.
Si se encuentra el soporte, se sale de la funcin devolviendo true. Por lo que, si no se ha salido de
la funcin despus de hacer el recorrido por el array, sabemos que no se ha encontrado ese
soporte. Entonces mostramos un mensaje en pantalla y devolvemos false.
Mtodo lista_alquileres()
function lista_alquileres(){
if ($this->num_soportes_alquilados==0){
echo "<p>Este cliente no tiene alquilado ningn elemento";
}else{
echo "<p><b>El cliente tiene " . $this->num_soportes_alquilados . " soportes alquilados</b>";
//recorro el array para listar los elementos que tiene alquilados
for ($i=0;$i<$this->max_alquiler_concurrente;$i++){
if (!is_null($this->soportes_alquilados[$i])){
echo "<p>";
$this->soportes_alquilados[$i]->imprime_caracteristicas();
}
}
}
}
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Este mtodo hace un recorrido por el array de soportes alquilados y muestra las caractersticas de
cada soporte. Comprueba que el cliente tiene algo alquilado antes de hacer el recorrido.
Recordar siempre, antes de llamar a un mtodo del soporte almacenado en cada casilla del array,
comprobar que el contenido de esa casilla no es null.
Mtodo imprime_caracteristicas()
function imprime_caracteristicas(){
echo "<p><b>Cliente " . $this->numero . ":</b> " . $this->nombre;
echo "<br>Alquileres actuales: " . $this->num_soportes_alquilados
}
Simplemente muestra algunos de los datos del cliente. Es un mtodo para obtener algn dato por
pantalla de un cliente.
Comprobar el funcionamiento de la clase cliente
Es importante sealar que, para que la clase cliente funcione, debe disponer de los cdigos de las
distintas clases de las que hace uso (la clase soporte, cinta_video, juego y dvd). Estos cdigos se
pueden haber escrito en el mismo archivo o bien incluirse con unas instrucciones como estas:
include "soporte.php";
include "dvd.php";
include "juego.php";
include "cinta_video.php";
La clase cliente se puede poner en funcionamiento, para probar su correcta implementacin, con
un cdigo como este:
//instanciamos un par de objetos cliente
$cliente1 = new cliente("Pepe", 1);
$cliente2 = new cliente("Roberto", 564);
//mostramos el numero de cada cliente creado
echo "El identificador del cliente 1 es: " . $cliente1->dame_numero();
echo "<br>El identificador del cliente 2 es: " . $cliente2->dame_numero();
//instancio algunos soportes
$soporte1 = new cinta_video("Los Otros", 1, 3.5, "115 minutos");
$soporte2 = new juego("Final Fantasy", 2, 2.5, "Playstation",1,1);
$soporte3 = new dvd("Los Intocables", 3, 3, "Ingls y espaol","16:9");
$soporte4 = new dvd("El Imperio Contraataca", 4, 3, "Ingls y espaol","16:9");
//alquilo algunos soportes
$cliente1->alquila($soporte1);
$cliente1->alquila($soporte2);
$cliente1->alquila($soporte3);
//voy a intentar alquilar de nuevo un soporte que ya tiene alquilado
$cliente1->alquila($soporte1);
//el cliente tiene 3 soportes en alquiler como mximo
//este soporte no lo va a poder alquilar
$cliente1->alquila($soporte4);
//este soporte no lo tiene alquilado
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

$cliente1->devuelve(4);
//devuelvo un soporte que s que tiene alquilado
$cliente1->devuelve(2);
//alquilo otro soporte
$cliente1->alquila($soporte4);
//listo los elementos alquilados
$cliente1->lista_alquileres();
La ejecucin de este cdigo, si todo funciona correctamente, debera devolvernos como
resultado esta salida:
El identificador del cliente 1 es: 1
El identificador del cliente 2 es: 564
Alquilado soporte a: Pepe
Pelcula en VHS:
Los Otros
3.5 (IVA no incluido)
Duracin: 115 minutos
Alquilado soporte a: Pepe
Juego para: Playstation
Final Fantasy
2.5 (IVA no incluido)
Para un jugador
Alquilado soporte a: Pepe
Pelcula en DVD:
Los Intocables
3 (IVA no incluido)
Ingls y espaol
El cliente ya tiene alquilado el soporte Los Otros
Este cliente tiene 3 elementos alquilados. No puede alquilar ms en este videoclub hasta que no
devuelva algo
No se ha podido encontrar el soporte en los alquileres de este cliente
Soporte devuelto: 2 Final Fantasy
Alquilado soporte a: Pepe
Pelcula en DVD:
El Imperio Contraataca
3 (IVA no incluido)
Ingls y espaol
El cliente tiene 3 soportes alquilados
Pelcula en VHS:
Los Otros
3.5 (IVA no incluido)
Duracin: 115 minutos
Pelcula en DVD:
El Imperio Contraataca
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

3 (IVA no incluido)
Ingls y espaol
Pelcula en DVD:
Los Intocables
3 (IVA no incluido)
Ingls y espaol

4.3. Repasando la creacin de clases


Para afianzar los conocimientos sobre programacin orientada a objetos vamos a concluir por
ahora la creacin de nuestro videoclub con PHP5.
Para continuar la creacin del videoclub y las explicaciones sobre la programacin orientada a
objetos (POO), vamos a programar la clase principal, que engloba a todas las clases que hemos ido
creando hasta el momento. La clase principal se llama videoclub y modela el comportamiento
general del videoclub.
Llegado este punto sera bueno que remarcar dos cosas sobre el desarrollo de programas
orientados a objetos.
La clase principal de un sistema que deseamos modelar en POO se suele llamar como el propio
sistema que estamos modelando. Por ejemplo, si estuviramos creando una biblioteca, la clase
principal se llamara biblioteca. En este caso, que estamos haciendo un videoclub, la clase principal
se llamar videoclub.
El proceso de creacin de un programa POO se realiza al revs de como hemos hecho en este
manual, empezando el desarrollo de la clase general y finalizando por las clases ms especficas.
De este modo, al crear la clase general, podemos ir viendo qu otros objetos necesitaremos,
cules sern sus mtodos y propiedades. En este manual lo hemos hecho al revs porque nos
vena bien para ir describiendo las caractersticas de la POO.
La clase videoclub tendr como propiedades a los soportes en alquiler (pelculas o juegos) y por
otra parte, los socios o clientes que alquilan los productos. Los mtodos de la clase videoclub
sern la inclusin y listado de soportes en alquiler y de socios, el alquiler de soportes por parte de
clientes.
Nota:Ni que decir tiene que el videoclub que estamos creando est simplificado al mximo.
Est claro que si estuvisemos creando un videoclub con el propsito de utilizarlo en
produccin, habra que pensar y desarrollar muchas otras funcionalidades.
Vamos ya con el cdigo y sus explicaciones.

Atributos de la clase videoclub


public $nombre;
private $productos;
private $num_productos;
private $socios;
private $num_socios;

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

El atributo $productos ser un array con los distintos soportes en alquiler. $num_productos lo
utilizaremos para llevar la cuenta del nmero de productos que tenemos disponibles. De modo
similar, $socios ser un array de clientes y $num_socios llevar la cuenta de los socios que
tenemos dados de alta. Aparte, nuestro videoclub tendr un nombre, que almacenaremos en la
variable $nombre.

Constructor
function __construct($nombre){
$this->nombre=$nombre;
$this->productos=array();
$this->num_productos=0;
$this->socios=array();
$this->num_socios=0;
}
Este mtodo inicializar los atributos del objeto que se est construyendo. Recibe nicamente el
nombre del videoclub. Como tareas destacables estn las inicializaciones de los arrays de
productos y socios y la puesta a cero de los contadores que vamos a utilizar.

Mtodo incluir_producto()
private function incluir_producto($nuevo_producto){
$this->productos[$this->num_productos]=$nuevo_producto;
echo "<p>Incluido soporte " . $this->num_productos;
$this->num_productos++;
}
Este mtodo ha sido declarado como private, porque slo queremos que se llame desde dentro de
la clase. Recibe el nuevo producto que se quiere dar de alta y lo guardar en el array de productos,
en la posicin marcada por el atributo num_productos. Luego muestra un mensaje por pantalla y
por ltimo incrementa a uno el atributo num_productos

Mtodos incluir_dvd(),incluir_cinta_video() e incluir_juego()


Los tres siguientes mtodos que vamos a ver, instancian los tres productos con los que trabaja el
videoclub y luego los introducen en array de productos llamando a incluir_producto().
function incluir_dvd($tit,$precio,$idiomas,$pantalla){
$dvd_nuevo = new dvd($tit, $this->num_productos, $precio, $idiomas, $pantalla);
$this->incluir_producto($dvd_nuevo);
}
function incluir_cinta_video($tit,$precio,$duracion){
$cinta_video_nueva = new cinta_video($tit, $this->num_productos, $precio, $duracion);
$this->incluir_producto($cinta_video_nueva);
}
function incluir_juego($tit,$precio,$consola,$min_j,$max_j){
$juego_nuevo = new juego($tit, $this->num_productos, $precio, $consola, $min_j, $max_j);
$this->incluir_producto($juego_nuevo);
}
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Podemos fijarnos que el nmero de identificacin del soporte, que recibe el constructor de las
cintas de vdeo, DVDs o juegos, lo generamos por medio del atributo de la clase de videclub
num_productos, que guarda el nmero de productos dados de alta.

Mtodo incluir_socio()
Este mtodo hace las tareas de instanciacin del socio nuevo y su inclusin en el array de socios.
function incluir_socio($nombre,$max_alquiler_concurrente=3){
$socio_nuevo = new cliente($nombre,$this->num_socios,$max_alquiler_concurrente);
$this->socios[$this->num_socios]=$socio_nuevo;
echo "<p>Incluido socio " . $this->num_socios;
$this->num_socios++;
}
Reciben los datos del nuevo socio: nombre y el mximo nmero de pelculas que puede alquilar
(siendo 3 el valor por defecto). Una vez instanciado el nuevo socio, lo introduce en el array, en la
posicin marcada por el atributo num_socios. Luego muestran un mensaje por pantalla y por
ltimo incrementan a uno los atributos num_productos o num_socios.
El nmero de socio, que recibe entre otros parmetros, el constructor de la clase socio lo
generamos por medio del contador de socios num_socios, de la clase videclub.

Mtodos listar_productos() y listar_socios()


Dos mtodos muy similares, que veremos de una sola vez.
function listar_productos(){
echo "<p>Listado de los " . $this->num_productos . " productos disponibles:";
for ($i=0;$i<$this->num_productos;$i++){
echo "<p>";
$this->productos[$i]->imprime_caracteristicas();
}
}
function listar_socios(){
echo "<p>Listado de $this->num_socios socios del videoclub:";
for ($i=0;$i<$this->num_socios;$i++){
echo "<p>";
$this->socios[$i]->imprime_caracteristicas();
}
}
Estos mtodos imprimen un listado completo de los socios y productos dados de alta.
Simplemente hacen un recorrido del array de productos o de socios y van imprimiendo sus
caractersticas.

Mtodo alquila_a_socio()
Realiza las acciones necesarias para alquiler un producto a un socio.
function alquila_a_socio($numero_socio,$numero_producto){
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

if (is_null($this->socios[$numero_socio])){
echo "<p>No existe ese socio";
}elseif(is_null($this->productos[$numero_producto])){
echo "<p>No existe ese soporte";
}else{
$this->socios[$numero_socio]->alquila($this->productos[$numero_producto]);
}
}
Este mtodo recibe el identificador del socio y del producto en alquiler. Antes de proceder, realiza
un par de comprobaciones. La primera para ver si existe un socio con el nmero de socio indicado
por parmetro y la segunda para ver si tambin existe un producto con el nmero de producto
dado.
Si todo fue bien, llama al mtodo alquila() del socio, envindole el producto que desea alquilar.
Nota:El mtodo alquila() del socio tiene cierta complejidad, pero ya la vimos cuando
explicamos la clase socio. En este momento, por el principio de encapsulacin de la POO,
debemos abstraernos de su dificultad y no prestarle atencin porque sabemos que
funciona y no nos debe preocupar cmo lo hace.
Para probar la clase videoclub podramos utilizar un cdigo como este:
$vc = new videoclub("La Eliana Video");
//voy a incluir unos cuantos soportes de prueba
$vc->incluir_juego("Final Fantasy", 2.5, "Playstation",1,1);
$vc->incluir_juego("GP Motoracer", 3, "Playstation II",1,2);
$vc->incluir_dvd("Los Otros", 4.5, "Ingls y espaol","16:9");
$vc->incluir_dvd("Ciudad de Dis", 3, "Portugus, ingls y espaol","16:9");
$vc->incluir_dvd("Los Picapiedra", 3, "Espaol","16:9");
$vc->incluir_cinta_video("Los Otros", 4.5, "115 minutos");
$vc->incluir_cinta_video("El nombre de la Rosa", 1.5, "140 minutos");
//listo los productos
$vc->listar_productos();
//voy a crear algunos socios
$vc->incluir_socio("Jos Fuentes");
$vc->incluir_socio("Pedro Garca",2);
$vc->alquila_a_socio(1,2);
$vc->alquila_a_socio(1,3);
//alquilo otra vez el soporte 2 al socio 1.
// no debe dejarme porque ya lo tiene alquilado
$vc->alquila_a_socio(1,2);
//alquilo el soporte 6 al socio 1.
//no se puede porque el socio 1 tiene 2 alquileres como mximo
$vc->alquila_a_socio(1,6);
//listo los socios
$vc->listar_socios();

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Se hace una carga de datos y una llamada a todos los mtodos que hemos visto para el videoclub.
Este cdigo dar como resultado una salida como la siguiente:
Incluido soporte 0
Incluido soporte 1
Incluido soporte 2
Incluido soporte 3
Incluido soporte 4
Incluido soporte 5
Incluido soporte 6
Listado de los 7 productos disponibles:
Juego para: Playstation
Final Fantasy
2.5 (IVA no incluido)
Para un jugador
Juego para: Playstation II
GP Motoracer
3 (IVA no incluido)
De 1 a 2 Jugadores.
Pelcula en DVD:
Los Otros
4.5 (IVA no incluido)
Ingls y espaol
Pelcula en DVD:
Ciudad de Dis
3 (IVA no incluido)
Portugus, ingls y espaol
Pelcula en DVD:
Los Picapiedra
3 (IVA no incluido)
Espaol
Pelcula en VHS:
Los Otros
4.5 (IVA no incluido)
Duracin: 115 minutos
Pelcula en VHS:
El nombre de la Rosa
1.5 (IVA no incluido)
Duracin: 140 minutos
Incluido socio 0

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Incluido socio 1
Alquilado soporte a: Pedro Garca
Pelcula en DVD:
Los Otros
4.5 (IVA no incluido)
Ingls y espaol
Alquilado soporte a: Pedro Garca
Pelcula en DVD:
Ciudad de Dis
3 (IVA no incluido)
Portugus, ingls y espaol
El cliente ya tiene alquilado el soporte Los Otros
Este cliente tiene 2 elementos alquilados. No puede alquilar ms en este videoclub hasta que no
devuelva algo
Listado de 2 socios del videoclub:
Cliente 0: Jos Fuentes
Alquileres actuales: 0
Cliente 1: Pedro Garca
Alquileres actuales: 2
Hasta aqu ha llegado por ahora el desarrollo de este videoclub, que no es muy funcional pero
esperamos que haya servido para empezar a conocer las caractersticas de la programacin
orientada a objetos.
En adelante, seguiremos este manual comentando otras particularidades de la POO en PHP 5, que
tambin hay que conocer.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

5.Orientacin a objetos avanzada


Veremos a continuacin algunos conceptos, ya ms avanzados, de la programacin orientada a
objetos en PHP 5, como son las clases y mtodos abstractos y las interfaces.

5.1. Mtodos y clases abstractos en PHP 5


Conoceremos lo que es una clase abstracta y los mtodos abstractos. Cmo se definen y en qu
situaciones se deben utilizar.
Una clase abstracta es la que tiene mtodos abstractos. Los mtodos abstractos son los que estn
declarados en una clase, pero no se ha definido en la clase el cdigo de esos mtodos.
Esa puede ser una buena definicin de clases y mtodos abstractos, pero veamos con calma una
explicacin un poco ms detallada y comprensible por todos.
En ocasiones, en un sistema de herencia como el de la programacin orientada a objetos (POO),
tenemos entidades que declarar aunque no se puede dar su definicin todava, simplemente las
deseamos definir por encima para empezar una jerarqua de clases.
Pensemos en los productos lcteos (los derivados de la leche). No cabe duda que los productos
lcteos son una gran familia. Incluyen a los yogures, mantequillas, quesos, helados e incluso a la
propia leche. Sin embargo, los productos lcteos en si no se encuentran en la vida real. En el
supermercado no te venden un producto lcteo en general. Por ejemplo, nadie compra un kilo de
producto lcteo... ms bien preguntarn por un litro de leche, un litro de helado o un pack de
yogures.
Todos los productos lcteos tienen algunas caractersticas comunes, como el porcentaje en leche o
la fecha de caducidad. Tambin tienen algunas funcionalidades comunes como conservarse o
consumirse. Sin embargo, la manera de conservarse es distinta dependiendo del producto lcteo.
La leche se conserva fuera de la nevera, mientras que no est abierto el brick, y los yogures deben
conservarse en la nevera en todo momento. Los quesos se conservan en la nevera, pero metidos
dentro de un recipiente por si acaso desprenden olores fuertes. Por lo que respecta a los helados,
se deben conservar en el congelador, siempre que deseemos que no se conviertan en lquido. Al
consumir un producto lcteo la cosa tambin cambia, puesto que el queso se suele acompaar
con pan o tostadas, la leche se bebe y el helado se toma con cuchara.
En definitiva, a donde queremos demostrar es que podemos tener un conjunto de objetos que
tienen unas caractersticas comunes y funcionalidades, tambin comunes, pero que difieren en la
manera de llevarlas a cabo. Para esto est la abstraccin.
La clase de los productos lcteos, tendr una serie de propiedades y unos mtodos abstractos. Los
mtodos abstractos, como habamos adelantado, son aquellos que no incluyen una codificacin,
sino que simplemente se declaran, dejando para las clases que hereden la tarea de codificarlos.
En este caso, la clase producto lcteo tendr los mtodos abstractos conservarse() y consumirse(),
pero no se especificar el cdigo fuente de estos mtodos (por eso son abstractos). Las clases que
hereden de producto lcteo sern las encargadas de definir un cdigo para los mtodos definidos
como abstractos en la clase padre. As, cada clase que herede de producto lcteo, deber
especificar el mecanismo concreto y especfico por el cual se van a conservar o consumir.
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Las clases que incorporan mtodos abstractos se deben declarar como abstractas. Es una
condicin forzosa. Las clases abstractas no se pueden instanciar. Es decir, no podemos crear
objetos a partir de ellas. Es algo lgico. Pensemos en los productos lcteos, estos no existen ms
que como una idea general. Slo podremos encontrar productos lcteos de un tipo en concreto,
como leche o yogur, pero no la idea de producto lcteo en general.
Una clase que herede de un producto lcteo debe definir los mtodos abstractos declarados en la
clase abstracta. De lo contrario, la clase que hereda estara obligada a declararse como abstracta.
En nuestro ejemplo de videoclub, tratado a lo largo de los distintos captulos del manual de PHP 5,
tenemos una clase que tambin sera un buen ejemplo de clase abstracta. Se trata de la clase
soporte. De esta clase heredaban los distintos productos del videoclub, como pelculas en DVD,
cintas de vdeo o juegos. No hubiera sido mala idea declarar como abstracta la clase soporte, dado
que no se van a utilizar, ni existen, soportes en general, sino que lo que existen son los distintos
soportes concretos.
La sintaxis de la abstraccin
Para declarar clases y mtodos abstractos se utiliza la siguiente sintaxis.
abstract class nombre_clase{
//propiedades
public x;
private y;
//mtodos
public function __construct(){

}
public abstract function nombre_metodo();
}
Nos fijamos que se utiliza la palabra clave "abstract" para definir las clases o mtodos abstractos.
Adems, los mtodos abstractos no llevan ningn cdigo asociado, ni siquiera las llaves para abrir
y cerrar el mtodo.

5.2. Interfaces en PHP 5


Vemos lo que son las interfaces, para qu se utilizan y cmo trabajar con ellas en PHP5
Las interfaces son un sistema bastante comn, utilizado en programacin orientada a objetos. Son
algo as como declaraciones de funcionalidades que tienen que cubrir las clases que implementan
las interfaces.
En una interfaz se definen habitualmente un juego de funciones que deben codificar las clases que
implementan dicha interfaz. De modo que, cuando una clase implementa una interfaz, podremos
estar seguros que en su cdigo estn definidas las funciones que inclua esa interfaz.
A la hora de programar un sistema, podemos contar con objetos que son muy diferentes y que por
tanto no pertenecen a la misma jerarqua de herencia, pero que deben realizar algunas acciones
comunes. Por ejemplo, todos los objetos con los que comercia unos grandes almacenes deben
contar con la funcionalidad de venderse. Una mesa tiene poco en comn con un calefactor o unas
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

zapatillas, pero todos los productos disponibles deben implementar una funcin para poder
venderse.
Otro ejemplo. Una bombilla, un coche y un ordenador son clases muy distintas que no pertenecen
al mismo sistema de herencia, pero todas pueden encenderse y apagarse. En este caso, podramos
construir una interfaz llamada "encendible", que incluira las funcionalidades de encender y
apagar. En este caso, la interfaz contendra dos funciones o mtodos, uno encender() y otro
apagar().
Cuando se define una interfaz, se declaran una serie de mtodos o funciones sin especificar ningn
cdigo fuente asociado. Luego, las clases que implementen esa interfaz sern las encargadas de
proporcionar un cdigo a los mtodos que contiene esa interfaz. Esto es seguro: si una clase
implementa una interfaz, debera declarar todos los mtodos de la interfaz. Si no tenemos cdigo
fuente para alguno de esos mtodos, por lo menos debemos declararlos como abstractos y, por
tanto, la clase tambin tendr que declararse como abstracta, porque tiene mtodos abstractos.

Cdigo para definir una interfaz


Veamos el cdigo para realizar una interfaz. En concreto veremos el cdigo de la interfaz
encendible, que tienen que implementar todas las clases cuyos objetos se puedan encender y
apagar.
interface encendible{
public function encender();
public function apagar();
}
Vemos que para definir una interfaz se utiliza la palabra clave interface, seguida por el nombre de
la interfaz y, entre llaves, el listado de mtodos que tendr. Los mtodos no se deben codificar,
sino nicamente declararse.

Implementacin de interfaces
Ahora veamos el cdigo para implementar una interfaz en una clase.
class bombilla implements encendible{
public function encender(){
echo "<br>Y la luz se hizo...";
}
public function apagar(){
echo "<br>Estamos a oscuras...";
}
}
Para implementar una interfaz, en la declaracin de la clase, se debe utilizar la palabra
implements, seguida del nombre de la interfaz que se va a implementar. Se podran implementar
varias interfaces en la misma clase, en cuyo caso se indicaran todos los nombres de las interfaces
separadas por comas.
En el cdigo de la clase estamos obligados a declarar y codificar todos los mtodos de la interfaz.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Nota: en concreto, PHP 5 entiende que si una clase implementa una interfaz, los mtodos de
esa interfaz estarn siempre en la clase, aunque no se declaren. De modo que si no los
declaramos explcitamente, PHP 5 lo har por nosotros. Esos mtodos de la interfaz sern
abstractos, as que la clase tendr que definirse como abstracta. Se puede encontrar ms
informacin sobre la abstraccin en el artculo Mtodos y clases abstractos en PHP 5.
Ahora veamos el cdigo de la clase coche, que tambin implementa la interfaz encendible. Este
cdigo lo hemos complicado un poco ms.
class coche implements encendible{
private $gasolina;
private $bateria;
private $estado = "apagado";
function __construct(){
$this->gasolina = 0;
$this->bateria = 10;
}
public function encender(){
if ($this->estado == "apagado"){
if ($this->bateria > 0){
if ($this->gasolina > 0){
$this->estado = "encendido";
$this->bateria --;
echo "<br><b>Enciendo...</b> estoy encendido!";
}else{
echo "<br>No tengo gasolina";
}
}else{
echo "<br>No tengo batera";
}
}else{
echo "<br>Ya estaba encendido";
}
}
public function apagar(){
if ($this->estado == "encendido"){
$this->estado = "apagado";
echo "<br><b>Apago...</b> estoy apagado!";
}else{
echo "<br>Ya estaba apagado";
}
}
public function cargar_gasolina($litros){
$this->gasolina += $litros;
echo "<br>Cargados $litros litros";
}
}

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

A la vista del anterior cdigo, se puede comprobar que no hay mucho en comn entre las clases
bombilla y coche. El cdigo para encender una bombilla era muy simple, pero para poner en
marcha un coche tenemos que realizar otras tareas. Antes tenemos que ver si el coche estaba
encendido previamente, si tiene gasolina y si tiene batera. Por su parte, el mtodo apagar hace
una nica comprobacin para ver si estaba o no el coche apagado previamente.
Tambin hemos incorporado un constructor que inicializa los atributos del objeto. Cuando se
construye un coche, la batera est llena, pero el depsito de gasolina est vaco. Para llenar el
depsito simplemente se debe utilizar el mtodo cargar_gasolina().
Llamadas polimrficas pasando objetos que implementan una interfaz
Las interfaces permiten el tratamiento de objetos sin necesidad de conocer las caractersticas
internas de ese objeto y sin importar de qu tipo son... simplemente tenemos que saber que el
objeto implementa una interfaz.
Por ejemplo, tanto los coches como las bombillas se pueden encender y apagar. As pues,
podemos llamar al mtodo encender() o apagar(), sin importarnos si es un coche o una bombilla lo
que hay que poner en marcha o detener.
En la declaracin de una funcin podemos especificar que el parmetro definido implementa una
interfaz, de modo que dentro de la funcin, se pueden realizar acciones teniendo en cuenta que el
parmetro recibido implementa un juego de funciones determinado.
Por ejemplo, podramos definir una funcin que recibe algo por parmetro y lo enciende.
Especificaremos que ese algo que recibe debe de implementar la interfaz encendible, as
podremos llamar a sus mtodos enciende() o apaga() con la seguridad de saber que existen.
function enciende_algo (encendible $algo){
$algo->encender();
}
$mibombilla = new bombilla();
$micoche = new coche();
enciende_algo($mibombilla);
enciende_algo($micoche);
Si tuviramos una clase que no implementa la interfaz encendible, la llamada a esta funcin
rovocara un error. Por ejemplo, un CD-Rom no se puede encender ni apagar.
class cd{
public $espacio;
}
$micd = new cd();
enciende_algo($micd); //da un error. cd no implementa la interfaz encendible
Esto nos dara un error como este: Fatal error: Argument 1 must implement interface encendible
in c:\www\ejphp5\funcion_encender.php on line 6. Queda muy claro que deberamos
implementar la interfaz encendible en la clase cd para que la llamada a la funcin se ejecute
correctamente.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

6.Otros asuntos relacionados


programacin en PHP 5

con

la

A modo de eplogo presentamos algunos artculos directamente relacionados con la versin 5 de


PHP. Ahora bien, cabe recordar que en DesarrolloWeb.com tenemos en la seccin
Monotemticos/PHP muchos otros manuales y talleres para seguir aprendiendo PHP 5.

6.1. Elegir entre PHP4 y PHP5. Conviene la migracin?


A ms de dos aos de la llegada de la versin 5 de PHP, an la comunidad de desarrolladores de
PHP se plantea el interrogante.
Las dudas bsicamente circulan siempre el mismo camino, y ambas elecciones tienen sus ventajas
y desventajas. Intentaremos en este informe orientar a los desarrolladores a decidirse por una u
otra alternativa.
Es importante remarcar antes de ubicarse de lleno en el anlisis de las ventajas y desventajas de
una u otra opcin, las principales diferencias existentes entre ambas versiones, cuales son los
cambios que repercuten ms fuertemente en la compatibilidad de los scripts, y que es lo que nos
depara el futuro en toda esta historia.

Cambios profundos
La llegada de PHP5 vino emparejada de una reestructuracin del Core de PHP, lo que los creadores
de PHP llama Zend Engine.
As como el lejano PHP3 incluye su Zend Engine 0.5, y PHP4 el Zend Engine 1.0, tenemos Zend
Engine 2.0 en PHP5. El cambio de versin no fue trivial; incluye la reescritura casi total del modelo
de objetos, entre sus cambios ms sustanciales.
Esto repercute directamente en los scripts de PHP4 que utilizan clases, tanto en la compatibilidad
como en performance de ejecucin. Posteriormente en este artculo nos referiremos nuevamente
a este tema.
Veamos un ejemplo que nos muestra un cambio sustancial en la implementacin del modelo de
objetos:
<?
class Persona {
function setNombre($nombre) {
$this->nombre = $nombre;
}
function getNombre() {
return $this->nombre;
}
}
function Algo($p) {
$persona->setNombre("Daniel");
}
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

1 $persona = new Persona();


2 $persona->setNombre("Pichongol");
3 Algo($persona);
4 echo $persona->getNombre();
?>

Cul es el problema en este cdigo corriendo en PHP4?


En la lnea 1 instanciamos un objeto de la clase Persona.
Luego le decimos que se llama Daniel.
El error de implementacin viene con la lnea 3. El argumento $p que recibe Algo, no es mas que
una copia de $persona, y eso esta MAL. Porque?, mnimamente por 2 razones.
La primera razn es que esta estrategia es POO-No compatible. Claramente cuando hablamos del
Paradigma Orientado a Objetos, estamos casi descartando que cada objeto sea referenciado por
su Identificador.
Sin embargo, el Zend Engine 1.0 no est preparado para dicha accin:
<?
function ejemplo($val){
echo $val;
}
$cadena = "texto";
ejemplo($cadena);
?>
La variable $cadena pasada como argumento a la funcin ejemplo, es copiada para su uso local
dentro de dicha funcin. Es lo que se conoce como paso de parmetros por valor.
El Zend Engine 1.0 hace exactamente esto para todas las funciones, inclusive para las que estn
dentro de una clase, las cuales en ese caso actan como mtodos:
<?
function Algo($persona) {
$persona->setNombre("Daniel");
}
?>,
Volviendo al ejemplo inicial de la clase persona, el mtodo Algo recibe una copia (un clon) del
objeto Persona.
La segunda razn viene emparejada con la primera, siendo consecuencia de esta.
Cualquier modificacin del objeto Persona que se produzca dentro del mtodo Algo, solo tendr
alcance local, y no se ver reflejado cuando la funcin retorne.
<?
Algo($persona);
echo $persona->getNombre();
?>
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

En ese caso la modificacin del nombre que hace la funcin Algo al objeto Persona no se ve
reflejada cuando hacemos echo $persona->getNombre().
En nuestro browser veremos "Pichongol".
Este es solo un ejemplo del porque de la reestructuracin tan importante en el Core de PHP. Es
claro que toda reestructuracin barre con cuestiones de compatibilidad, para ganar en otros skills;
en este caso claramente estamos ganando en performance, al liberarnos del overhead que implica
la constante copia de objetos que son argumentos de mtodos y funciones.
En artculos posteriores trataremos en mayor detalle y profundidad los distintos aspectos que
fueron modificados, haciendo una comparativa entre como se logran en PHP4 y como se logran en
PHP5. Adems de explicar profundamente las diferencias en el modelo de objetos nos quedan
temas pendientes como Opciones de configuracin (php.ini), Conexin a MySQL (mysqli), cambios
en los mdulos, etc.
Hecha esta introduccin, estamos en condiciones de definir las distintas situaciones en las que se
puede encontrar el desarrollador, y que aspectos juegan a su favor o en contra segn la situacin
en la que se encuentre.

Cual es mi escenario?
En el momento de plantearse la pregunta, el desarrollador seguramente se ubicar en alguno de
los dos escenarios posibles:
" Newbie (Iniciacin en PHP).
" Experimentado.

Newbie
En el planteo de esta discusin, podramos decir que es la situacin ideal, o por lo menos la ms
beneficiosa. Si eres una persona que quiere arrancar en PHP, no lo dudes, PHP5 es para ti. Tus
aplicaciones gozaran de las nuevas capacidades en OOP, obtendrs el beneficio de una mejor
performance de ejecucin (esta comprobado experimentalmente que PHP5 corre un 25% ms
rpido que PHP4) y tu cdigo estar muy bien acondicionado en cuanto a la compatibilidad con el
nuevo hijo que asoma: PHP6.
Por cierto, no todo es color de rosas. Una de los mayores beneficios a la hora de elegir PHP para
trabajar en nuestro proyecto es la gran cantidad de cdigo que podemos encontrar en Internet, y
utilizarlo para nuestros trabajos. Tenemos una gran probabilidad de que ante alguna tarea que se
nos plantea, podamos encontrar algn script que nos solucione la vida, obviamente adaptndolo a
nuestras necesidades.
Ahora bien, no todo el cdigo que vamos a encontrar es compatible con PHP5. De hecho la gran
mayora todava no se ha adaptado. Es cierto que con algn setting en nuestro php.ini podemos
ayudar a darle mayor compatibilidad, pero como contrapartida muchas de estas settings se
eliminaran en PHP6.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Qu queda? Hacerlo compatible modificando el cdigo, una tarea que para un desarrollador que
se inicia no siempre es sencillo. De todas formas a no alarmarse, que los grandes proyectos
(PHPNuke, PHPBB, etc.) ofrecen compatibilidad.

Experimentado
En este caso, el optar por quedarse con PHP4 o pasar a PHP5 depende de nuestra aplicacin.
Las interrogantes que el desarrollador se puede plantear podran ser:
- Mi aplicacin usa clases y objetos?
- Mi motor de Base de datos es MySQL?
- Utilizo un hosting externo?
- Mi aplicacin sufre modificaciones en cuanto a los requerimientos y lgica de negocios?
Pasemos a discutir ventajas y desventajas en cada uno de los interrogantes:

Mi aplicacin usa clases y objetos?


Como pudimos comprender al comienzo de este articulo, uno de los principales esfuerzos de los
diseadores del Zend Engine radic en el mejoramiento del modelo de objetos, basndose
claramente en un referente indiscutible en esta materia como lo es Sun. Salvando las diferencias,
se han tomado muchas cosas de Java, desde convenciones de nomenclaturas hasta estrategias de
implementacin.
Seria un desperdicio no utilizar dicho esfuerzo, sobre todo si nuestra aplicacin hace un uso
exhaustivo de clases y objetos.

Mi motor de Base de datos es MySQL?


A diferencia de la estrategia de PHP4 para la conectividad PHP/MySQL, en la que el Core de PHP
nos provee de un set de funciones para dicha interaccin, en PHP5 MySQL nos provee de un API
externo.
Bsicamente, la razn de este cambio fue una modificacin de licencia de MySQL, que obligo a
PHP a hacer de MySQL una base de datos ms, y no "LA" base de datos, como venia siendo en
PHP3 y PHP4.
De todas formas, esto no repercute en nuestro cdigo, sino en la performance de nuestra
aplicacin.
El hecho de que una extensin no forme parte del Core de PHP y pase a ser externa nos genera un
overhead, una sobrecarga de ejecucin en detrimento de la performance.
Como contrapartida, PHP5 nos da la posibilidad de sacarle el mayor jugo posible a las muchas
mejoras incorporadas en MySQL 4.1.3 o superior, a travs del API mysqli.
Esto implica hacer uso de otras funciones, modificando nuestro cdigo.
Ahora bien, que tan costosa es esta reescritura? Depender de nuestra estrategia de conexin a
base de datos. Utilizamos una capa de abstraccin del estilo ADOdb ? Si la utilizamos estaremos
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

mucho mejor parados frente a tal reescritura. En caso contrario el tiempo invertido ser
sensiblemente mayor.
Utilizo un hosting externo?
En caso de no disponer de un hosting propio, y tener que depender de un hosting externo que nos
provea de PHP, seguramente el hecho de pensar en migrar a PHP5 puede ser un problema. De
hecho, estadsticas de principio de 2006 nos indican que solo alrededor del 5% de los hosting que
proporcionan PHP, tienen PHP5.
Esto no hace mas que reflejar la lentitud con la que se esta moviendo el proceso de traspaso de
PHP4 hacia PHP5.
Una pregunta que surge directamente sobre este tema es Por qu?
Bueno, si uno tomo una distribucin de Linux, es poco probable que la versin de PHP5 sea la
incluida.
La conformidad de los programadores con PHP4 es grande, y mucha de la documentacin
existente esta escrita para PHP4.
De todas formas, a no dormirse con PHP4. Un tema que se trata en la segunda parte de este
artculo es lo nuevo que nos trae PHP6. Veremos que PHP5 en muchos aspectos es una transicin
mientras que la confirmacin se llama PHP6.

Mi aplicacin sufre modificaciones en cuanto a los requerimientos y lgica


de negocios?
Cuando las aplicaciones tienen requerimientos de cliente bastante cambiantes, y se emplean
recursos para su mantenimiento, o utilizamos una metodologa de desarrollo incremental
(software versionado), lo ideal es utilizar lo ltimo que nos proporciona nuestra plataforma de
programacin. Generalmente lo que se busca es un cambio gradual, modular, y sostenido.
Por otro lado, si nuestras aplicaciones residen en produccin sin mayores modificaciones (algn
proceso batch, alguna aplicacin depurada, algn algoritmo estable) y estamos conformes con su
funcionamiento, quizs no sea de nuestro inters migrar hacia una nueva versin.
Nos queda analizar que hay de nuevo en PHP6 y que cosas deberamos ir teniendo en cuenta si
utilizamos PHP4 o PHP5.

6.2. Seguridad Php (I)


PHP es una lengua muy fcil a aprender, y muchos programadores lo aprenden como manera de
agregar interactividad a sus Sitio Web.
Desafortunadamente, eso significa a menudo los programadores de PHP, especialmente sos ms
nuevos al desarrollo web, cometen ciertos riesgos de seguridad y desaprovechan el potencial que
sus usos pueden contener. Aqu estn algunos de los problemas mas comunes de seguridad y
cmo evitarlos.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Regla nmero uno: Nunca, confiar en los usuarios


Nunca debes confiar en que los usuarios te van a mandar los datos que tu esperas. Mucha gente
responde a esto con algo comoOh, nadie estara interesado en mi sitio. Esta afirmacin no
podra ser mas incorrecta , siempre hay un usuario malvolo que quiere explotar un agujero de
seguridad ademas los problemas pueden presentarse fcilmente debido a un usuario que hace
algo mal inintencionalmente.
Por todo esto la regla de todo desarrollador web tiene que ser "Nunca, confiar en los usuarios" .
Asumir que cada pieza de datos que tu sitio recoge de un usuario puede convertirse en un agujero
de seguridad, siempre. Si la seguridad de tu sitio web es importante para ti, este un buen
puntopara comenzar a aprender. Sera conveniente tener una hoja de seguridad para PHP al
lado de tu escritorio con los puntos mas importantes en texto negrita grande.

Variables globales
En muchas lenguajes debes crear explcitamente un variable para utilizarlas. En PHP, hay una
opcin, las register_globals, que puedes fijar en php.ini y que permite que utilices variables
globales.
Considera el cdigo siguiente:
if ($password == "my_password") {
$authorized = 1;
}
if ($authorized == 1) {
echo "Mis cosas importantes ";
}
A muchos de vosotrosos puede parecer que este cdigo esta funcionando perfectamente. Sin
embargo, si un servidor tiene register_globals encendidos, entonces simplemente agregando?
authorized=1 " al URL dar a cualquier persona el acceso libre a exactamentelo que no quisieras
que todo el mundo viera. ste es uno de los problemas mas comunes de la seguridad de PHP.
Afortunadamente, esto tiene un par de soluciones simples y posibles. La primera, y quizs la
mejor, es fijar desactivar register_globals. La segunda es asegurarse de que utilizas solamente
las variables que has fijado explcitamente t mismo. En el ejemplo anterior, eso significara la
adicin $authorized = 0; al principio de la escritura:
$authorized = 0;
if ($password == "my_password") {
$authorized = 1;
}
if ($authorized == 1) {
echo "Lots of important stuff.";
}

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Mensajes de error
Los mensajes de error son una herramienta muy til para los programadores y hackers. Un
desarrollador los necesita para detectar bugs. Un hacker puede utilizarlos para descubrir todas las
clases de informacin sobre un sitio, desde la estructura del directorio del servidor a la
informacin de la conexin de la base de datos.En PHP para evitar esto puedes utilizar .htaccess o
php.ini, fijando error_reporting a 0.

6.3. Seguridad Php (II)


Una de las ventajas ms grandes de PHP es la facilidad con la cual puede comunicarse con las
bases de datos, lo ms normal con MySQL.
Mucha gente hace el uso excesivo de esto, y muchos grandes sitios, confa en las bases de datos
para funcionar.
Sin embargo, con esa ventaja hay problemas suficientemente grandes en la seguridad a los que
tendras que hacer frente. Afortunadamente, hay un montn de soluciones. El peligro ms comn
de seguridad al que debes de hacer frente es cuando un usuario utiliza un fallo para poder atacar
directamente al servidor de bases de datos con sentencias SQL.
Utilicemos un ejemplo comn. Muchos sistemas utilizan un codigo muy parecido a este para
comprobar el usuario y la contrasea pudiendose hacer todas las combinaciones vlidas del
usuario y de su contrasea, por ejemplo para controlar el acceso a un rea de administracin:
$check = mysql_query("SELECT Username, Password, UserLevel FROM Users WHERE Username =
'".$_POST['username']."' and Password = '".$_POST['password']."'");
Te parece familiar? . Y parece que no podra hacer mucho dao. Pero digamos por un momento
que introduzco el siguiente usuario en el formulario:
'O 1=1 #
La pregunta que va a ser ejecutada sera esta:
SELECT Username, Password FROM Users WHERE Username = '' OR 1=1 #' and Password = ''
La almohadilla (#) le dice aMySQL que todo que le sigue es un comentario y que no debe de
hacerle caso. Ejecutar SQL hasta ese punto. Despues 1 es igual a 1, SQL devolver todos los
usuarios y contraseas de la base de datos. Y como la primera combinacin del usuario y de
contrasea en la mayora de las bases de datos es la de el administrador, la persona que incorpor
simplemente algunos smbolos en un formulario ahora entra como administrador de la Web , con
los mismos privilegios que tendra si supiera realmente el usuario y la contrasea.
Con una poca de creatividad, este agujero de seguridad se puede explotar aun ms lejos,
permitiendo que un usuario cree su propia cuenta , lea nmeros de las tarjetas de crdito o
simplemente vacie la base de datos.
Afortunadamente, este tipo de vulnerabilidad es bastante fcil de solucionar. Comprobando si hay
algun caracter raro cuando el usuario introduce los datos, y quitndolos o neutralizandos,

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

podemos evitar que cualquier persona utilize su propio cdigo del SQL en nuestra base de datos.
La funcin que sigue sera la adecuada:
function make_safe($variable) {
$variable = addslashes(trim($variable));
return $variable;
}
Ahora debemos modificar nuestra consulta. En vez de usar variables _POST como en la consulta de
arriba, ahora utilizamos todos los datos del usuario con la funcin make_safe, dando por resultado
el cdigo siguiente:
$username = make_safe($_POST['username']);
$password = make_safe($_POST['password']);
$check = mysql_query("SELECT Username, Password, UserLevel FROM Users WHERE Username =
'".$username."' and Password = '".$password."'");
Ahora, si un usuario incorpor los datos anteriormente citados, la consulta ser la siguiente, que
es totalmente inofensiva. La consulta siguiente seleccionar de una base de datos los registros
donde el usuario es igual a \ 'O o 1=1 #.
SELECT Username, Password, UserLevel FROM Users WHERE Username = '\' OR 1=1 #' and
Password = ''
Ahora, a menos que tengas un usuario con un nombre muy inusual y una contrasea en blanco, tu
malvolo atacante no podr hacer ningn dao en tu sitio Web. Es importante comprobar todos
los datos pasados a tu base de datos. Las cabeceras de HTTP enviados por elusuario pueden ser
falsificadas. Su direccin de remitente tambien puede ser falsificada. No confies en los datos
enviados por el usuario, y tu y tu sitio estareis a salvo

6.4. Composer, gestor de dependencias para PHP


Composer es una herramienta imprescindible para los desarrolladores en PHP, que permite
gestionar de una manera gil las dependencias de un proyecto.
Composer es un gestor de dependencias en proyectos, para programacin en PHP. Eso quiere
decir que nos permite gestionar (declarar, descargar y mantener actualizados) los paquetes de
software en los que se basa nuestro proyecto PHP. Se ha convertido en una herramienta de
cabecera para cualquier desarrollador en este lenguaje que aprecie su tiempo y el desarrollo gil.
Empiezas un nuevo proyecto con PHP? echa un vistazo antes a Composer porque te puede
ayudar bastante en el arranque y gracias a l podrs resumir muchas de las tareas de
mantenimiento de las libreras de terceros que ests usando.
https://getcomposer.org

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

En este artculo te resumimos los detalles para entender qu es Composer, cmo funciona y para
instalarlo en tu sistema. Primero comenzaremos explicando qu es un gestor de dependencias,
luego veremos cmo funciona Composer para darnos cuenta qu aspectos de nuestro da a da
nos va a simplificar. Por ltimo veremos cmo instalarlo y cmo usar libreras gestionadas con
Composer en nuestro cdigo PHP.

Por qu un gestor de dependencias


Cuando comienzas un proyecto en PHP, ya de cierta complejidad, no te vale solo con la librera de
funciones nativa de PHP. Generalmente todos usamos alguna que otra librera de terceros
desarrolladores, que nos permite evitar empezar todo desde cero. Ya sea un framework o algo
ms acotado como un sistema para debug o envo de email, validacin de formularios, etc.,
cualquier cosa que puedas necesitar ya est creada por otros desarrolladores. Si no la ests
usando ninguna librera posiblemente ests perdiendo tu precioso tiempo, pero eso es otra
discusin.
De modo que, al comenzar el proyecto hasta ahora tenamos que ir a la pgina de cada uno de los
componentes de software que queramos usar, descargarlos, copiarlos en la carpeta de nuestro
proyecto, etc. No solo eso, cuando estamos en mitad del desarrollo, o ya en produccin, y nos
cambian la versin de la librera, tenemos que volverla a descargar manualmente, actualizar los
archivos, etc. Nadie se haba muerto por hacer todo ese tipo de tareas de configuracin y
mantenimiento, pero no cabe duda que nos llevan un tiempo.
Todo eso sin contar con que ciertos softwares, como un framework como Symfony, dependen a su
vez de muchas otras libreras que tendras que instalar a mano y a su vez, mantener actualizadas.
Los gestores de paquetes nos ayudan para resumir las tareas de descarga y mantenimiento de las
versiones del proyecto para que estn siempre actualizadas. Ya existan en otros lenguajes de
programacin y nos resultaban especialmente tiles como npm en NodeJS. Ahora los
desarrolladores de PHP tambin contamos con esta herramienta gracias a Composer.

Cmo funciona Composer


Composer nos permite declarar las libreras que queremos usar en un proyecto. Su uso es
extremadamente simple, lo que anima a cualquier persona a usarlo, sea cual sea su nivel tcnico.
Para beneficiarnos del workflow que nos propone Composer simplemente tenemos que escribir
un archivo de configuracin en el que indicamos qu paquetes vamos a requerir. El archivo es un
simple JSON en el que indicamos cosas como el autor del proyecto, las dependencias, etc.
El archivo JSON debe tener un nombre especfico: composer.json
A continuacin tienes un ejemplo de JSON donde declaramos varios parmetros de nuestra
aplicacin.
{
"name": "desarrolloweb/probando-composer",
"require": {
"phpmailer/phpmailer": "5.2.*",
}
}
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Luego nos pondremos a desgranar este cdigo para que se entienda cada una de sus partes, as
como veremos qu otra informacin podemos colocar en este JSON. La idea es ver lo sencillo que
es declarar qu libreras o software ests utilizando y con ello dejar nuestro proyecto listo para la
"magia" de Composer.
Una vez tenemos definidas las dependencias en nuestro proyecto debemos instalarlas. Esto lo
conseguimos con un simple comando en el terminal en el que le pedimos a Composer que las
instale:
composer install
Nota: Ese comando puede variar segn la instalacin que tengas en tu sistema de Composer.
Especificaremos en un futuro artculo diversas situaciones en las que tengamos que generar
variantes de este mismo comando. De momento nos vamos a quedar en una presentacin de
Composer, pero en seguida nos ponemos a aprender en detalle aqu en DesarrolloWeb.com
Lanzado ese comando Composer se encargar de ir a los repositorios de paquetes de software y
descargar aquellas libreras mencionadas, copindolas en la carpeta de tu proyecto.
Una vez finalizado el proceso en tu consola de comandos podrs encontrar en la carpeta de tu
proyecto un directorio llamado "vendor" donde estarn las libreras declaradas. Ya solo nos queda
hacer los includes para que estn disponibles en tus aplicaciones y para ello tambin nos ayuda
Composer.
Simplemente tendremos que hacer un nico include o require en nuestro cdigo y todas las
libreras estarn disponibles para usar.
require 'vendor/autoload.php';

Packagist
Para terminar de convencerte y contarte la introduccin completa, debes echar un vistazo a
Packagist. Se trata del repositorio de paquetes que son instalables por medio de Composer.
En la pgina de Packagist encontrars un buscador que te puede dar una idea de la cantidad de
material que encuentras disponible para usar en cualquier proyecto PHP.
https://packagist.org/
Simplemente busca por cualquier concepto que te interese, como email, template, wysiwyg, etc.
Vers que te aparecen varias opciones clasificadas por popularidad, descargas, etc. Adems sobre
cada paquete encuentras informacin y el cdigo necesario para declarar tu dependencia en el
JSON de Composer.

Conclusin
Espero que con lo que hemos visto hasta ahora te haya llamado la atencin esta herramienta. La
verdad es que es muy til y como decimos, una vez comienzas a usarla te das cuenta de todo el
trabajo que te quita del medio, no solo en la descarga de los paquetes, sino tambin en las
actualizaciones de las libreras con el comando "composer update" que veremos ms adelante.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Sabemos que nos hemos dejado muchas cosas en el tintero, como el proceso de instalacin y el
detalle del JSON, pero lo veremos ya en prximos artculos. De momento queramos presentarte el
gestor de dependencias y que sepas por qu los desarrolladores de PHP lo hemos adoptado con
tanto entusiasmo.
En el prximo artculo vamos a detallar el proceso de instalacin de Composer.
Adems de los prximos artculos donde vamos a explicarlos los detalles del flujo de trabajo con
Composer para la gestin de dependencias, vamos a presentaros ahora un vdeo de nuestro canal
de Youtube donde encuentras resumidos algunos de los pasos bsicos de uso de Composer.

6.5. Namespaces en PHP


Gua para el trabajo con espacios de nombres en PHP. Utilidades y manera de trabajar con ellos:
declararlos y usarlos.
Los espacios de nombres son una de las utilidades que han aparecido en PHP 5, en la versin PHP
5.3. Ya tienen un tiempo de vida relativamente grande y deberan estar disponibles en tu servidor
de PHP. Gracias a las facilidades que nos ofrecen deberas comenzar a usarlos, as que te
proponemos seguir esta gua para conocer su funcionamiento.
Bsicamente sirven de contenedores para el cdigo de PHP, de modo que cuando creemos
elementos del lenguaje como constantes, funciones o clases, se queden en un mbito ms
restringido, evitando colisiones o conflictos de nombres con otros elementos que puedas crear t
ms adelante, otras personas de tu equipo o incluso otros desarrolladores.
Lo primero sera aclarar que en la pgina de PHP tienen una estupenda gua para comenzar con los
namespaces. Adems est traducida al espaol, por lo que te recomendamos tenerla a mano:
Namespaces en la documentacin oficial.
En este artculo pretendemos aclarar algunas cosas bsicas y otras adicionales, a la vez que te
ayudamos con nuevos ejemplos y explicaciones que puedan complementar la documentacin
oficial.

Para qu sirven los espacios de nombres


Como hemos dicho, sirven para organizar el cdigo, de manera que los nombres que nosotros
reservemos a la hora de crear clases o funciones no entren en conflicto con los que hayan podido,
o puedan en el futuro, crear otras personas.
Por ejemplo, imagina que tienes una clase que se llama "Seguridad" que se encarga de validar
usuarios en tu aplicacin para saber si estn correctamente autenticados en el sistema. Es posible
que otras personas, ya sea en tu mismo proyecto, o en otras libreras que puedas llegar a utilizar,
hayan imaginado ese mismo nombre para otra clase, por ejemplo una clase que se encarga de
impedir que se acceda a los recursos situados dentro de una carpeta sin los permisos necesarios.
Como no puede haber en el sistema dos clases con el mismo nombre, si necesitases trabajar con
ambas clases dentro de un proyecto, encontraras que PHP te da un mensaje de error. Pero bueno,
esto nos puede ocurrir con otros elementos ms sencillos, como funciones. Imagina que tienes
una funcin validar_entero() y ms adelante otra persona se le ocurre el mismo nombre para una

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

funcin en otra parte del cdigo, ambas funciones entraran en conflicto, pues deberan tener
nombres distintos.
Hasta la creacin de los namespaces, para evitar colisiones de nombres, los desarrolladores
estaban obligados a ser un poco imaginativos con los nombres que ponan a sus piezas de
software, creando nombres extra largos para sus clases, evitando as que otras personas en el
futuro pudieran usar esos mismos nombres.
Obviamente, esa solucin no era la mejor, as que PHP incorpor los espacios de nombres, que nos
permiten reservar nombres para las funciones, clases, interfaces, traits, constantes, etc, que solo
tienen validez en cierto namespace. Al crear una librera, colocaras tus funciones dentro de un
espacio de nombres, de manera que otros desarrolladores puedan usar los mismos nombres de
piezas de software sin que colisionen, por estar en distintos espacios de nombres.

Smil de los namespaces y el sistema de ficheros de tu ordenador


Creo que este smil hace muy fcil entender qu son los namespaces y cmo funcionan, pues nos
apoyamos en algo que todo el mundo usamos, que es el sistema de carpetas y archivos de tu disco
duro.
En tu ordenador los archivos estn dentro de carpetas y dentro de stas hay a su vez otras
carpetas que tienen otros archivos. Una carpeta de tu ordenador se comporta como si fuera un
espacio de nombres o namespace de PHP.
Por ejemplo, no puede haber dos archivos con el mismo nombre en la misma carpeta o directorio.
Pero s puede haber dos archivos con el mismo nombre que estn en distintos directorios.
Es tan sencillo como eso, los espacios de nombres son como carpetas de tu disco duro, que en
lugar de contener archivos contienen funciones, clases, etc. Esas clases pueden tener cualquier
nombre sin colisionar con otros cdigos que estn en un espacio de nombres distinto.

Cmo declarar un espacio de nombres en PHP


El concepto, como has podido ver, es muy sencillo de entender. Ahora solo falta ver la sintaxis con
la que PHP define los espacios de nombres.
Cuando ests creando un archivo que tiene una serie de cdigo que quieres situar en un espacio
de nombres, tienes que indicarlo al principio del cdigo del fichero.
Indicas el namespace de esta manera:
<?php
namespace Deswebcom;
A partir de esa lnea puedes escribir cualquier tipo de cdigo, donde cada uno de los elementos
declarados se quedarn en el espacio de nombres definido.
Tienes que asegurarte que:
1) La declaracin del espacio de nombres sea la primera lnea de tu cdigo fuente. Y como cdigo
fuente entendemos tanto cdigo PHP como cdigo HTML.
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Por ejemplo, esto no funcionara:


<?php
echo "probando";
namespace Deswebcom;
Recibirs un error fatal como este: Fatal error: Namespace declaration statement has to be the
very first statement in the script.
Del mismo modo, tampoco podrs hacer algo como esto:
<html>
<head>
<?php
namespace Deswebcom;
2) En un espacio de nombres se pueden engloban:

Constantes
Funciones
Clases y otros elementos de programacin orientada a objetos, como interfaces, traits o
clases abstractas.

Por tanto las variables globales que creas en un namespace se van al mbito global. Es decir, si
dentro de un archivo donde has declarado estar en un espacio de nombres usas variables sueltas
(sin ser locales a funciones o mtodos, osea, variables globales de toda la vida), esas variables se
quedan en el mbito global.
Siguiendo con la declaracin de nuestro primer namespace, podemos ver el cdigo completo de
un archivo con su espacio de nombres.
<?php
namespace Deswebcom;
const PI = 3.14;
function avisa(){
echo "Te estoy avisando";
}
class MiClase{
public function probando(){
echo "Esto es una prueba";
}
}
Ese cdigo lo meters en un archivo de tu proyecto, por ejemplo "primer-namespace.php".
Nota: La localizacin donde lo pongas ese archivo, o su nombre en si, es indiferente. Es decir, por
el hecho de haber definido un namespace no ests obligado a colocar el cdigo fuente en una ruta
determinada. Aunque como veremos ms adelante, muchos programadores con base en las
buenas prcticas colocan los archivos del espacio de nombres en carpetas que tienen los mismos
nombres que el namespace declarado.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Cmo usar un espacio de nombres


Ahora que ya tenemos nuestro primer namespace vamos a usarlo en otro archivo aparte.
Primero tendrs que incluir el archivo (aquel donde tienes el cdigo de tu namespace), para poder
usarlo.
include "primer-namespace.php";
Ahora PHP conoce ese cdigo, est en un namespace y su uso ser distinto que si hubieses
colocado todos esos miembros en el mbito global, pero al menos ya puedes usarlo. Ahora bien, la
manera de usar aquellos elementos del namespace puede tener diversas alternativas que veremos
a continuacin:
a) Colocar la ruta completa del namespace cuando nos referimos a sus elementos:
Para hacer uso de los miembros de ese espacio de nombres usaremos la ruta completa dentro del
namespace declarado.
Por ejemplo, en el namespace se declar la constante PI, a la que podemos acceder de esta
manera:
echo Deswebcom\PI;
Como puedes comprobar, comenzamos haciendo referencia al namespace, por su nombre,
seguido de una contrabarra y el miembro al que quieres acceder, en este caso la constante PI.
De manera similar podramos acceder a las funciones o las clases, a travs de la mencin del
espacio de nombres donde estn englobadas:
Deswebcom\avisa();
b) Declarar el uso de un miembro del namespace:
Otra alternativa til es definir que vas a usar un miembro de un namespace, esto es, una
constante, funcin, clase o similares para, a partir de ese momento, poder usarla como si fuera un
miembro declarado de manera global.
use const Deswebcom\PI;
echo PI;
use function Deswebcom\avisa;
avisa();
use Deswebcom\MiClase;
$prueba = new MiClase();
$prueba->probando();
En este cdigo primero se declara que se va a usar una constante del espacio de nombres.
Luego se declara que se va a usar una funcin y por ltimo se declara que se va a usar una clase. A
partir de ah podemos hacer referencia a esos miembros sin referirnos a la ruta del namespace

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

donde han sido creados, como si esa constante, funcin o clase que se hubiera declarado de
manera global.
Fjate que al usar una constante tenemos que informar "use const" y si es una funcin "use
function", mientras que si es una clase usamos "use" a secas.
Nota: La posibilidad de declarar el uso de una funcin o constante de un namespace est
disponible solo a partir de PHP 5.6.

Conclusin
Con esto ya conoces las bases sobre los espacios de nombres en PHP. Como introduccin creo que
est bastante bien y que ya tienes informacin suficiente para usarlos sin problemas. No obstante,
el lenguaje PHP nos permite diversas otras alternativas de uso que estudiaremos en futuros
artculos.

6.6. Organizar los namespaces de PHP en niveles


Alternativas de uso y organizacin del cdigo PHP por medio de los espacios de nombres:
subespacios de nombres, variantes de acceso...
En un artculo anterior pudimos entender el concepto de namespace en PHP y su uso bsico.
Ahora vamos a seguir explorando posibilidades del lenguaje para sacarle an ms partido y
conocer algunas posibilidades un poco ms avanzadas.
Vamos a tocar en este texto varios puntos de diversa ndole, como la posibilidad de crear
subespacios de nombres, organizar los archivos con cdigo, definir un espacio de nombres en
varios ficheros diferentes y cosas de este estilo. Todo orientado a que puedas organizar mejor tu
cdigo, sacando partido a los namespaces de PHP.

Crear Sub-namespaces
Es habitual que los desarrolladores creen espacios de nombres dentro de otros espacios de
nombres. Por ejemplo, todos los namespaces de una empresa o desarrollador pueden comenzar
con su "nick" y luego dentro puedes tener espacios de nombres para cada tipo de utilidad que
ests desarrollando.
Imagina que DesarrolloWeb.com se dedicase a fabricar libreras con cdigo PHP, pues todas las
libreras podran estar dentro del espacio de nombres "Deswebcom". Luego podramos tener
libreras que se encargan del trabajo con sesiones, cookies, bases de datos, etc. Podran estar en
sub-namespaces como Deswebcom\Sesiones, Deswebcom\Cookies, Deswebcom\BBDD. Ya dentro
de Deswebcom\Sesiones podras tener una serie de clases, funciones y constantes, o a su vez
otros espacios de nombres donde organizas otra serie de libreras. El orden es el que t necesites y
esta organizacin resulta muy popular. De hecho la puedes ver reproducida en numerosos
paquetes de libreras o en la organizacin de las clases de un framework potente.
La definicin de los namespaces y sub-namespaces es prcticamente la que hemos comentado en
artculos anteriores. Comienzas el cdigo indicando tu namespace (recuerda que debe ser la
primera instruccin del archivo).

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

<?php
namespace Deswebcom\Galaxias\Andromeda;
Como puedes apreciar, la jerarqua de namespaces se indica con una barra invertida (contrabarra).
Puede llegar a tantos niveles como necesites y en cada nivel puedes tener miembros del espacio
de nombres. Es decir, en el namespace "Deswebcom" puedo tener clases, funciones, constantes,
traits, interfaces y otros namespaces. Dentro de los otros namespaces puedo tener otra vez lo
mismo: clases, funciones, otros namespaces, etc.

Organizar archivos con namespaces


La organizacin de tus archivos en espacios de nombres es muy flexible. Hay lenguajes donde a la
hora de definir estructuras similares a los namespaces te obligan a que el cdigo resida en
carpetas del mismo nombre. En PHP no es as.
Puedes definir namespaces de cualquier profundidad en archivos que tengas en cualquier carpeta.
Puedes usar el mismo namespace en diversos archivos, puedes incluso crear varios espacios de
nombres en el mismo archivo.
Lgicamente, aunque PHP te permita muchas alternativas, es interesante que tengas tus propias
costumbres y una buena prctica sera crear una estructura de carpetas similar a la estructura de
espacios de nombres que ests generando. Eso te ayudar a saber dnde estn los archivos que
tienen el cdigo de cada espacio de nombres.
Cuando trabajas con jerarquas de espacios de nombres puedes encontrar usos como estos que
vamos a relatar.

Mismo espacio de nombres en dos archivos diferentes


Si tienes dos archivos que trabajan dentro de un mismo namespace, entonces, las funciones que
crees en ambos espacios de nombres estarn disponibles sin declarar que vas a usar ese espacio
de nombre.
Puede parecer obvio, pero veamos un ejemplo de dos archivos que trabajan sobre el mismo
espacio de nombres. Como primer archivo:
<?php
namespace Deswebcom\Galaxias;
function observar($a){
echo "Observando la galaxia $a";
}
Como segundo archivo:
<?php
namespace Deswebcom\Galaxias;
//como este archivo est en el mismo espacio de nombres que el anterior
//soy capaz de invocar una funcin declarada en este namespace sin indicar su ruta
observar("Centaurus A");

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Acceso "relativo" a elementos de otros espacios de nombres


Otra cosa que puede surgir es que desde un espacio de nombres quieras acceder a miembros de
otro espacio de nombres dependiente.
En este caso ocurre como cuando usas tu sistema de archivos, siguiendo el smil de las carpetas de
un disco duro de tu ordenador. Estando situados en un directorio de tu disco duro, pueden surgir
tres escenarios:
1. Acceso a archivos indicando solo su nombre. Es algo que sueles hacer cuando accedes a un
fichero que est dentro de la misma carpeta donde te encuentras. En este caso no
necesitamos indicar la ruta completa de esos archivos, ya que estamos en el mismo directorio.
2. Acceso a archivos indicando una ruta relativa. Es el caso que suele ocurrir cuando accedes a
archivos que estn dentro de subcarpetas de la carpeta donde te encuentras. En este caso
como posibilidad podramos definir la ruta relativa al archivo que queremos acceder, desde la
carpeta donde estamos. Osea, si tengo un subdirectorio llamado "folder" y dentro de l hay un
archivo "file.txt", podramos acceder por "folder/file.txt".
3. Acceso indicando una ruta absoluta. Es el caso tpico de acceso a archivos que estn en otras
rutas no dependientes del directorio donde me encuentro. En este caso lo comn y ms
cmodo es referirnos a los archivos con su ruta absoluta, por ejemplo
"/carpeta/subcarpeta/archivo.txt".
Esas mismas situaciones se pueden dar en el uso de namespaces. La primera, acceso a archivos
indicando solo su nombre la la hemos visto en el punto anterior, cuando comentbamos que
podamos acceder a funciones definidas en el mismo espacio de nombres como si fueran
funciones globales.
La segunda situacin la podemos ver en un ejemplo a continuacin. Por ejemplo piensa en este
espacio de nombres Deswebcom\Galaxias\Andromeda.
<?php
namespace Deswebcom\Galaxias\Andromeda;
function localizar(){
echo "Soy la galaxia Andromeda y estoy a 3 millones de aos luz de la tierra";
}
class Estrella{
public static function pertenece(){
echo "Pertenezco a a la galaxia Andromeda";
}
}
Ahora, si estamos en un espacio de nombres como "Deswebcom\Galaxias", no necesitamos toda
la ruta absoluta para llegar a los miembros de "Deswebcom\Galaxias\Andromeda":
<?php
namespace Deswebcom\Galaxias;
include "andromeda.php";
Andromeda\localizar();
Andromeda\Estrella::pertenece();
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

La tercera posibilidad es tambin fcil de entender y funcionar siempre, puesto que si indicamos
la ruta completa de toda la jerarqua de namespaces, no importa en qu espacio de nombres
estamos trabajando. Es decir, indicando el espacio de nombres completo, siempre vamos a poder
referirnos a cualquier elemento, independientemente de nuestra posicin.
Deswebcom\Galaxias\Andromeda\localizar();
Deswebcom\Galaxias\Andromeda\Estrella::pertenece();
Deswebcom\Galaxias\observar("Via Lactea");
En este caso tambin admitira comenzar por una contrabarra toda la ruta jerrquica para el
acceso a los namespaces, indicando que el primer namespace "Deswebcom" es de primer nivel.
\Deswebcom\Galaxias\Andromeda\localizar();
\Deswebcom\Galaxias\Andromeda\Estrella::pertenece();
\Deswebcom\Galaxias\observar("Via Lactea");

6.7. Importar y apodar namespaces en PHP


Alternativas para importar namespaces o miembros de namespaces, con alias o sin l. Reglas
para importar y cmo acceder al mbito global para resolver nombres usados en espacios de
nombres.
Este artculo contina con la serie de tutoriales dedicados a conocer y dominar los namespaces de
PHP. Es el tercero que escribimos sobre este asunto, as que te recomendamos empezar la lectura
por la introduccin a los namespaces de PHP.
Ten en cuenta que aqu damos por hecho que sabes ciertas cosas y adems usamos cdigo de
espacios de nombres que fueron definidos en artculos anteriores.

Importar con alias


A la hora de importar cdigo desde espacios de nombres es posible asignarles un alias para
referirse a ellos ms adelante. Esto nos puede servir para varias situaciones, como por ejemplo
darle una manera resumida de acceder a una clase dentro de archivo o para asignarle un nombre
diferente, en el caso de ya estar ocupado el nombre original de esa clase, de modo que podramos
evitar colisiones de nombres en determinadas ocasiones.
use Deswebcom\Galaxias\Andromeda\Estrella as E;
As estaramos asignando el Alias "E" a la clase "Estrella", que est en el namespace
"Deswebcom\Galaxias\Andromeda".
A partir de ah podramos usar el nombre de la clase totalmente
"Deswebcom\Galaxias\Andromeda\Estrella" o el alias que acabamos de definir "E".
E::pertenece();
o bien:
Deswebcom\Galaxias\Andromeda\Estrella::pertenece();

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

cualificado,

www.desarrolloweb.com

Nota: Recuerda que tambin puedes declarar que vas a usar funciones o constantes de otros
espacios de nombres. En ese caso la cosa cambia algo, porque tienes que mencionar "use
function" o "use const".
Por ejemplo tengo este namespace.
<?php
namespace Midesweb;
function quien(){
echo "Soy @midesweb";
}
Y en otro archivo quiero usar la funcin quien, tambin por un alias.
use function Midesweb\quien as q;
Ahora esa funcin est disponible con el alias "q". Luego podr invocarla as:
q();
Realmente este tema de los alias ya lo venas utilizando, aunque no lo habamos mencionado
todava. Esto es porque cualquier sentencia "use" lo que hace realmente es crear un alias.
Solamente que, si no le indicamos un alias diferente, crea ese recurso con su nombre original. Por
ejemplo:
use Deswebcom\Galaxias\Andromeda\Estrella;
Es una lnea de cdigo equivalente a:
use Deswebcom\Galaxias\Andromeda\Estrella as Estrella;
Antes de acabar este punto quisiera dar dos aclaraciones, igual son cosas obvias, pero creo que
podr solventar las dudas de algunos lectores:
Una sentencia use con un alias (o sin l, pues realmente ya sabemos que el alias siempre lo crea al
declarar un "use") pone a disposicin un cdigo tan solo para el archivo .php donde hemos creado
ese alias.
Esto se deriva de lo anterior: Si ests dentro de un espacio de nombres y declaras un "use" para
crear un alias de una clase, funcin o cualquier otra cosa, no significa que ests agregando ese
elemento al espacio de nombres en el que ests. Aquella funcin o clase, interfaz o lo que sea,
permanece en el espacio de nombres donde fue definida y con ese "use" simplemente ests
indicando que dentro de este fichero eres capaz de referirte a ese elemento por su alias.

Importar un namespace completo con alias


Otra tarea comn es la de crear un alias para referirse a un espacio de nombres completo.
use Deswebcom\Galaxias;
Eso crea un alias llamado "Galaxias" para el namespace "Deswebcom\Galaxias".
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Nota: Recuerda que es equivalente a haber escrito:


use Deswebcom\Galaxias as Galaxias;
Si dentro del namespace Deswebcom\Galaxias haba una funcin llamada distancia(), entonces,
gracias al alias, podramos invocarla de esta manera:
Galaxias\distancia("Via Lactea", "Alfa Centauro");
Adems, gracias al Alias podemos acceder tambin a namespaces que estn dentro de Galaxias de
una manera resumida.
Galaxias\Andromeda\localizar();
Aqu hemos pasado del namespace "Galaxias" al subnamespace "Andromeda" y a partir de l,
invocado a su funcin localizar().
Podramos crear ese namespace con un alias diferente si lo deseamos.
use Deswebcom\Galaxias as GA;
Entonces usaremos esa abreviacin (alias) para acceder a los miembros del namespace.
GA\distancia("Via Lactea", "Alfa Centauro");
GA\Andromeda\localizar();

Importar solamente en el mbito global


La instruccin use para importar un namespace o un miembro slo se puede realizar desde el
mbito global de un fichero. Es decir, si intentamos importar desde una funcin nos dar un error
"unexpected 'use' (T_USE)".
function importar_ilegal(){
use Deswebcom;
echo "Esto no lo puedes hacer, porque este no es el mbito global";
}
Tampoco podras hacerlo desde una clase:
class WebSite{
use Deswebcom;
}
Pero bueno, en este caso el error sera diferente, porque aqu PHP estara suponiendo que vas a
usar un trait en la clase "WebSite" y no el namespace "Deswebcom".

Espacio de nombres global


Si estamos programando dentro de un espacio de nombres podremos crear cualquier miembro
con cualquier nombre sin que colisione con otros miembros de otros namespaces. Esto ocurre con
el mbito global tambin.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Todas las funciones nativas de PHP estn definidas dentro del mbito global, por lo que en
ocasiones podemos necesitar referirnos al mbito global en vez del mbito del namespace.
Por ejemplo, tengo el namespace "Deswebcom\Galaxia" y dentro de l he definido una funcin
llamada explode(). En ese caso, dentro del namespace "Galaxia", explode() har referencia al
mtodo expolde() que hemos definido en este mbito.
<?php
namespace Deswebcom\Galaxias;
function explode($estrella){
echo "La estrella $estrella va a explotar";
}
explode("Sol");
Ese cdigo te devolver "La estrella Sol va a explotar", porque se est invocando al explode()
recin definido.
Nota: Puedes reparar que si no estuviramos dentro de un namespace PHP no nos habra
permitido crear una funcin llamada explode(), porque ya existe una funcin nativa del API de PHP
con ese nombre, que se encarga en separar partes del string en un array.
Ahora bien, si necesitas por algn motivo acceder a la funcin explode() de PHP, la nativa definida
en el mbito global, entonces tendra que especificar que esa funcin es aquella del mbito global
y no la definida en el namespace. Para ello no hay ms que agregarle una contrabarra antes del
nombre de la funcin (o cualquier otra cosa del mbito global a la que queremos acceder).
$arraymarcas = \explode("|", "desarrolloweb|escuelait");

Conclusin
Con todo esto tienes bastante informacin sobre namespaces. Realmente ya sabes todo lo que
necesitas, as que a partir de ahora procura usarlos.

6.8. Problema del error 404 OK en PHP


Tenemos que asegurarnos que el error 404, de pgina no encontrada, sea correctamente
enviado al navegador para que no le llegue un HTTP/1.x 404 OK
Hay veces que con PHP queremos enviar un error 404 de pgina no encontrada, para avisar al
navegador que una pgina no existe. Es sencillo enviar por las cabeceras del http un error 404,
pero hay que asegurarse que el cdigo de error est bien enviado para no dar informaciones
ambiguas a los clientes que se conecten al servidor.
Esto es importante porque el cdigo 404 tambin sirve a los buscadores o motores de bsqueda,
para informar que una pgina no existe. Si damos informaciones ambiguas a los buscadores puede
que redunde negativamente en la clasificacin de nuestro sitio.
El problema que queremos comentar ahora es el tpico error "404 OK". Esto es una ambigedad:
404 es pgina no encontrada y OK quiere decir que todo ha ido bien. Pero si no encontr la pgina

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Cmo es que decimos que OK? Eso es algo que se puede evitar enviando el error correctamente
en la cabecera del HTTP.
Para enviar un cdigo de error 404 por las cabeceras del HTTP con PHP tenemos que hacer lo
siguiente:
<?
header("HTTP/1.0 404 Not Found");
?>
Con la funcin header() de PHP enviamos informacin en la cabeceras del http. En este caso
hemos enviado una cabecera 404 Not Found. Atencin, porque la funcin header() debe invocarse
antes de haber escrito nada en la pgina, osea, antes de haber enviado ninguna informacin al
navegador.
Pero dependiendo de la configuracin de nuestro servidor esto puede funcionar o no.
La mejor manera de saber qu estamos enviando por las cabeceras del http es utilizar un
programa que nos muestre las cabeceras que se generan tanto en el cliente como en el servidor.
Existen varios programas que nos podran servir, pero nosotros vamos a recomendar aqu una
extensin de Firefox que hemos comentado ya en otro artculo: Ver cabeceras HTTP con
LiveHttpHeaders.
Veremos que en algunas ocasiones enviando esta cabecera el navegador recibe un cdigo de error
como este:
HTTP/1.x 404 OK
Eso es algo que tenemos que evitar, porque es ambiguo. La cabecera deseable sera:
HTTP/1.x 404 Not Found
Pues bien, cuando la cabecera que generamos es HTTP/1.x 404 OK tenemos que hacer lo siguiente
para conseguir el deseado HTTP/1.x 404 Not Found.
<?
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
?>
Primero le indicamos la cabecera del http como 404 y luego lanzamos otra cabecera indicando que
el estatus que tiene que enviar es "Not Found". Esto debera funcionar en todos los casos. Es
posible que con una sola de las dos cabeceras enviadas nos enve ya el error 404 Not Found,
depende de la configuracin de nuestro servidor que necesitemos una u otra. Pero si indicamos las
dos en las pruebas que he hecho con varios servidores siempre he recibido el cdigo de error
correcto.
Insisto en que lo bueno es que veamos qu cabeceras del HTTP estamos enviando con un
producto como LiveHttpHeaders . As podremos estar seguros de qu cabeceras tenemos que
enviar y qu cdigo PHP es el correcto en nuestro caso.
Porque en algunos servidores PHP si enviamos slo esta cabecera:
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

<?
header("Status: 404 Not Found");
?>
Nos enva al navegador el cdigo:
HTTP/1.x 200 OK
Por ejemplo, en este caso es todava peor, porque nosotros habamos querido enviar un error 404
y en realidad lo que ha llegado al navegador es un 200 OK que quiere decir pgina encontrada y
correcta.
En definitiva, cabe estudiar detalladamente este asunto para asegurarnos que estamos enviando
la cabecera correcta y el error 404 es claro.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

7.Manual del API de bit.ly


El API de bit.ly permite acortar URLs y obtener informacin sobre las URL cortas generadas por
este servicio web. Explicaremos el API y mostraremos ejemplos de consumo del servicio en
lenguajes como PHP o Javascript.

7.1. API de bit.ly, servicio web para acortar URL


Notas sobre la utilizacin del API del servicio web bit.ly que permite acortar URLs y
obtener informacin sobre URLs cortas ya existentes.
En la web existen varios servicios para acortar las URL, esto es, dada una URL cualquiera nos
permite obtener otra URL de menor tamao, que nos redirige hacia la URL original. Uno de estos
servicios web se llama bit.ly y resulta bastante interesante, no slo por las funcionalidades que
ofrece, sino tambin por el API que proporcionan para utilizar el servicio desde otros proyectos.
Vamos a presentar unas notas en el presente artculo acerca del mencionado API y ampliaremos la
informacin en el Manual del API de bit.ly.
Quizs muchos de los lectores utilizan ya este servicio web, para acortar las URL que se envan en
el texto de los post en Twitter. Como se sabe, Twitter es un servicio de "Microblogging", que
permite enviar post de 140 caracteres como mximo. Si dentro de un post de Twitter enviamos
una URL ocurre muchas veces que el tamao de esas URL es tan grande en caracteres que se
consume la mayora del espacio disponible para enviar texto y con ello nuestro post queda muy
limitado en espacio y no podemos explicar lo que desebamos.
Entonces, lo que se suele hacer es acotar la URL, con lo podemos enviar esa URL corta y ganamos
espacio para escribir lo que queramos en el micro-post. Quizs esto resulta tan obvio que est de
ms ofrecer un ejemplo, pero aun as veamos la siguiente URL:
http://www.desarrolloweb.com/actualidad/lista-mundial-pirata-3064.html
Como se puede ver la URL tiene bastantes caracteres, as que lo podemos acortar para obtener la
siguiente URL:
http://bit.ly/939UuU
Esta segunda URL ms corta nos lleva a la primera URL que era ms larga, redirigiendo al
navegador de manera transparente para el usuario.
Adems de acortar una URL, bit.ly es interesante tambin porque almacena un registro de todas
las URLs que has acortado, ofreciendo datos estadsticos sobre el nmero de accesos a esa URL
corta, los sitios web referidos, etc.

API de bit.ly
El API de bit.ly permite obtener URLs cortas directamente desde cualquier otro sistema
informtico, sin tener que entrar en el sitio de bit.ly, as como obtener informacin de URLs que se
hayan acortado utilizando este servicio web.
El API que nos ocupa es lo que se denomina un REST API y permite el acceso a recursos del servicio
web de bit.ly, a travs de URLs en las que enviamos informacin sobre la accin que queremos
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

realizar. Devuelve un texto que est en formato JSON y opcionalmente en XML, que contiene el
resultado de la ejecucin del comando enviado en la URL.
Por ejemplo, imaginemos que tenemos una URL larga y deseamos obtener la URL corta
correspondiente. Entonces tendremos que componer una llamada al API de bit.ly con los datos de
esa URL larga y la operacin que queremos realizar con ella (acortarla en este caso). La llamada al
API es una URL que tendr una forma parecida a esta:
http://api.bit.ly/shorten?version=2.0.1&longUrl=http://desarrolloweb.com&login=usuario&apiKey
=R_000000000
Como se puede ver, en esta URL estamos enviando varios datos que conforman la consulta al API.
Hay uno que resulta claro, "longUrl", en el que enviamos la la URL que deseamos acortar. En la
URL se envan otros datos como "version", con la versin del API que estamos utilizando y un par
de datos importantes, tpicos en el trabajo con APIs como el usuario y la llave, que vamos a
explicar a continuacin.

Llave del API y usuario


Para acceder al API de bit.ly tenemos que estar registrados en ese sitio web. Cuando hacemos el
registro nos proporcionan un nombre de usuario (que elegimos nosotros) y una llave de acceso al
API, que es una cadena de caracteres bastante larga.
El registro en bit.ly lleva menos de un minuto y los datos para acceso al API te los ofrecen en la
propia pgina de confirmacin del alta de usuario. Para hacer nuestros ejemplos hemos obtenido
nuestra propia llave de API, que por razones obvias no vamos a publicar. En los ejemplos que
publiquemos el lector tendr que sustituir estos datos ("login" y "apiKey") por los que le hayan
proporcionado.
La llave del API nos permite hacer cualquier uso del servicio web de bit.ly, siempre que no
realicemos ms de 5 accesos concurrentes al mismo con la misma llave.

Respuesta del API de bit.ly


Una vez que hemos hecho una consulta al API de bit.ly el servicio web nos devuelve un texto, en
formato JSON, que contiene varios datos, entre los que se encuentra la URL acortada.
Opcionalmente podemos solicitar al API que nos devuelva la informacin con formato XML, si
enviamos el parmetro format=xml.
El texto que recibimos como respuesta tendr una forma similar a esta:
{ "errorCode": 0, "errorMessage": "", "results": { "http://desarrolloweb.com": { "hash": "tTVQF",
"shortCNAMEUrl": "http://bit.ly/c1SivH", "shortKeywordUrl": "", "shortUrl": "http://bit.ly/c1SivH",
"userHash": "c1SivH" } }, "statusCode": "OK" }
Nota: El cdigo anterior est en formato JSON y en DesarrolloWeb.com hay varias referencias a
esta notacin y sobre cmo interpretarla desde otros lenguajes de programacin. Para encontrar
los artculos puedes utilizar el buscador interno de DesarrolloWeb.com o ir a la entrada de JSON
en la Wiki.
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Esperamos que esta introduccin al API de bit.ly haya resultado interesante, pero seguramente te
interese saber algo ms sobre sus posibles funcionalidades o cmo utilizarla desde lenguajes de
programacin como PHP. As pues, te indicamos que todas las informaciones adicionales las
podrs encontrar en el Manual del API de bit.ly.

7.2. Funciones del API de bit.ly


Exploracin de las distintas posibilidades que nos ofrece el API de bit.ly, con
ejemplos de URLs para obtener informacin y la respuesta que nos devuelve
el API.
En el API del servicio web de bit.ly podemos encontrar distintas funcionalidades. Quizs la ms
habitual sera la de acortar una URL, pero no es lo nico que podemos conseguir. En este artculo
haremos un recorrido sobre las diferentes opciones que nos ofrece.
En la entrega anterior del Manual del API de bit.ly que estamos publicando en
DesarrolloWeb.com, ya explicamos las generalidades sobre el funcionamiento del servicio web
bit.ly para acortar direcciones, por lo que convendra su lectura previa. As que podemos pasar sin
ms prembulos a presentar un listado de los comandos que podramos invocar. Para cada uno de
los comandos veremos una pequea descripcin, una URL de ejemplo para invocar ese comando y
la respuesta que obtenemos del API en formato JSON, que es el formato de respuesta por defecto.

/shorten
Este comando sirve para recortar una URL larga y obtener una URL ms corta, proporcionada por
bit.ly, que redireccionar a la URL original.
Ejemplo de consulta:
http://api.bit.ly/shorten?version=2.0.1&longUrl=http://desarrolloweb.com&login=tuusuario&apiK
ey=R_000000000000000
Nota: Quizs sobra decir, pues ya se coment en el anterior artculo, que vosotros tenis que
sustituir el nombre de usuario, enviado en el parmetro "login" y la llave del API, enviado en el
parmetro apiKey, por los vuestros que habris obtenido al registraros en bit.ly.
Respuesta para la anterior consulta:
{
"errorCode": 0,
"errorMessage": "",
"results": {
"http://desarrolloweb.com": {
"hash": "tTVQF",
"shortCNAMEUrl": "http://bit.ly/c1SivH",
"shortKeywordUrl": "",
"shortUrl": "http://bit.ly/c1SivH",
"userHash": "c1SivH"
}
},
"statusCode": "OK"
}
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

/expand
Este comando sirve para obtener la URL larga correspondiente a una URL corta de bit.ly. Es decir,
hace el paso contrario de acortar la URL, teniendo la direccin corta, conseguimos averiguar la
larga. Un detalle importante es que, para invocar expand, tenemos dos opciones, una es enviar la
URL corta (como vemos en el ejemplo siguiente) y la otra es enviar el dato " hash" de esa URL, que
podemos ver entre los datos que se obtuvieron al hacer el comando shorten.
Ejemplo de invocacin:
http://api.bit.ly/expand?version=2.0.1&shortUrl=http://bit.ly/c1SivH&login=tuusuario&apiKey=R_
000000000000000
Resultado obtenido para esta consulta:
{
"errorCode": 0,
"errorMessage": "",
"results": {
"c1SivH": {
"longUrl": "http://desarrolloweb.com/"
}
},
"statusCode": "OK"
}

/info
A partir de una URL corta o un Hash, obtenemos informacin variada sobre ese item, como puede
ser la URL larga a la que corresponde, su ttulo, keywors, descripcin o los usuarios que estn
relacionados a esa entrada.
Ejemplo de invocacin: (en el que esta vez enviamos un Hash)
http://api.bit.ly/info?version=2.0.1&hash=tTVQF&login=tuusuario&apiKey=R_000000000000000
La consulta devuelve el siguiente cdigo JSON:
{
"errorCode": 0,
"errorMessage": "",
"results": {
"tTVQF": {
"calais": {},
"calaisId": "",
"calaisResolutions": {},
"contentLegth": 77862,
"contentLength": "",
"contentType": "text/html",
"exif": {},
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

"fileExtension": "",
"globalHash": "tTVQF",
"hash": "tTVQF",
"htmlMetaDescription": "Todo lo que pueden necesitar los programadores y diseu00f1adores
web para aprender o profundizar en el desarrollo de webs..."
"htmlMetaKeywords": [ "recursos para pu00e1ginas web", "manuales de html css",
"promociu00f3n de pu00e1ginas web", ... ],
"htmlTitle": "Desarrollo Web, Tu mejor ayuda para aprender a hacer webs.",
"id3": {},
"indexed": 1253659877,
"keyword": "",
"keywords": [],
"longUrl": "http://desarrolloweb.com/",
"metacarta": [],
"mirrorUrl": "",
"robotsAllowed": true,
"shortenedByUser": "bitly",
"surbl": 0,
"thumbnail": {},
"urlFetched": "http://desarrolloweb.com/",
"userHash": "",
"users": [],
"version": 1.0
}
},
"statusCode": "OK" }

/stats
Una interesante opcin que nos ofrece el servicio web de bit-ly, que consiste en una serie de datos
estadsticos sobre una URL corta, o Hash, como los accesos que ha tenido, la procedencia de los
mismos, etc.
Ejemplo de URL para hacer una consulta sobre datos estadsticos de una URL corta.
http://api.bit.ly/stats?version=2.0.1&shortUrl=bit.ly/dmsnKV&login=tuusuario&apiKey=R_000000
000000000
{
"errorCode": 0,
"errorMessage": "",
"results": {
"clicks": 315,
"hash": "dmsnKV",
"referrers": {
"": { "direct": 174 },
"hootsuite.com": { "/dashboard": 3 },
"iconfactory.com": { "/twitterrific": 2 },
"partners.bit.ly": { "/td": 44 },
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

"search.twitter.com": { "/search": 2 },
"seesmic.com": { "/web/index.html": 4 },
"twitoaster.com": { "/": 2 },
"twitter.com": { "/": 63,
"/ChicadeSeda/tesorodelsaber": 1,
"/Kika381": 1,
"/tuusuario": 3,
"/elgusar": 1,
"/favorites": 1,
"/home": 2,
"/jordisalvia": 1,
"/profesor4": 7,
"/profesor4/favorites": 1
},
"www.twitscoop.com": { "/": 1 },
"www.twittergadget.com": { "/gadget.asp": 1 },
"www.yoono.com": { "": 1 }
}
}, "statusCode": "OK"
}
/errors
Una lista de los cdigos de error con sus descripciones que se pueden producir al acceder al API.
Esta lista de cdigos de error nos servir para poder entender mejor qu es lo que pueda estar
pasando cuando el API no responda como podramos esperar.
Consulta para ver los errores:
http://api.bit.ly/errors?version=2.0.1&login=tuusuario&apiKey=R_000000000000000
El resultado de los errores es demasiado largo para publicarlo aqu, pero podramos verlo
simplemente si accedemos a la URL anterior con nuestros datos de acceso al API.
Este artculo informativo sobre las capacidades del API de bit.ly acaba por aqu, dado que ya
hemos enumerado y explicado todas las posibilidades que existen en la versin actual, en el
momento de escribir este texto, que es la 2.0.1.
En el prximo artculo vamos a mostrar ya cmo utilizar el API para consumir informacin del
mismo desde pginas PHP, un paso que seguramente querrs conocer si ests leyendo estas
lneas.

7.3. Acceso al API de bit.ly desde PHP


Veamos un script PHP que consume datos del API de bit.ly. En este caso vamos a mostrar cmo
acortar una URL desde PHP utilizando este servicio web.
En los pasados artculos del Manual del API de bit.ly que estamos publicando en
DesarrolloWeb.com ya ofrecimos unas notas iniciales sobre las posibilidades del API de bit.ly, que
nos permite acortar URLs y obtener informacin sobre URLs cortas que se han generado utilizando
este servicio web.
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

As que ahora vamos a comenzar a hacer cosas ms prcticas y divertidas. En este caso se trata de
hacer un script PHP que se encargue de conectarse con el API, para enviar una URL larga y obtener
una corta. Como veremos en este artculo, se trata de una tarea bastante sencilla, aunque
requiere de varios pasos, que listamos a continuacin.
Componer una URL para la consulta en el API de bit.ly
Acceder a esa URL por medio de PHP y recibir la informacin en formato JSON
Convertir el JSON resultante en un array asociativo de PHP
Acceder a los datos que necesitemos, es decir a la URL corta generada por bit.ly
Nota: La mayora de las acciones que vamos a realizar las hemos trabajado anteriormente en
distintos artculos de DesarrolloWeb.com, como podran ser Lectura de texto de una URL o
Consumo de JSON desde PHP.
El cdigo del ejemplo bsico de uso del API de bit.ly desde PHP que hemos creado es el siguiente:
//unas variables de configuracin
$servicio_web = "http://api.bit.ly/";
$version_API = "version=2.0.1";
$usuario = "login=usuario"; //sustituye por tu usuario del API
$llave = "apiKey=R_000000"; //sustituye por tu clave del API
//la URL que quiero acortar
$URL_larga = "http://www.desarrolloweb.com/manuales/";
//codifico en formato de URL la URL larga
$query_URL = "&longUrl=" . urlencode("http://www.desarrolloweb.com/manuales/");
//genero la URL para consultar en el API de bit.ly
$URL_consulta_API = $servicio_web . "shorten?" . $version_API . "&" . $query_URL . "&" . $usuario
"&" . $llave;
//leo lo que me devuelve el API al hacer esa consulta, que estar en formato JSON
$respuesta_API = file_get_contents($URL_consulta_API);
//ahora tengo que consumir ese JSON para convertirlo en una estructura de datos accesible desde
PHP
$respuesta_API = json_decode($respuesta_API, true);
//el true anterior hace que json_decode me devuelva sea un array asociativo.
//ahora podramos mostar el contenido completo de la respuesta.
echo "<pre>";
var_dump($respuesta_API);
echo "</pre>";
//compruebo si hubo algn problema
if($respuesta_API["errorMessage"]==""){
//Todo bien, pues no hay errores
//muestro la URL corta generada por el API
echo $respuesta_API["results"][$URL_larga]["shortUrl"];
}else{
echo "Hubo un error";
}
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

Con esto tenemos listo un ejemplo de uso del API, que esperamos se haya podido entender a
travs de los comentarios. Recuerda sustituir por tus propios datos, tanto el usuario y clave del API
como la URL que quieras acortar con bit.ly.
Como se ha podido comprobar, la tarea no es nada complicada, aunque todava puede ser ms
fcil, como veremos en el siguiente artculo, en el que explicaremos y ofreceremos ejemplos sobre
una clase PHP, de programacin orientada a objetos, que existe para acceder al API de bit.ly de
una manera ms cmoda.

7.4. Clase PHP para trabajo con el API de bit.ly


Una clase, de programacin orientada a objetos en PHP, que facilita la programacin con el API de bit.ly en
PHP.
En pasados artculos hemos comenzado a explicar las particularidades del API de bit.ly, que nos

permite incorporar a nuestras pginas web las funcionalidades para acortar direcciones de ese
popular servicio web. Hasta el momento, en el Manual del API de bit.ly, hemos comentando la
lista de posibles acciones a realizar y cmo acortar una direccin larga con PHP con un script
sencillo.
Ahora vamos a mostrar cmo realizar una clase, de programacin orientada a objetos en PHP 5,
que resuma las tareas de trabajo con el API de bit.ly y nos permita realizar las acciones tpicas por
medio de mtodos de un objeto. Este ejemplo viene bien para aprender programacin orientada a
objetos con PHP, aparte de servir como prctica sobre el API de este acortador de direcciones.

7.4.1.

Funcionalidades de la clase

La clase PHP que vamos a construir implementa las funcionalidades ms importantes que
podemos necesitar realizar con el API de bit.ly, como acortar una URL larga o expandir una URL
corta previamente generada por bit.ly. Estoy seguro que se podran implementar otros mtodos
tambin tiles sobre el API, pero de momento no queremos complicar demasiado las cosas.
La lista de los mtodos que vamos a tener se puede ver a continuacin.
Constructor:
Sirve para crear un objeto de la clase, para lo que necesitamos indicar nuestro nombre de usuario
de bit.ly y la llave del API, que obtenemos al registrarnos en el servicio web.
acorta_URL:
Este mtodo recibe una URL larga e intenta acortarla con bit.ly. Si no se pudo por cualquier razn
devuelve false y en caso que la URL se acorte con xito, devuelve una cadena con la URL corta.
expande_URL:
Este mtodo sirve para obtener la URL larga a partir de una acortada con bit.ly. Es decir, recibe una
cadena con una URL corta de bit.ly y devuelve la URL original que hay detrs de una URL generada
por este servicio web. Si no se pudo expandir la URL corta, devuelve false.
Estos son los tres mtodos pblicos que tendremos por ahora, aunque dentro de la clase tenemos
otro mtodo privado, que hemos utilizado durante el desarrollo.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

muestra_respuesta:
Un mtodo privado que simplemente muestra el contenido completo que devuelve el API de bit.ly
al hacer una consulta. Simplemente imprime en la pgina la respuesta generada en el acceso al
API.
Nota: Recordemos que los elementos privados slo se pueden acceder desde mtodos que hay en
la propia clase, es decir, slo los podemos invocar desde el cdigo de la propia clase. Los elementos
pblicos, por su parte, se pueden acceder a partir de los objetos. En la prctica, si no somos los
desarrolladores de esa clase, slo podremos acceder a los mtodos pblicos

7.4.2.

Cdigo de la clase PHP Bit.ly

Ahora podemos ver el cdigo de nuestra clase para el trabajo con bit.ly desde PHP.
class bitly_PHP{
private $usuario;
private $llave;
private $version_API = "version=2.0.1";
private $servicio_web = "http://api.bit.ly/";
function __construct($login, $APIkey){
$this->usuario = "login=" . $login;
$this->llave = "apiKey=" . $APIkey;
}
private function muestra_respuesta($respuesta_API){
echo "<pre>";
var_dump($respuesta_API);
echo "</pre>";
}
public function acorta_URL($URL_larga){
$query_URL = "&longUrl=" . urlencode($URL_larga);
$URL_consulta_API = $this->servicio_web . "shorten?" . $this->version_API . "&" .
$query_URL .
"&" . $this->usuario . "&" . $this->llave;
$respuesta_API = json_decode(file_get_contents($URL_consulta_API), true);
//muestro la resupuesta
//$this->muestra_respuesta($respuesta_API);
if($respuesta_API["errorMessage"]==""){
//Todo bien, pues no hay errores
return $respuesta_API["results"][$URL_larga]["shortUrl"];
}
return false;
}
public function expande_URL($URL_corta){
$query_URL = "&shortUrl=" . urlencode($URL_corta);
$solo_codigo_bitly = substr(strstr($URL_corta, "bit.ly/"),7);
$URL_consulta_API = $this->servicio_web . "expand?" . $this->version_API . $query_URL .
"&" .
$this->usuario . "&" . $this->llave;
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

$respuesta_API = json_decode(file_get_contents($URL_consulta_API), true);


//muestro la resupuesta
//$this->muestra_respuesta($respuesta_API);
if($respuesta_API["errorMessage"]==""){
//Todo bien, pues no hay errores
return $respuesta_API["results"][$solo_codigo_bitly]["longUrl"];
}
return false;
}
}
Para entender estos cdigos de mejor manera recomendamos la lectura del artculo Acceso al API
de bit.ly desde PH.
Como se ha podido ver, se han implementado varios mtodos con un cdigo bastante corto,
aunque para entenderlo habra que conocer un poco las caractersticas del API. De la misma
manera, si queremos modificar esta clase o ampliarla con nuevos mtodos, tendramos que
conocer un poco el API.
Sin embargo, con la clase hemos creado en realidad un envoltorio para usar el API sin conocerla.
Es decir, ahora que est hecha la clase, los usuarios que simplemente quieran utilizarla para
trabajar con el API de bit.ly, no necesitarn conocerla en toda su complejidad. Realmente slo
necesitarn conocer los mtodos, sus nombres y los parmetros que reciben, as como los datos
que devuelven.

7.4.3.

Utilizacin de la clase bit.ly en PHP

Para acabar, podemos ver cmo utilizar la clase creada anteriormente para acortar una URL y
luego mostrarla de nuevo pero expandida.
//definimos la URL con la que quiero trabajar
$url trabajar = "http://www.desarrolloweb.com/articulos/crear-rss-php-mysql.html";
//construyo el objeto de la clase bitly PHP
$obj_bitly = new bitly_PHP("usuario", "R_00000000000000000000000");
//obtengo la URL corta a partir de la URL original, con el mtodo acorta URL() $url corta = $obj
bitly->acorta URL($url trabajar);
//compruebo que esa URL corta no es false (osea, que no hubo error)
if ($url_corta){
//muestro la URL corta
echo '<p>La URL, una vez acortada es ' . $url corta . '</p>';
echo '<p><a href="' . $url_corta . '">' . $url_corta . '</a></p>';
//pruebo ahora a expandir esa URL
//para ello invoco el mtodo expande URL()
$url larga = $obj bitly->expande URL($url corta);
//compruebo que la URL no sea false
if ($url_larga){
//muestro la URL expandida
echo '<p>La URL, una vez expandida es ' . $url larga . '</p>';
}else{
Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/
Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

www.desarrolloweb.com

//error al crear la URL expandida


echo '<p>Hubo un error al intentar expandir la URL</p>';
}
}else{
//error al crear la URL corta.
echo "<p>Hubo un error al intentar recortar la URL</p>";
}
Como se puede ver, en este ejemplo slo hemos necesitado indicar nuestro usuario y llave del API
en los parmetros del constructor (sustituirlos por vuestros datos de acceso obtenidos al
registrarse en bit.ly) y luego acceder a los mtodos acorta_URL() y expande_URL() para obtener las
URLs cortas o expandidas, pero sin tener que preocuparnos por los modos en los que funciona el
API de bit.ly para obtener esas respuestas.
Espero que esta clase haya servido de ejemplo para las personas que quieren usar el API de bit.ly,
pero admito que no estara del todo acabada. En un futuro artculo veremos cmo avanzar un
poco ms sobre esta clase.

Manual de PHP 5: http: //www.desarrolloweb.com /manuales/58/


Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

Potrebbero piacerti anche