Está en la página 1de 45

Tu mejor ayuda para aprender a hacer webs

www.desarrolloweb.com
Manual de PHP 5
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
(1 cap!tulos"
Daniel Lpez
http://pichongol.blogspot.com
(1 cap!tulo"
Manu Gutierrez
http://www.tu#uncion.com
($ cap!tulos"
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
1
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
Introduccin a PHP 5
)amos a comenzar con el manual de la *ltima +ersi(n de ,-,. lanzada recientemente al
mercado: ,-, /. 0na esperada e+oluci(n del. tal +ez. m1s popular de los lenguajes de
programaci(n de p1ginas y aplicaciones web del lado del ser+idor.
Este manual no +a a tratar de e2plicar desde cero la programaci(n de aplicaciones del lado del
ser+idor con ,-,. pues ese asunto lo tenemos detallado en el manual de ,-, y pensamos 3ue
merece la pena su lectura para empezar los primeros pasos en el lenguaje.
4i una persona no sabe lo 3ue son las p1ginas din1micas de ser+idor le recomendamos 3ue
comience aclarando esos conceptos. ,ara ello. tenemos dos manuales 3ue e2plican las
nociones de programaci(n del lado del cliente y ser+idor. m1s bien te(ricas. desde dos puntos
de +ista: 5anual de p1ginas din1micas y la 6ntroducci(n a los lenguajes del web.
7simismo. 3ueremos presentarte la secci(n monotem1tica de ,-,. donde se concentran todos
los contenidos sobre ,-, 3ue dispone DesarrolloWeb.com. Tambi8n ser!a interesante el 5anual
del lenguaje 49& y el Taller de 5y49&. 3ue ser1n muy *tiles re#erencias para aclarar los
conceptos de acceso a bases de datos.
#ntrodu!!in a PHP 5
:on las primeras $ +ersiones de ,-,. ,-, ; y ,-, <. se hab!a conseguido una plata#orma
potente y estable para la programaci(n de p1ginas del lado del ser+idor. Estas +ersiones han
ser+ido de mucha ayuda para la comunidad de desarrolladores. haciendo posible 3ue ,-, sea
el lenguaje m1s utilizado en la web para la realizaci(n de p1ginas a+anzadas.
4in embargo. toda+!a e2ist!an puntos negros en el desarrollo ,-, 3ue se han tratado de
solucionar con la +ersi(n /. aspectos 3ue se echaron en #alta en la +ersi(n <. casi desde el d!a
de su lanzamiento. 'os re#erimos principalmente a la programaci(n orientada a objetos (,=="
3ue. a pesar de 3ue estaba soportada a partir de ,-,;. s(lo implementaba una parte muy
pe3ue>a de las caracter!sticas de este tipo de programaci(n.
$ota: la orientaci(n a objetos es una manera de programar 3ue trata de modelar los procesos de
programaci(n de una manera cercana a la realidad: tratando a cada componente de un programa como
un objeto con sus caracter!sticas y #uncionalidades. ,odemos +er una pe3ue>a introducci(n en el art!culo
9u8 es la programacion orientada a objetos.
El principal objeti+o de ,-,/ ha sido mejorar los mecanismos de ,== para solucionar las
carencias de las anteriores +ersiones. 0n paso necesario para conseguir 3ue ,-, sea un
lenguaje apto para todo tipo de aplicaciones y entornos. incluso los m1s e2igentes.
Artculo por Miguel Angel Alvarez
Instalar PHP 5 fcilmente
,ara los 3ue han instalado alguna +ez ,-, en Windows sabr1n 3ue es un proceso 3ue re3uiere
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
$
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
+arios pasos. -ay 3ue instalar el ser+idor web 7pache. luego el propio ,-, y tambi8n la base
de datos 5y49& para trabajar con ,-,. En ,-, / la cosa contin*a igual. pero e2iste un m8todo
r1pido y sencillo de instalar ,-,/ en nuestro sistema.
,ara los 3ue no han instalado nunca ,-,/ hay 3ue comentar 3ue no tengan miedo para nada
al lenguaje. 3ue es muy sencillo y agradecido. 'o cabe tampoco tener miedo de la instalaci(n
o con#iguraci(n de ,-,. por3ue en este art!culo +amos a e2plicar un modo de realizarla en /
minutos y sin necesidad de conocimientos iniciales.
=s paso unas notas r1pidas sobre el proceso de instalaci(n de ,-, / en Windows por medio de
un programa 3ue se llama Wamp 4er+er $. 3ue os #acilitar1 la tarea. ,odr1s comenzar a
trabajar con ,-, / en / minutos??
#nstala!in de PHP 5
&o primero es entrar en la p1gina de Wamp 4er+er. 3ue es la siguiente:
http://www.wampser+er.com/en/
:omo hab!a comentado. Wamp 4er+er es un programa 3ue instala en un s(lo paso 7pache @
,-, @ 5y49& y los con#igura para trabajar juntos.
-abr!a 3ue hacer la descarga de la *ltima +ersi(n de Wamp 4er+er en:
http://www.wampser+er.com/en/download.php
En la p1gina de descarga te especi#ica claramente la lista de programas 3ue +a a instalar. as!
como las +ersiones de los mismos. En el momento de escribir este art!culo iban por la +ersi(n
Wamp4er+er $.A. 3ue instala esta lista de programas:
7pache $.$.B
,-, /.$. @ ,E:&
49&itemanager
5y49& /.A./1b
,hpmyadmin
0na +ez descargado el programa. lo ejecutamos para realizar la instalaci(n de Wamp 4er+er $.
&a instalaci(n se basa en un asistente normal 3ue nos solicitar1 +arios datos t!picos de
instalaciones. como 3ue aceptemos los t8rminos de la licencia. &uego nos saldr1 la +entana
para acabar 3ue marcaremos 3ue ejecute Wamp 4er+er inmediatamente.
4i todo ha #uncionado. en 1 minuto m1s podremos comprobar si ,-, / est1 #uncionando en
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
;
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
nuestro ordenador. 4(lo tendr!amos 3ue encender los ser+icios. ,ara ello Wamp 4er+er tiene
un panel de control 3ue se accede desde un icono de programa residente de la barra de tareas.
Tiene una #orma rara. como un cuentaCil(metros. &o +eremos en esta imagen:
,ulsamos el icono con el rat(n (bot(n iz3uierdo. clic normal" y +eremos abajo del todo una
instrucci(n 3ue pone D,ut =nlineE. 3ue pondr1 todos los ser+icios en #uncionamiento.
7hora. para comprobar 3ue los ser+icios #uncionan s(lo nos 3ueda abrir un na+egador. )amos
a escribir la siguiente direcci(n 0F& en la barra de direcciones:
http://localhost
Entonces nos tiene 3ue salir la p1gina de inicio del ser+idor 7pache con ,-, /. personalizada
por Wamp. 3ue es algo como esto:
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
<
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
4i no no sale nada puede 3ue haya habido un problema o un error al iniciar los ser+icios.
generalmente el 7pache. 3ue utiliza el puerto BA 3ue a +eces est1 ocupado por otro programa
como 4Cype o 664. &ee la G79: 'o #unciona el Wamp 4er+er $.
7hora podremos colocar en nuestro ser+idor todas las p1ginas ,-, 3ue 3ueramos probar o los
proyectos 3ue hayamos creado anteriormente. El directorio donde generalmente se localiza la
ra!z de publicaci(n es: ::HwampHwww
En esa carpeta podr!amos subir cual3uier archi+o ,-, < o ,-, / y deber!a ejecutarse
per#ectamente. =tra cosa 3ue puede #allar es 3ue los inicios de blo3ues de c(digo ,-, 3ue
deb8is utilizar son con DIJphpE y no s(lo con DIJE. 3ue est1 deshabilitado por de#ecto.
=s aseguro 3ue leer este art!culo os lle+ar1 m1s tiempo 3ue instalar ,-, / en +uestro
ordenador. :on Wamp 4er+er $ es muy #1cil.
Artculo por Miguel Angel Alvarez
Modelo de orientacin a objetos de PHP 3 y 4
&a +ersi(n ; de ,-, ya soportaba la programaci(n orientada a objetos (,==". aun3ue es
+erdad 3ue la mayor!a de las caracter!sticas de este tipo de programaci(n no estaban
implementadas toda+!a. En concreto. con ,-,; pod!amos crear clases e instanciar objetos. &as
clases permit!an agrupar tanto m8todos como propiedades o atributos. pero la cosa se
3uedaba ah!.
En ,-,<. se reescribi( el motor de ,-, para hacerlo mucho m1s r1pido y estable. pero la ,==.
3ue hab!a introducido la anterior +ersi(n del lenguaje. no se lleg( a modi#icar pr1cticamente.
7un as!. durante la +igencia de ,-, <. la programaci(n orientada a objetos #ue utilizada
habitualmente. a menudo en aplicaciones de gran tama>o. Entornos donde se puso de
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
/
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
mani#iesto la #alta de potencia de la ,== en ,-, < y la necesidad de mejorarla en una nue+a
+ersi(n.
El mayor problema de la ,== en las +ersiones ; y < de ,-, se basaba en 3ue. cada +ez 3ue se
asignaba una +ariable 3ue conten!a un objeto a otra +ariable. o se pasaba un objeto por
par1metro en una #unci(n. se realizaba una copia (un clon" de ese objeto y 3uedaba a
disposici(n del programa en la nue+a +ariable o par1metro.
Kpepe L new persona(MpepeM"N
Kpepe$ L KpepeN
En un c(digo como el anterior. se tiene un objeto persona alojado en la +ariable Kpepe y en la
segunda l!nea de c(digo. se crea un clon de Kpepe y se asigna a la +ariable Kpepe$. En este
caso y siempre siguiendo el anterior modo de trabajo de ,-,. aun3ue Kpepe y Kpepe$
contienen un objeto id8ntico. no se trata del mismo objeto sino de una copia. Todo esto implica
3ue el espacio en memoria para guardar los dos objetos es el doble 3ue si #uera un mismo
objeto con dos nombres distintos.
Esta situaci(n ocurr!a por3ue los objetos eran tratados del mismo modo 3ue las +ariables
normales. 3ue se pasan por +alor en las #unciones y en caso de asignarse. se realiza una copia
de la +ariable antes de asignarse al nue+o espacio.
%&emplo del modo de traa&o !on o&etos de PHP ' ( )
)amos a realizar un ejemplo para ilustrar el modo de trabajo de ,-, ; y < con los objetos. En
este ejemplo podr1 3uedar patente el proceso de clonaci(n de los objetos al ser pasados en
una #unci(n o al asignarse a otra +ariable.
,rimero +eamos una declaraci(n de un objeto muy simple. 4e trata de una McajaM 3ue tiene un
atributo 3ue es el contenido y dos m8todos. uno para introducir nue+os contenidos en la caja y
otro para mostrar el contenido actual de la caja.
class :ajaO
+ar KcontenidoN
#unction introduce(Kcosa"O
KthisPQcontenido L KcosaN
R
#unction muestraScontenido("O
echo KthisPQcontenidoN
R
R
7hora +amos a +er unas pocas l!neas de c(digo 3ue hacen uso de la clase :aja para ilustrar el
modo de trabajo de los objetos en ,-, <. )amos a instanciar el objeto. luego lo asignamos a
otra +ariable. con lo 3ue se crear1 un clon de ese objeto. continuamos modi#icando el clon y
+eremos 3ue pasa.
Kmicaja L new :aja("N
KmicajaPQintroduce(MalgoM"N
KmicajaPQmuestraScontenido("N
echo MIbrQMN
KsegundaScaja L KmicajaN
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.

Tu mejor ayuda para aprender a hacer webs


www.desarrolloweb.com
KsegundaScajaPQintroduce(Mcontenido en segunda cajaM"N
KsegundaScajaPQmuestraScontenido("N
echo MIbrQMN
KmicajaPQmuestraScontenido("N
En la primera l!nea de c(digo se instancia la caja y se aloja el objeto en la +ariable Kmicaja. En
la segunda l!nea se introduce el string MalgoM en el contenido de la caja. &uego se muestra el
contenido. con lo 3ue saldr1 el string MalgoM en la p1gina web.
En el segundo blo3ue de c(digo se asigna el objeto Kmicaja a la +ariable KsegundaScaja. con
lo 3ue se crea el mencionado clon del objeto Kmicaja y se asigna a la nue+a +ariable. &uego se
introduce un nue+o contenido a la instancia alojada en la +ariable KsegundaScaja. 7tenci(n
a3u!. por3ue se ha modi#icado el clon alojado en la +ariable KsegundaScaja. dejando
inalterable el objeto original Kmicaja.
,ara comprobarlo. se muestra el contenido del objeto KsegundaScaja. con lo 3ue aparece en la
p1gina web el string Mcontenido en segunda cajaM. Tambi8n se muestra el contenido de
Kmicaja. 3ue no se ha modi#icado a pesar de actualizar el contenido de su clon. con lo 3ue se
muestra el string MalgoM.
Espero 3ue no sea demasiado di#!cil de entender. ,od8is hacer la prueba por +osotros mismos
para comprender bien el ejercicio. De todos modos. +amos a hacer otro ejemplo en el 3ue se
utiliza la clase :aja. 3ue esperamos sir+a para aclarar mejor el trabajo con objetos en ,-, ; y
<.
Kmicaja L new :aja("N
KmicajaPQintroduce(MalgoM"N
KmicajaPQmuestraScontenido("N
echo MIbrQMN
#unction +aciaScaja(KcajaS+aciar"O
KcajaS+aciarPQintroduce(Mpol+oM"N
R
+aciaScaja(Kmicaja"N
KmicajaPQmuestraScontenido("N
En este ejemplo hemos creado una #unci(n 3ue recibe por par1metro un objeto de la clase
caja. :omo los par1metros en las #unciones se reciben por +alor en lugar de re#erencia. cuando
se pasa el par1metro del objeto caja. en el #ondo lo 3ue se est1 realizando es una copia de ese
objeto. de modo 3ue dentro de la #unci(n se trabaja con un clon del objeto. en lugar del objeto
mismo.
En el c(digo se instancia el objeto caja y se introduce MalgoM en su contenido. &uego. se
declara una #unci(n 3ue recibe el objeto y modi#ica su contenido. introduciendo el string
Mpol+oM en el contenido de la caja. En las siguientes l!neas de c(digo. se llama a la #unci(n
declarada anteriormente. pasando por par1metro el objeto Kmicaja. Dentro de la #unci(n.
como dec!a. se modi#ica el contenido de la caja. aun3ue realmente se est1 modi#icando el
contenido de un clon.
,or *ltimo. se muestra el contenido del objeto Kmicaja. En este caso aparece MalgoM. a pesar
de 3ue en la #unci(n ese MalgoM se modi#ic( por Mpol+oM. 7 pesar de poder parecer pesado.
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
T
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
+uel+o a repetir 3ue en la #unci(n se modi#ic( un clon del objeto y no el objeto original.
&os comportamientos descritos anteriormente no son muy habituales en otros lenguajes de
programaci(n orientada a objetos. como Ua+a. donde el objeto no se duplica cada +ez 3ue se
realiza una asignaci(n o paso por par1metro.
,ara e+itar el comportamiento 3ue hemos descrito. ,-, dispone de la opci(n de paso de
par1metros por re#erencia. 3ue se realiza con el car1cter MVM. ,or ejemplo. para asignar el
propio objeto y no un clon podr!amos haber utilizado este c(digo:
KsegundaScaja L VKmicajaN
,ara recibir un par1metro por re#erencia en lugar de por +alor en una #unci(n utilizar!amos esta
declaraci(n de #unci(n:
#unction +aciaScaja(VKcajaS+aciar"O
&a posibilidad de utilizar el car1cter MVM para #orzar un paso por re#erencia no deja de ser un
problema. puesto 3ue nos obliga a utilizar ese mecanismo en m*ltiples lugares y es muy #1cil
ol+idarse del MVM en alg*n sitio. con lo 3ue nuestro programa ya no realizar1 los resultados
esperados. 5uchos programadores han gastado horas en encontrar el problema y en cual3uier
caso. es una molestia tener 3ue estar pendientes de incluir constantemente el signo MVM en el
c(digo para hacer 3ue #uncione como ellos desean.
Artculo por Miguel Angel Alvarez
Modelo de orientacin a objetos en PHP 5
En el art!culo anterior comentamos las carencias del modelo de orientaci(n a objetos en ,-, ;
y <. 3ue a#ortunadamente han 3uedado sol+entadas en la +ersi(n ,-, /.
:omo dec!amos. uno de los problemas m1s b1sicos de las +ersiones anteriores de ,-, era la
clonaci(n de objetos. 3ue se realizaba al asignar un objeto a otra +ariable o al pasar un objeto
por par1metro en una #unci(n. ,ara sol+entar este problema ,-,/ hace uso de los
manejadores de objetos (=bject handles". 3ue son una especie de punteros 3ue apuntan hacia
los espacios en memoria donde residen los objetos. :uando se asigna un manejador de
objetos o se pasa como par1metro en una #unci(n. se duplica el propio object handle y no el
objeto en si.
$ota: Tambi8n se puede realizar una clonaci(n de un objeto. para obtener una copia e2acta. pero 3ue no
es el propio objeto. ,ara ello utilizamos una nue+a instrucci(n llamada McloneM. 3ue +eremos m1s
adelante.
Algunas !ara!ter*sti!as del traa&o !on P++ en PHP 5
)eamos a continuaci(n una pe3ue>a lista de las nue+as caracter!sticas de la programaci(n
orientada a objetos (,==" en ,-,/. 'o +amos a describir e2hausti+amente cada caracter!stica.
Wa lo haremos m1s adelante en este mismo manual.
,.- $omres .i&os para los !onstru!tores ( destru!tores
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
B
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
En ,-, / hay 3ue utilizar unos nombres prede#inidos para los m8todos constructores y
destructores (&os 3ue se encargan de resumir las tareas de inicializaci(n y destrucci(n de los
objetos. 7hora se han de llamar SSconstruct(" y SSdestruct(".
/.- A!!eso puli!0 private ( prote!ted a propiedades ( m1todos
7 partir de ahora podemos utilizar los modi#icadores de acceso habituales de la ,==. Estos
modi#icadores sir+en para de#inir 3u8 m8todos y propiedades de las clases son accesibles
desde cada entorno.
'.- Posiilidad de uso de inter.a!es
&as inter#aces se utilizan en la ,== para de#inir un conjunto de m8todos 3ue implementa una
clase. 0na clase puede implementar +arias inter#aces o conjuntos de m8todos. En la pr1ctica.
el uso de inter#aces es utilizado muy a menudo para suplir la #alta de herencia m*ltiple de
lenguajes como ,-, o Ua+a. &o e2plicaremos con detalle m1s adelante.
).- M1todos ( !lases .inal
En ,-, / se puede indicar 3ue un m8todo es M#inalM. :on ello no se permite sobrescribir ese
m8todo. en una nue+a clase 3ue lo herede. 4i la clase es M#inalM. lo 3ue se indica es 3ue esa
clase no permite ser heredada por otra clase.
5.- +perador instan!eo.
4e utiliza para saber si un objeto es una instancia de una clase determinada.
2.- Atriutos ( m1todos stati!
En ,-,/ podemos hacer uso de atributos y m8todos MstaticM. 4on las propiedades y
#uncionalidades a las 3ue se puede acceder a partir del nombre de clase. sin necesidad de
haber instanciado un objeto de dicha clase.
3.- 4lases ( m1todos astra!tos
Tambi8n es posible crear clases y m8todos abstractos. &as clases abstractas no se pueden
instanciar. se suelen utilizar para heredarlas desde otras clases 3ue no tienen por3ue ser
abstractas. &os m8todos abstractos no se pueden llamar. se utilizan m1s bien para ser
heredados por otras clases. donde no tienen por3ue ser declarados abstractos.
".- 4onstantes de !lase
4e pueden de#inir constantes dentro de la clase. &uego se pueden acceder dichas constantes a
tra+8s de la propia clase.
5.- 6un!iones 7ue espe!i.i!an la !lase 7ue re!ien por par8metro
7hora se pueden de#inir #unciones y declarar 3ue deben recibir un tipo espec!#ico de objeto. En
caso 3ue el objeto no sea de la clase correcta. se produce un error.
,9.- 6un!in ::autoload;<
Es habitual 3ue los desarrolladores escriban un archi+o por cada clase 3ue realizan. como
t8cnica para organizar el c(digo de las aplicaciones. ,or esa raz(n. a +eces resulta tedioso
realizar los incluyes de cada uno de los c(digos de las clases 3ue se utilizana en un script. &a
#unci(n SSautoload(" sir+e para intentar incluir el c(digo de una clase 3ue se necesite. y 3ue
no haya sido declarada toda+!a en el c(digo 3ue se est1 ejecutando.
,,.- 4lonado de o&etos
4i se desea. se puede realizar un objeto a partir de la copia e2acta de otro objeto. ,ara ello se
utiliza la instrucci(n McloneM. Tambi8n se puede de#inir el m8todo SSclone(" para realizar tareas
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
X
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
asociadas con la clonaci(n de un objeto.
Artculo por Miguel Angel Alvarez
lases en PHP 5
4lases en PHP 5
&as clases en ,rogramaci(n orientada a objetos (,==" son de#iniciones de los elementos 3ue
#orman un sistema. en este caso. de#iniciones de los objetos 3ue +an a inter+enir en nuestros
programas.
0n objeto se de#ine indicando 3u8 propiedades y #uncionalidades tiene. Uustamente esas
declaraciones son lo 3ue es una clase. :uando se hace una clase simplemente se especi#ica
3u8 propiedades y #uncionalidades tiene. ,or ejemplo. un hombre podr!a tener como
propiedades el nombre o la edad y como #uncionalidades. comer. mo+erse o estudiar.
En la clase hombre declarar!amos dos atributos: la edad o el nombre. 3ue ser!an como dos
+ariables. Tambi8n deber!amos crear tres m8todos. con los procedimientos a seguir para 3ue el
hombre pueda comer. mo+erse o estudiar. Estos m8todos se de#inen declarando #unciones
dentro de la clase.
El c(digo para de#inir una clase se puede +er a continuaci(n:
class hombreO
+ar KnombreN
+ar KedadN
#unction comer(Kcomida"O
//a3u! el c(digo del m8todo
R
#unction mo+erse(Kdestino"O
//a3u! el c(digo del m8todo
R
#unction estudiar(Kasignatura"O
//a3u! el c(digo del m8todo
R
R
,odr1 comprobarse 3ue este c(digo no di#iere en nada del de las +ersiones anteriores de ,-,.
3ue ya soportaban ciertas caracter!sticas de la ,==. Esta situaci(n cambiar1 a poco 3ue
e2ploremos las caracter!sticas m1s a+anzadas de ,-, /. 3ue implicar1n mejoras 3ue no
estaban presentes en las +ersiones anteriores
#nstan!iar o&etos a partir de !lases
-emos +isto 3ue una clase es tan s(lo una de#inici(n. 4i 3ueremos trabajar con las clases
debemos instanciar objetos. proceso 3ue consiste en generar un ejemplar de una clase.
,or ejemplo. tenemos la clase hombre anterior. :on la clase en si no podemos hacer nada.
pero podemos crear objetos hombre a partir de esa clase. :ada objeto hombre tendr1 unas
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
1A
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
caracter!sticas propias. como la edad o el nombre. 7dem1s podr1 desempe>ar unas #unciones
como comer o mo+erse. ahora bien. cada uno comer1 o se mo+er1 por su cuenta cuando le
sea solicitado. sin inter#erir en principio con lo 3ue pueda estar haciendo otro hombre.
Wa 3ue estamos. +amos a +er c(mo se generar!an un par de hombres. es decir. c(mo se
instanciar!an un par de objetos de la clase hombre. ,ara ello utilizamos el operador new.
Kpepe L new hombre("N
Kjuan L new hombre("N
4on!lusin
Es importante darse cuenta de la di#erencia entre un objeto y una clase. &a clase es una
de#inici(n de unas caracter!sticas y #uncionalidades. algo abstracto 3ue se concreta con la
instanciaci(n de un objeto de dicha clase.
0n objeto ya tiene propiedades. con sus +alores concretos. y se le pueden pasar mensajes
(llamar a los m8todos" para 3ue hagan cosas.
Artculo por Miguel Angel Alvarez
onstructores en PHP 5
&os constructores se encargan de resumir las acciones de inicializaci(n de los objetos. :uando
se instancia un objeto. se tienen 3ue realizar +arios pasos en su inicializaci(n. por ejemplo dar
+alores a sus atributos y eso es de lo 3ue se encarga el constructor. &os constructores pueden
recibir unos datos para inicializar los objetos como se desee en cada caso.
&a sinta2is para la creaci(n de constructor +ar!a con respecto a la de ,-, ; y <. pues debe
llamarse con un nombre #ijo: SSconstruct(". (4on dos guiones bajos antes de la palabra
MconstructM"
7 lo largo de los ejemplos de este manual +amos a ir creando un c(digo para gesti(n de un
+ideoclub. )amos a empezar de#iniendo una clase cliente. 3ue utilizaremos luego en nuestro
programa.
class clienteO
+ar KnombreN
+ar KnumeroN
+ar KpeliculasSal3uiladasN
#unction SSconstruct(Knombre.Knumero"O
KthisPQnombreLKnombreN
KthisPQnumeroLKnumeroN
KthisPQpeliculasSal3uiladasLarray("N
R
#unction dameSnumero("O
return KthisPQnumeroN
R
R
El constructor en esta clase recibe el nombre y n*mero 3ue asignar al cliente. 3ue introduce
luego en sus correspondientes propiedades. 7dem1s inicializa el atributo pel!culasSal3uiladas
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
11
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
como un array. en este caso +ac!o por3ue toda+!a no tiene ninguna pel!cula en su poder.
$ota: En programaci(n orientada a objetos Kthis hace re#erencia al objeto sobre el 3ue se est1
ejecutando el m8todo. En este caso. como se trata de un constructor. Kthis hace re#erencia al objeto 3ue
se est1 construyendo. :on KthisPQnombreLKnombreN estamos asignando al atributo DnombreE del objeto
3ue se est1 construyendo el +alor 3ue contiene la +ariable Knombre. 3ue se ha recibido por par1metro.
&uego hemos creado un m8todo muy sencillo para poder utilizar el objeto. )amos a +er unas
acciones simples para ilustrar el proceso de instanciaci(n y utilizaci(n de los objetos.
//instanciamos un par de objetos cliente
Kcliente1 L new cliente(M,epeM. 1"N
Kcliente$ L new cliente(MFobertoM. /<"N
//mostramos el numero de cada cliente creado
echo MEl identi#icador del cliente 1 es: M . Kcliente1PQdameSnumero("N
echo MEl identi#icador del cliente $ es: M . Kcliente$PQdameSnumero("N
Este ejemplo obtendr!a esta salida como resultado de su ejecuci(n:
El identi#icador del cliente 1 es: 1
El identi#icador del cliente $ es: /<
Artculo por Miguel Angel Alvarez
!estructores en PHP 5
&os destructores son #unciones 3ue se encargan de realizar las tareas 3ue se necesita ejecutar
cuando un objeto deja de e2istir. :uando un objeto ya no est1 re#erenciado por ninguna
+ariable. deja de tener sentido 3ue est8 almacenado en la memoria. por tanto. el objeto se
debe destruir para liberar su espacio. En el momento de su destrucci(n se llama a la #unci(n
destructor. 3ue puede realizar las tareas 3ue el programador estime oportuno realizar.
&a creaci(n del destructor es opcional. 4(lo debemos crearlo si deseamos hacer alguna cosa
cuando un objeto se elimine de la memoria.
El destructor es como cual3uier otro m8todo de la clase. aun3ue debe declararse con un
nombre #ijo: SSdestruct(".
En el c(digo siguiente +amos a +er un destructor en #uncionamiento. 7un3ue la acci(n 3ue
realiza al destruirse el objeto no es muy *til. nos puede ser+ir bien para +er c(mo trabaja.
class clienteO
+ar KnombreN
+ar KnumeroN
+ar KpeliculasSal3uiladasN
#unction SSconstruct(Knombre.Knumero"O
KthisPQnombreLKnombreN
KthisPQnumeroLKnumeroN
KthisPQpeliculasSal3uiladasLarray("N
R
#unction SSdestruct("O
echo MIbrQdestruido: M . KthisPQnombreN
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
1$
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
R
#unction dameSnumero("O
return KthisPQnumeroN
R
R
//instanciamos un par de objetos cliente
Kcliente1 L new cliente(M,epeM. 1"N
Kcliente$ L new cliente(MFobertoM. /<"N
//mostramos el numero de cada cliente creado
echo MEl identi#icador del cliente 1 es: M . Kcliente1PQdameSnumero("N
echo MIbrQEl identi#icador del cliente $ es: M . Kcliente$PQdameSnumero("N
Este c(digo es igual 3ue el anterior. 4(lo se ha a>adido el destructor. 3ue imprime un mensaje
en pantalla con el nombre del cliente 3ue se ha destruido. Tras su ejecuci(n obtendr!amos la
siguiente salida.
El identi#icador del cliente 1 es: 1
El identi#icador del cliente $ es: /<
destruido: ,epe
destruido: Foberto
:omo +emos. antes de acabar el script. se libera el espacio en memoria de los objetos. con lo
3ue se ejecuta el destructor y aparece el correspondiente mensaje en la p1gina.
0n objeto puede 3uedar sin re#erencias y por lo tanto ser destruido. por muchas razones. ,or
ejemplo. el objeto puede ser una +ariable local de una #unci(n y al #inalizarse la ejecuci(n de
esa #unci(n la +ariable local dejar!a de tener +alidez. con lo 3ue debe destruirse.
El c(digo siguiente ilustra c(mo una +ariable local a cual3uier 1mbito (por ejemplo. local a una
#unci(n". se destruye cuando ese 1mbito ha #inalizado.
#unction creaSclienteSlocal("O
KclienteSlocal L new cliente(Msoy localM. /"N
R
creaSclienteSlocal("
&a #unci(n simplemente crea una +ariable local 3ue contiene la instanciaci(n de un cliente.
:uando la #unci(n se acaba. la +ariable local deja de e2istir y por lo tanto se llama al
destructor de#inido para ese objeto.
$ota: Tambi8n podemos deshacernos de un objeto sin necesidad 3ue acabe el 1mbito donde #ue creado.
,ara ello tenemos la #unci(n unset(" 3ue recibe una +ariable y la elimina de la memoria. :uando se pierde
una +ariable 3ue contiene un objeto y ese objeto deja de tener re#erencias. se elimina al objeto y se llama
al destructor.
Artculo por Miguel Angel Alvarez
Modificadores de acceso a m"todos y #ro#iedades en PHP5
)eremos en este cap!tulo los nue+os modi#icadores de acceso a los m8todos y atributos de los
objetos 3ue se han incorporado en ,-, /. Estos modi#icadores de acceso no son otros 3ue los
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
1;
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
conocidos public. protected y pri+ate. 3ue ya disponen otros lenguajes como Ua+a.
0no de los principios de la programaci(n orientada a objetos es la encapsulaci(n. 3ue es un
proceso por el 3ue se ocultan las caracter!sticas internas de un objeto a a3uellos elementos
3ue no tienen por3ue conocerla. &os modi#icadores de acceso sir+en para indicar los permisos
3ue tendr1n otros objetos para acceder a sus m8todos y propiedades.
Modi.i!ador puli!
Es el ni+el de acceso m1s permisi+o. 4ir+e para indicar 3ue el m8todo o atributo de la clase es
p*blico. En este caso se puede acceder a ese atributo. para +isualizarlo o editarlo. por
cual3uier otro elemento de nuestro programa. Es el modi#icador 3ue se aplica si no se indica
otra cosa.
)eamos un ejemplo de clase donde hemos declarado como public sus elementos. un m8todo y
una propiedad. 4e trata de la clase MdadoM. 3ue tiene un atributo con su puntuaci(n y un
m8todo para tirar el dado y obtener una nue+a puntuaci(n aleatoria.
class dadoO
public KpuntosN
#unction SSconstruct("O
srand((double"microtime("Y1AAAAAA"N
R
public #unction tirate("O
KthisPQpuntosLKrand+al L rand(1."N
R
R
KmiSdado L new dado("N
#or (KiLANKiI;ANKi@@"O
KmiSdadoPQtirate("N
echo MIbrQ-an salido M . KmiSdadoPQpuntos . M puntosMN
R
)emos la declaraci(n de la clase dado y luego unas l!neas de c(digo para ilustrar su
#uncionamiento. En el ejemplo se realiza un bucle ;A +eces. en las cuales se tira el dado y se
muestra la puntuaci(n 3ue se ha obtenido.
:omo el atributo Kpuntos y el m8todo tirate(" son p*blicos. se puede acceder a ellos desde
#uera del objeto. o lo 3ue es lo mismo. desde #uera del c(digo de la clase.
Modi.i!ador private
Es el ni+el de acceso m1s restricti+o. 4ir+e para indicar 3ue esa +ariable s(lo se +a a poder
acceder desde el propio objeto. nunca desde #uera. 4i intentamos acceder a un m8todo o
atributo declarado pri+ate desde #uera del propio objeto. obtendremos un mensaje de error
indicando 3ue no es posible a ese elemento.
4i en el ejemplo anterior hubi8ramos declarado pri+ate el m8todo y la propiedad de la clase
dado. hubi8ramos recibido un mensaje de error.
73u! tenemos otra posible implementaci(n de la clase dado. declarando como pri+ate el
atributo puntos y el m8todo tirate(".
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
1<
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
class dadoO
pri+ate KpuntosN
#unction SSconstruct("O
srand((double"microtime("Y1AAAAAA"N
R
pri+ate #unction tirate("O
KthisPQpuntosLKrand+al L rand(1."N
R
public #unction dameSnue+aSpuntuacion("O
KthisPQtirate("N
return KthisPQpuntosN
R
R
KmiSdado L new dado("N
#or (KiLANKiI;ANKi@@"O
echo MIbrQ-an salido M . KmiSdadoPQdameSnue+aSpuntuacion(" . M puntosMN
R
-emos tenido 3ue crear un nue+o m8todo p*blico para operar con el dado. por3ue si es todo
pri+ado no hay manera de hacer uso de 8l. El mencionado m8todo es
dameSnue+aSpuntuaci(n(". 3ue realiza la acci(n de tirar el dado y de+ol+er el +alor 3ue ha
salido.
Modi.i!ador prote!ted
Este indica un ni+el de acceso medio y un poco m1s especial 3ue los anteriores. 4ir+e para 3ue
el m8todo o atributo sea p*blico dentro del c(digo de la propia clase y de cual3uier clase 3ue
herede de a3uella donde est1 el m8todo o propiedad protected. Es pri+ado y no accesible
desde cual3uier otra parte. Es decir. un elemento protected es p*blico dentro de la propia clase
y en sus heredadas.
51s adelante e2plicaremos la herencia y podremos o#recer ejemplos con el modi#icador
protected.
4on!lusin
5uchas +eces el propio desarrollador es el 3ue #ija su criterio a la hora de aplicar los distintos
modi#icadores de acceso a atributos y m8todos. ,oca protecci(n implica 3ue los objetos
pierdan su encapsulaci(n y con ello una de las +entajas de la ,==. 0na protecci(n mayor
puede hacer m1s laborioso de generar el c(digo del programa. pero en general es aconsejable.
Artculo por Miguel Angel Alvarez
$a %erencia en PHP5
&a herencia es uno de los mecanismos #undamentales de la programaci(n orientada a objetos.
,or medio de la herencia. se pueden de#inir clases a partir de la declaraci(n de otras clases.
&as clases 3ue heredan incluyen tanto los m8todos como las propiedades de la clase a partir de
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
1/
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
la 3ue est1n de#inidos.
,or ejemplo. pensemos en la clase M+eh!culoM. Esta clase general puede incluir las
caracter!sticas generales de todos los +eh!culos (atributos de la clase". como la matr!cula. a>o
de #abricaci(n y potencia. 7dem1s. incluir1 algunas #uncionalidades (m8todos de la clase"
como podr!an ser. arrancar(" o mo+erse(".
7hora bien. en la pr1ctica e2isten +arios tipos de +eh!culos. como los coches. los autobuses y
los camiones. Todos ellos tienen unas caracter!sticas comunes. 3ue han sido de#inidas en la
clase +eh!culo. 7dem1s. tendr1n una serie de caracter!sticas propias del tipo de +eh!culo. 3ue.
en principio. no tienen otros tipos de +eh!culos. ,or ejemplo. los camiones pueden tener una
carga m12ima permitida o los autobuses un n*mero de plazas disponibles. Del mismo modo.
las clases m1s espec!#icas pueden tener unas #uncionalidades propias. como los camiones
cargar(" y descargar(". o los autobuses aceptarSpasajeros(" o +enderSbillete(".
&o normal en sistemas de herencia es 3ue las clases 3ue heredan de otras incluyan nue+as
caracter!sticas y #uncionalidades. aparte de los atributos y m8todos heredados. ,ero esto no es
imprescindible. de modo 3ue se pueden crear objetos 3ue hereden de otros y no incluyan nada
nue+o.
=inta>is de heren!ia en PHP 5
&a programaci(n orientada a objetos nos o#rece una serie de mecanismos para de#inir este tipo
de estructuras. de modo 3ue se puedan crear jerar3u!as de objetos 3ue heredan unos de
otros. )eremos ahora c(mo de#inir estas estructuras de herencia en ,-, /. ,ara ello.
continuando con nuestro ejemplo de +ideo club. +amos a crear los distintos tipos de elementos
3ue se o#recen en al3uiler.
:omo todo el mundo conoce. los +ideo clubs o#recen distintos tipos de elementos para al3uiler.
como pueden ser las pel!culas (cintas de +!deo o D)D" y los juegos. :ada elemento tiene unas
caracter!sticas propias y algunas comunes. -emos llamado MsoporteM a la clase general. 3ue
incluye las caracter!sticas comunes para todos los tipos de elementos en al3uiler. &uego hemos
creado tres tipos de soportes distintos. 3ue heredan de la clase soporte. pero 3ue incluyen
algunas caracter!sticas y #uncionalidades nue+as. Estos tipos de soporte ser1n McintaS+ideoM.
Md+dM y MjuegoM.
El es3uema de herencia 3ue +amos a realizar en este ejemplo se puede +er en la siguiente
imagen.
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
1
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
Empezamos por la clase soporte. 4u c(digo ser1 el siguiente:
class soporteO
public KtituloN
protected KnumeroN
pri+ate KprecioN
#unction SSconstruct(Ktit.Knum.Kprecio"O
KthisPQtitulo L KtitN
KthisPQnumero L KnumN
KthisPQprecio L KprecioN
R
public #unction dameSprecioSsinSi+a("O
return KthisPQprecioN
R
public #unction dameSprecioSconSi+a("O
return KthisPQprecio Y 1.1N
R
public #unction dameSnumeroSidenti#icacion("O
return KthisPQnumeroN
R
public #unction imprimeScaracteristicas("O
echo KthisPQtituloN
echo MIbrQM . KthisPQprecio . M (6)7 no incluido"MN
R
R
&os atributos 3ue hemos de#inido son. t!tulo. numero (un identi#icador del soporte" y precio.
-emos aplicado a cada uno un modi#icador de acceso distinto. para poder practicar los
distintos tipos de acceso.
-emos de#inido un constructor. 3ue recibe los +alores para la inicializaci(n del objeto. 0n
m8todo dameSprecioSsinSi+a(". 3ue de+uel+e el precio del soporte. sin aplicarle el 6)7. =tro
m8todo dameSprecioSconSi+a(". 3ue de+uel+e el precio una +ez aplicado el 1Z de 6)7. El
m8todo dameSnumeroSidenti#icacion(". 3ue de+uel+e el n*mero de identi#icador y
imprimeScaracteristicas(". 3ue muestra en la p1gina las caracter!sticas de este soporte.
$ota: :omo se ha de#inido como pri+ate el atributo precio. este atributo s(lo se podr1 acceder dentro del
c(digo de la clase. es decir. en la propia de#inici(n del objeto. 4i 3ueremos acceder al precio desde #uera
de la clase (algo muy normal si tenemos en cuenta 3ue +amos a necesitar el precio de un soporte desde
otras partes de la aplicaci(n" ser1 necesario crear un m8todo 3ue nos de+uel+a el +alor del precio. Este
m8todo deber!a de#inirse como public. para 3ue se pueda acceder desde cual3uier sitio 3ue se necesite.
En todos los m8todos se hace uso de la +ariable Kthis. Esta +ariable no es m1s 3ue una
re#erencia al objeto sobre el 3ue se est1 ejecutando el m8todo. En programaci(n orientada a
objetos. para ejecutar cual3uiera de estos m8todos. primero tenemos 3ue haber creado un
objeto a partir de una clase. &uego podremos llamar los m8todos de un objeto. Esto se hace
con KmiSobjetoPQmetodoSaSllamar(". Dentro de m8todo. cuando se utiliza la +ariable Kthis. se
est1 haciendo re#erencia al objeto sobre el 3ue se ha llamado al m8todo. en este caso. el
objeto KmiSobjeto. :on KthisPQtitulo estamos haciendo re#erencia al atributo MtituloM 3ue tiene
el objeto KmiSobjeto.
4i 3ueremos probar la clase soporte. para con#irmar 3ue se ejecuta correctamente y 3ue
o#rece resultados coherentes. podemos utilizar un c(digo como el siguiente.
Ksoporte1 L new soporte(M&os 6ntocablesM.$$.;"N
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
1T
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
echo MIbQM . Ksoporte1PQtitulo . MI/bQMN
echo MIbrQ,recio: M . Ksoporte1PQdameSprecioSsinSi+a(" . M eurosMN
echo MIbrQ,recio 6)7 incluido: M . Ksoporte1PQdameSprecioSconSi+a(" . M eurosMN
En este caso hemos creado una instancia de la clase soporte. en un objeto 3ue hemos llamado
Ksoporte1. &uego imprimimos su atributo titulo (como el t!tulo ha sido de#inido como public.
podemos acceder a 8l desde #uera del c(digo de la clase.
&uego se llaman a los m8todos dameSprecioSsinSi+a(" y dameSprecioSconSi+a(" para el objeto
creado.
'os dar!a como resultado esto:
&os 6ntocables
,recio: ; euros
,recio 6)7 incluido: ;.<B euros
En siguientes cap!tulos +amos a +er c(mo de#inir clases 3ue hereden de la clase soporte.
Artculo por Miguel Angel Alvarez
$a %erencia en PHP 5& 'egunda #arte
:omo estamos +iendo. los mecanismos de herencia en ,-,/ son similares a los e2istentes en
otros lenguajes de programaci(n. 7hora +amos a relatar c(mo construir una clase 3ue hereda
de otra.
:ontinuando con nuestro ejemplo de +ideoclub. +amos a construir una clase para los soportes
de tipo cinta de +ideo. &as cintas de +!deo tienen un atributo nue+o 3ue es la duraci(n de la
cinta. 'o tienen ninguna clase nue+a. aun3ue debemos aprender a sobrescribir m8todos
creados para el soporte. dado 3ue ahora tienen 3ue hacer tareas m1s espec!#icas.
=ores!riir m1todos
7ntes de mostrar el c(digo de la clase cintaS+ideo. +amos a hablar sobre la sobrescritura o
sustituci(n de m8todos. 3ue es un mecanismo por el cual una clase 3ue hereda puede rede#inir
los m8todos 3ue est1 heredando.
,ensemos en una ca#etera. 4abemos 3ue e2isten muchos tipos de ca#eteras y todas hacen
ca#8. pero el mecanismo para hacer el ca#8 es distinto dependiendo del tipo de ca#etera.
E2isten ca#eteras e2press. ca#eteras por goteo y hasta se puede hacer ca#8 con un calcet!n.
'uestra ca#etera MpadreM (de la 3ue +a a heredar todas las ca#eteras" puede tener de#inido un
m8todo hacerSca#e(". pero no necesariamente todas las ca#eteras 3ue puedan heredar de esta
hacen el ca#8 siguiendo el mismo proceso.
Entonces podemos de#inir un m8todo para hacer ca#8 est1ndar. 3ue tendr!a la clase ca#etera.
,ero al de#inir las clases ca#eteraSe2press y ca#eteraSgoteo. deber!amos sobrescribir el m8todo
hacerSca#e(" para 3ue se ajuste al procedimiento propio de estas.
&a sobrescritura de m8todos es algo bastante com*n en mecanismos de herencia. puesto 3ue
los m8todos 3ue #ueron creados para una clase MpadreM no tienen por 3u8 ser los mismos 3ue
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
1B
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
los de#inidos en las clases 3ue heredan.
)eremos c(mo sobrescribir o sustituir m8todos en un ejemplo de herencia. siguiendo nuestro
ejemplo de +ideoclub.
=inta>is para heredar en PHP 5
-ab!amos comentado 3ue el +ideoclub dispone de distintos elementos para al3uilar. como
cintas de +!deo. D)D o juegos. -ab!amos creado una clase soporte. 3ue +amos a heredar en
cada uno de los elementos disponibles para al3uiler. )amos a empezar por la clase cintaS+ideo.
cuyo c(digo ser1 el siguiente.
class cintaS+ideo e2tends soporteO
pri+ate KduracionN
#unction SSconstruct(Ktit.Knum.Kprecio.Kduracion"O
parent::SSconstruct(Ktit.Knum.Kprecio"N
KthisPQduracion L KduracionN
R
public #unction imprimeScaracteristicas("O
echo M,el!cula en )-4:IbrQMN
parent::imprimeScaracteristicas("N
echo MIbrQDuraci(n: M . KthisPQduracionN
R
R
:on la primera l!nea class cintaS+ideo e2tends soporte estamos indicando 3ue se est1
de#iniendo la clase cintaS+ideo y 3ue +a a heredar de la clase soporte.
$ota: :omo se est1 heredando de una clase. ,-, tiene 3ue conocer el c(digo de la clase MpadreM. en este
caso la clase soporte. De modo 3ue el c(digo de la clase soporte debe estar incluido dentro del archi+o de
la clase cintaS+ideo. ,odemos colocar los dos c(digos en el mismo #ichero. o si est1n en #icheros
independientes. debemos incluir el c(digo de la clase soporte con la instrucci(n include o re3uire de ,-,.
En la clase cintaS+ideo hemos de#inido un nue+o atributo llamado Kduracion. 3ue almacena el
tiempo 3ue dura la pel!cula.
7un3ue la clase sobre la 3ue heredamos (la clase soporte" ten!a de#inido un constructor. la
cinta de +!deo debe inicializar la nue+a propiedad Kduracion. 3ue es espec!#ica de las cintas de
+ideo. ,or ello. +amos a sobrescribir o sustituir el m8todo constructor. lo 3ue se hace
simplemente +ol+iendo a escribir el m8todo. &a gracia a3u! consiste en 3ue el sistema puede
basar la nue+a declaraci(n del constructor en la declaraci(n 3ue e2ist!a para la clase de la 3ue
hereda.
Es decir. ya se hab!a de#inido un constructor para la clase soporte. 3ue inicializaba los atributos
de esta clase. 7hora. para la clase cintaS+ideo. hay 3ue inicializar los atributos de#inidos en la
clase soporte. m1s el atributo Kduracion. 3ue es propio de cintaS+ideo.
El c(digo del constructor es el siguiente:
#unction SSconstruct(Ktit.Knum.Kprecio.Kduracion"O
parent::SSconstruct(Ktit.Knum.Kprecio"N
KthisPQduracion L KduracionN
R
En la primera l!nea del constructor se llama al constructor creado para la clase MsoporteM. ,ara
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
1X
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
ello utilizamos parent:: y luego el nombre del m8todo de la clase padre al 3ue se 3uiere llamar.
en este caso SSconstructor(". 7l constructor de la clase padre le en+iamos las +ariables 3ue se
deben inicializar con la clase padre.
En la segunda l!nea del constructor se inicializa el atributo duracion. con lo 3ue hayamos
recibido por par1metro.
'os pasa lo mismo con el m8todo imprimeScaracteristicas(". 3ue ahora debe mostrar tambi8n
el nue+o atributo. propio de la clase cintaS+ideo. :omo se puede obser+ar en el c(digo de la
#unci(n. se hace uso tambi8n de parent::imprimeScaracteristicas(" para utilizar el m8todo
de#inido en la clase padre.
4i 3ueremos probar la clase cintaS+ideo. podriamos utilizar un c(digo como este:
Kmicinta L new cintaS+ideo(M&os =trosM. $$. <./. M11/ minutosM"N
echo MIbQM . KmicintaPQtitulo . MI/bQMN
echo MIbrQ,recio: M . KmicintaPQdameSprecioSsinSi+a(" . M eurosMN
echo MIbrQ,recio 6)7 incluido: M . KmicintaPQdameSprecioSconSi+a(" . M eurosMN
&o 3ue nos de+ol+er!a lo siguiente:
&os =tros
,recio: <./ euros
,recio 6)7 incluido: /.$$ euros
,el!cula en )-4:
&os =tros
<./ (6)7 no incluido"
Duraci(n: 11/ minutos
Artculo por Miguel Angel Alvarez
$a %erencia en PHP5& (ercera #arte
&a clase soporte tiene otras clases 3ue heredan de ella y 3ue toda+!a no hemos de#inido.
)eamos primero el c(digo de la clase Md+dM. 3ue es muy parecido al +isto para la clase
cintaS+ideo. &o *nico 3ue cambia es 3ue ahora +amos a de#inir otros atributos relacionados
con los D)D. como son los idiomas disponibles en el D)D y el #ormato de pantalla 3ue tiene la
grabaci(n.
class d+d e2tends soporteO
public KidiomasSdisponiblesN
pri+ate K#ormatoSpantallaN
#unction SSconstruct(Ktit.Knum.Kprecio.Kidiomas.Kpantalla"O
parent::SSconstruct(Ktit.Knum.Kprecio"N
KthisPQidiomasSdisponibles L KidiomasN
KthisPQ#ormatoSpantalla L KpantallaN
R
public #unction imprimeScaracteristicas("O
echo M,el!cula en D)D:IbrQMN
parent::imprimeScaracteristicas("N
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
$A
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
echo MIbrQM . KthisPQidiomasSdisponiblesN
R
R
$ota:,ara una e2plicaci(n detallada de este c(digo os re#erimos al cap!tulo anterior. donde se e2plicaba la
clase cintaS+ideo y la sobrescritura de m8todos.
,or su parte. la clase juego. tendr1 ; nue+os atributos. Estos son MconsolaM. para especi#icar la
consola para la 3ue est1 creado este juego. MminSnumSjugadoresM. para especi#icar el n*mero
de jugadores m!nimo y Mma2SnumSjugadoresM. para especi#icar el m12imo n*mero de
jugadores 3ue pueden participar en el juego.
Este ser1 el c(digo de la clase juego.
class juego e2tends soporteO
public KconsolaN //nombre de la consola del juego ej: playstation
pri+ate KminSnumSjugadoresN
pri+ate Kma2SnumSjugadoresN
#unction SSconstruct(Ktit.Knum.Kprecio.Kconsola.KminSj.Kma2Sj"O
parent::SSconstruct(Ktit.Knum.Kprecio"N
KthisPQconsola L KconsolaN
KthisPQminSnumSjugadores L KminSjN
KthisPQma2SnumSjugadores L Kma2SjN
R
public #unction imprimeSjugadoresSposibles("O
i# (KthisPQminSnumSjugadores LL KthisPQma2SnumSjugadores"O
i# (KthisPQminSnumSjugadoresLL1"
echo MIbrQ,ara un jugadorMN
else
echo MIbrQ,ara M . KthisPQminSnumSjugadores . M jugadoresMN
RelseO
echo MIbrQDe M . KthisPQminSnumSjugadores . M a M . KthisPQma2SnumSjugadores . M Uugadores.MN
R
R
public #unction imprimeScaracteristicas("O
echo MUuego para: M . KthisPQconsola . MIbrQMN
parent::imprimeScaracteristicas("N
echo MIbrQM . KthisPQimprimeSjugadoresSposibles("N
R
R
'os #ijamos en el constructor. 3ue llama al constructor de la clase padre para inicializar
algunos atributos propios de los soportes en general.
&uego nos #ijamos en el m8todo imprimeSjugadoresSposibles(". 3ue muestra los jugadores
permitidos. -a sido declarada como public. para 3ue se pueda acceder a ella desde cual3uier
lugar. 'os da un mensaje como M,ara un jugadorM o MDe 1 a $ UugadoresM. dependiendo de los
+alores minSnumSjugadores y ma2SnumSjugadores.
,or su parte. se sobrescribe la #unci(n imprimeScaracteristicas(". para mostrar todos los datos
de cada juego. ,rimero se muestra la consola para la 3ue se ha creado el juego. &os datos
generales (propios de la clase MsoporteM" se muestran llamando al mismo m8todo de la clase
MparentM y el n*mero de jugadores disponibles se muestra con una llamada al m8todo
imprimeSjugadoresSposibles(".
,odr!amos utilizar un c(digo como el 3ue sigue. si es 3ue 3ueremos comprobar 3ue la clase
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
$1
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
#unciona correctamente y 3ue nos o#rece la salida 3ue est1bamos pensando.
Kmijuego L new juego(MGinal GantasyM. $1. $./. M,laystationM.1.1"N
KmijuegoPQimprimeScaracteristicas("N
//esta l!nea dar!a un error por3ue no se permite acceder a un atributo pri+ate del objeto
//echo MIbrQUugadores: M . KmijuegoPQminSnumSjugadoresN
//habria 3ue crear un m8todo para 3ue acceda a los atributos pri+ate
KmijuegoPQimprimeSjugadoresSposibles("N
echo MIpQMN
Kmijuego$ L new juego(M[, 5otoracerM. $T. ;. M,laystation 66M.1.$"N
echo MIbQM . Kmijuego$PQtitulo . MI/bQMN
Kmijuego$PQimprimeSjugadoresSposibles("N
Este c(digo 3ue utiliza la clase MjuegoM dar1 como salida:
Uuego para: ,laystation
Ginal Gantasy
$./ (6)7 no incluido"
,ara un jugador
,ara un jugador
[, 5otoracer
De 1 a $ Uugadores.
Artculo por Miguel Angel Alvarez
$os atributos de los objetos #ueden ser otros objetos
&as caracter!sticas de los objetos. 3ue se almacenan por medio de los llamados atributos o
propiedades. pueden ser de di+ersa naturaleza. &a clase hombre puede tener distintos tipos de
atributos. como la edad (num8rico". el nombre propio (tipo cadena de caracteres". color de piel
(3ue puede ser un tipo cadena de caracteres o tipo enumerado. 3ue es una especie de +ariable
3ue s(lo puede tomar unos pocos +alores posibles". Tambi8n puede tener una estatura o un
peso (3ue podr!an ser de tipo #loat o n*mero en coma #lotante".
En general. podemos utilizar cual3uier tipo para los atributos de los objetos. incluso podemos
utilizar otros objetos. ,or ejemplo. podr!amos de#inir como atributo de la clase hombre sus
manos. Dada la complejidad de las manos. estas podr!an de#inirse como otro objeto. ,or
ejemplo. las manos tendr!an como caracter!sticas la longitud de los dedos. un coe#iciente de
elasticidad. :omo #uncionalidades o m8todos. podr!amos de#inir agarrar algo. soltarlo. pegar
una bo#etada. o cortarse las u>as. 7s! pues. uno de los atributos de la clase hombre podr!a ser
un nue+o objeto. con su propias caracter!sticas y #uncionalidades. &a complejidad de las manos
no le importa al desarrollador de la clase hombre. por el principio de encapsulaci(n. dado 3ue
este conoce sus propiedades (o a3uellas declaradas como public" y los m8todos (tambi8n los
3ue se hayan decidido declarar como p*blicos" y no necesita preocuparse sobre c(mo se han
codi#icado.
4lase !liente del video!lu
,ara continuar el ejemplo del +ideoclub. hemos creado la clase cliente 3ue +amos a e2plicar a
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
$$
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
continuaci(n. En los clientes hemos de#inido como atributo. entre otros. las pel!culas o juegos
al3uilados.
$ota::omo +emos. los objetos pueden tener algunos atributos tambi8n de tipo objeto. En ese caso
pueden haber distintos tipos de relaciones entre objetos. ,or ejemplo. por pertenencia. como en el caso
de la clase hombre y sus manos. pues a un hombre le pertenecen sus manos. Tambi8n se pueden
relacionar los objetos por asociaci(n. como es el caso de los clientes y las pel!culas 3ue al3uilan. pues en
ese caso un cliente no tiene una pel!cula propiamente dicha. sino 3ue se asocia con una pel!cula
moment1neamente.
&a clase cliente 3ue hemos creado tiene cierta complejidad. esperamos 3ue no sea demasiada
para 3ue se pueda entender #1cilmente. &a e2plicaremos poco a poco para #acilitar las cosas.
Atriutos de la !lase !liente
-emos de#inido una serie de atributos para trabajar con los clientes. Tenemos los siguientes:
public KnombreN
pri+ate KnumeroN
pri+ate KsoportesSal3uiladosN
pri+ate KnumSsoportesSal3uiladosN
pri+ate Kma2Sal3uilerSconcurrenteN
:omo se puede +er. se han de#inido casi todos los atributos como pri+ate. con lo 3ue s(lo se
podr1n acceder dentro del c(digo de la clase.
El atributo nombre. 3ue guarda el nombre propio del cliente. es el *nico 3ue hemos dejado
como p*blico y 3ue por tanto se podr1 re#erenciar desde cual3uier parte del programa. incluso
desde otras clases. El atributo numero se utiliza para guardar el identi#icador num8rico del
cliente. ,or su parte. soportes al3uilados nos ser+ir1 para asociar al cliente las pel!culas o
juegos cuando este las al3uile. El atributo numSsoportesSal3uilados almacenar1 el n*mero de
pel!culas o juegos 3ue un cliente tiene al3uilados en todo momento. ,or *ltimo.
ma2Sal3uilerSconcurrente indica el n*mero m12imo de soportes 3ue puede tener al3uilados un
cliente en un mismo instante. no permiti8ndose al3uilar a ese cliente. a la +ez. m1s 3ue ese
n*mero de pel!culas o juegos.
El *nico atributo sobre el 3ue merece la pena llamar la atenci(n es soportesSal3uilados. 3ue
contendr1 un array de soportes. En cada casilla del array se introducir1n las pel!culas o juegos
3ue un cliente +aya al3uilando. para asociar esos soportes al cliente 3ue las al3uil(. El array
contendr1 tantas casillas como el ma2Sal3uilerSconcurrente. puesto 3ue no tiene sentido
asignar mayor espacio al array del 3ue se +a a utilizar. ,ara #acilitar las cosas. cuando un
cliente no tiene al3uilado nada. tendr1 el +alor null en las casillas del array.
$ota:Fecordemos 3ue los soportes #ueron de#inidos en cap!tulos anteriores de este manual de ,-, / .
mediante un mecanismo de herencia. 4oporte era una clase de la 3ue heredaban las pel!culas en D)D. las
cintas de +!deo y los juegos.
4onstru!tor de la !lase !liente
#unction SSconstruct(Knombre.Knumero.Kma2Sal3uilerSconcurrenteL;"O
KthisPQnombreLKnombreN
KthisPQnumeroLKnumeroN
KthisPQsoportesSal3uiladosLarray("N
KthisPQnumSsoportesSal3uiladosLAN
KthisPQma2Sal3uilerSconcurrente L Kma2Sal3uilerSconcurrenteN
//inicializo las casillas del array de al3uiler a MnullM
//un +alor MnullM 3uiere decir 3ue el no hay al3uiler en esa casilla
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
$;
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
#or (KiLANKiIKma2Sal3uilerSconcurrenteNKi@@"O
KthisPQsoportesSal3uilados\Ki]LnullN
R
R
El constructor de la clase cliente recibe los datos para inicializar el objeto. Estos son Knombre.
Knumero y Kma2Sal3uilerSconcurrente. 4i nos #ijamos. se ha de#inido por de#ecto a ; el
n*mero m12imo de al3uileres 3ue puede tener un cliente. de modo 3ue. en el caso de 3ue la
llamada al constructor no en+!e el par1metro Kma2Sal3uilerSconcurrente se asumir1 el +alor ;.
El atributo soportesSal3uilados. como hab!amos adelantado. ser1 un array 3ue tendr1 tantas
casillas como el m12imo de al3uileres concurrentes. En las *ltimas l!neas se inicializan a null el
contenido de las casillas del array.
Artculo por Miguel Angel Alvarez
$os atributos de los objetos #ueden ser otros objetos& )*
#arte
M1todo dame:numero;<
#unction dameSnumero("O
return KthisPQnumeroN
R
Este m8todo simplemente de+uel+e el numero de identi#icaci(n del cliente. :omo se ha
de#inido el atributo numero como pri+ate. desde #uera del c(digo de la clase. s(lo se podr1
acceder a este a tra+8s del m8todo dameSnumero(".
M1todo tiene:al7uilado;?soporte<
#unction tieneSal3uilado(Ksoporte"O
#or (KiLANKiIKthisPQma2Sal3uilerSconcurrenteNKi@@"O
i# (?isSnull(KthisPQsoportesSal3uilados\Ki]""O
i# (KthisPQsoportesSal3uilados\Ki]PQdameSnumeroSidenti#icacion(" LL KsoportePQdameSnumeroSidenti#icacion(""O
return trueN
R
R
R
//si estoy a3ui es 3ue no tiene al3uilado ese soporte
return #alseN
R
Este recibe un soporte y de+uel+e true si est1 entre los al3uileres del cliente. De+uel+e #alse en
caso contrario.
7 este m8todo lo llamamos desde dentro de la clase cliente. en la codi#icaci(n de otro m8todo.
,odr!amos haber de#inido entonces el m8todo como pri+ate. si pens1semos 3ue s(lo lo +amos
a utilizar desde dentro de esta clase. En este caso lo hemos de#inido como public (el
modi#icador por de#ecto" por3ue pensamos 3ue puede ser *til para otras partes del programa.
Este m8todo recibe un soporte (cual3uier tipo de soporte. tanto cintas de +!deo. como D)Ds o
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
$<
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
juegos". Fealiza un recorrido por el array de soportes al3uilados preguntando a cada soporte
3ue tenga al3uilado el cliente si su n*mero de identi#icaci(n es igual 3ue el del soporte recibido
por par1metro. :omo el n*mero de identi#icaci(n del soporte est1 de#inido como pri+ate en la
clase soporte. para acceder a su +alor tenemos 3ue utilizar el m8todo de soporte
dameSnumeroSidenti#icaci(n(".
=tra cosa importante. :omo no es seguro 3ue en el array de soportes al3uilados haya alg*n
soporte (recordamos 3ue si el cliente no tiene nada al3uilado las casillas est1n a null". antes de
llamar a ning*n m8todo del soporte debemos comprobar 3ue realmente e2iste. Esto se hace
con la #unci(n isSnull(" a la 3ue le en+iamos la casilla del array donde 3ueremos comprobar si
e2iste un soporte. 4i la #unci(n isSnull(" de+uel+e true es 3ue tiene almacenado el +alor null.
con lo 3ue sabremos 3ue no hay soporte. De manera contraria. si la casilla almacena un
soporte. la #unci(n isSnull(" de+ol+er1 #alse.
M1todo al7uila;?soporte<
#unction al3uila(Ksoporte"O
i# (KthisPQtieneSal3uilado(Ksoporte""O
echo MIpQEl cliente ya tiene al3uilado el soporte IbQM . KsoportePQtitulo . MI/bQMN
Relsei# (KthisPQnumSsoportesSal3uiladosLLKthisPQma2Sal3uilerSconcurrente"O
echo MIpQEste cliente tiene M . KthisPQnumSsoportesSal3uilados . M elementos al3uilados. MN
echo M'o puede al3uilar m1s en este +ideoclub hasta 3ue no de+uel+a algoMN
RelseO
//miro en el array a +er donde tengo sitio para meter el soporte
Kcont L AN
while (?isSnull(KthisPQsoportesSal3uilados\Kcont]""O
Kcont@@N
R
KthisPQsoportesSal3uilados\Kcont]LKsoporteN
KthisPQnumSsoportesSal3uilados@@N
echo MIpQIbQ7l3uilado soporte a: I/bQM . KthisPQnombre . MIbrQMN
KsoportePQimprimeScaracteristicas("N
R
R
Este m8todo sir+e para al3uilar una pel!cula o juego por parte del cliente. Fecibe el soporte a
al3uilar y. en caso 3ue el al3uiler se pueda producir. debe introducir el objeto soporte recibido
en el array de soportes al3uilados del cliente.
&o primero 3ue hace es comprobar 3ue el cliente no tiene al3uilado ese mismo soporte.
utilizando el m8todo tieneSal3uilado(" de la clase soporte. 4i no lo tiene al3uilado comprueba
3ue toda+!a tiene capacidad para al3uilar otro soporte. es decir. 3ue no ha llegado al m12imo
en el n*mero de soportes al3uilados.
4i se puede al3uilar el soporte. lo introduce dentro del array soportesSal3uilados en una
posici(n +ac!a (una casilla donde antes hubiera un null". incrementa en uno el n*mero de
soportes al3uilados e imprime las caracter!sticas del soporte 3ue se ha al3uilado.
M1todo devuelve;?identi.i!ador:soporte<
#unction de+uel+e(Kidenti#icadorSsoporte"O
i# (KthisPQnumSsoportesSal3uiladosLLA"O
echo MIpQEste cliente no tiene al3uilado ning*n elementoMN
return #alseN
R
//recorro el array a +er si encuentro el soporte con identi#icador recibido
#or (KiLANKiIKthisPQma2Sal3uilerSconcurrenteNKi@@"O
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
$/
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
i# (?isSnull(KthisPQsoportesSal3uilados\Ki]""O
i# (KthisPQsoportesSal3uilados\Ki]PQdameSnumeroSidenti#icacion(" LL Kidenti#icadorSsoporte"O
echo MIpQ4oporte de+uelto: M . Kidenti#icadorSsoporteN
echo M IbQM . KthisPQsoportesSal3uilados\Ki]PQtitulo . MI/bQMN
KthisPQsoportesSal3uilados\Ki]LnullN
KthisPQnumSsoportesSal3uiladosPPN
return trueN
R
R
R
//si estoy a3ui es 3ue el cliente no tiene ese soporte al3uilado
echo MIpQ'o se ha podido encontrar el soporte en los al3uileres de este clienteMN
return #alseN
R
El m8todo de+uel+e recibe el identi#icador del soporte 3ue debe de+ol+er el cliente. De+uel+e
true si se consigui( de+ol+er el soporte. #alse en caso contrario. &o primero 3ue hace es
comprobar si el cliente tiene al3uilado alg*n soporte. comprobando 3ue la +ariable
numSsoportesSal3uilados no sea cero.
&uego hace un recorrido por el array de soportes al3uilados para +er si encuentra el soporte
3ue se desea de+ol+er. ,ara cada soporte al3uilado (cada casilla del array 3ue no contenga el
+alor null" comprueba si el identi#icador es el mismo 3ue el recibido por par1metro. :uando
encuentra el soporte. muestra un mensaje por pantalla y lo de+uel+e simplemente poniendo a
null la casilla correspondiente del array soportesSal3uilados y decrementando en uno el
atributo numSsoportesSal3uilados.
4i se encuentra el soporte. se sale de la #unci(n de+ol+iendo true. ,or lo 3ue. si no se ha salido
de la #unci(n despu8s de hacer el recorrido por el array. sabemos 3ue no se ha encontrado ese
soporte. Entonces mostramos un mensaje en pantalla y de+ol+emos #alse.
M1todo lista:al7uileres;<
#unction listaSal3uileres("O
i# (KthisPQnumSsoportesSal3uiladosLLA"O
echo MIpQEste cliente no tiene al3uilado ning*n elementoMN
RelseO
echo MIpQIbQEl cliente tiene M . KthisPQnumSsoportesSal3uilados . M soportes al3uiladosI/bQMN
//recorro el array para listar los elementos 3ue tiene al3uilados
#or (KiLANKiIKthisPQma2Sal3uilerSconcurrenteNKi@@"O
i# (?isSnull(KthisPQsoportesSal3uilados\Ki]""O
echo MIpQMN
KthisPQsoportesSal3uilados\Ki]PQimprimeScaracteristicas("N
R
R
R
R
Este m8todo hace un recorrido por el array de soportes al3uilados y muestra las caracter!sticas
de cada soporte. :omprueba 3ue el cliente tiene algo al3uilado antes de hacer el recorrido.
Fecordar siempre. antes de llamar a un m8todo del soporte almacenado en cada casilla del
array. comprobar 3ue el contenido de esa casilla no es null.
M1todo imprime:!ara!teristi!as;<
#unction imprimeScaracteristicas("O
echo MIpQIbQ:liente M . KthisPQnumero . M:I/bQ M . KthisPQnombreN
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
$
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
echo MIbrQ7l3uileres actuales: M . KthisPQnumSsoportesSal3uilados
R
4implemente muestra algunos de los datos del cliente. Es un m8todo para obtener alg*n dato
por pantalla de un cliente.
4omproar el .un!ionamiento de la !lase !liente
Es importante se>alar 3ue. para 3ue la clase cliente #uncione. debe disponer de los c(digos de
las distintas clases de las 3ue hace uso (la clase soporte. cintaS+ideo. juego y d+d". Estos
c(digos se pueden haber escrito en el mismo archi+o o bien incluirse con unas instrucciones
como estas:
include Msoporte.phpMN
include Md+d.phpMN
include Mjuego.phpMN
include McintaS+ideo.phpMN
&a clase cliente se puede poner en #uncionamiento. para probar su correcta implementaci(n.
con un c(digo como este:
//instanciamos un par de objetos cliente
Kcliente1 L new cliente(M,epeM. 1"N
Kcliente$ L new cliente(MFobertoM. /<"N
//mostramos el numero de cada cliente creado
echo MEl identi#icador del cliente 1 es: M . Kcliente1PQdameSnumero("N
echo MIbrQEl identi#icador del cliente $ es: M . Kcliente$PQdameSnumero("N
//instancio algunos soportes
Ksoporte1 L new cintaS+ideo(M&os =trosM. 1. ;./. M11/ minutosM"N
Ksoporte$ L new juego(MGinal GantasyM. $. $./. M,laystationM.1.1"N
Ksoporte; L new d+d(M&os 6ntocablesM. ;. ;. M6ngl8s y espa>olM.M1:XM"N
Ksoporte< L new d+d(MEl 6mperio :ontraatacaM. <. ;. M6ngl8s y espa>olM.M1:XM"N
//al3uilo algunos soportes
Kcliente1PQal3uila(Ksoporte1"N
Kcliente1PQal3uila(Ksoporte$"N
Kcliente1PQal3uila(Ksoporte;"N
//+oy a intentar al3uilar de nue+o un soporte 3ue ya tiene al3uilado
Kcliente1PQal3uila(Ksoporte1"N
//el cliente tiene ; soportes en al3uiler como m12imo
//este soporte no lo +a a poder al3uilar
Kcliente1PQal3uila(Ksoporte<"N
//este soporte no lo tiene al3uilado
Kcliente1PQde+uel+e(<"N
//de+uel+o un soporte 3ue s! 3ue tiene al3uilado
Kcliente1PQde+uel+e($"N
//al3uilo otro soporte
Kcliente1PQal3uila(Ksoporte<"N
//listo los elementos al3uilados
Kcliente1PQlistaSal3uileres("N
La e&e!u!in de este !digo0 si todo .un!iona !orre!tamente0 deer*a devolvernos
!omo resultado esta salida:
El identi#icador del cliente 1 es: 1
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
$T
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
El identi#icador del cliente $ es: /<
Al7uilado soporte a: ,epe
,el!cula en )-4:
&os =tros
;./ (6)7 no incluido"
Duraci(n: 11/ minutos
Al7uilado soporte a: ,epe
Uuego para: ,laystation
Ginal Gantasy
$./ (6)7 no incluido"
,ara un jugador
Al7uilado soporte a: ,epe
,el!cula en D)D:
&os 6ntocables
; (6)7 no incluido"
6ngl8s y espa>ol
El cliente ya tiene al3uilado el soporte Los +tros
Este cliente tiene ; elementos al3uilados. 'o puede al3uilar m1s en este +ideoclub hasta 3ue
no de+uel+a algo
'o se ha podido encontrar el soporte en los al3uileres de este cliente
4oporte de+uelto: / 6inal 6antas(
Al7uilado soporte a: ,epe
,el!cula en D)D:
El 6mperio :ontraataca
; (6)7 no incluido"
6ngl8s y espa>ol
%l !liente tiene ' soportes al7uilados
,el!cula en )-4:
&os =tros
;./ (6)7 no incluido"
Duraci(n: 11/ minutos
,el!cula en D)D:
El 6mperio :ontraataca
; (6)7 no incluido"
6ngl8s y espa>ol
,el!cula en D)D:
&os 6ntocables
; (6)7 no incluido"
6ngl8s y espa>ol
Artculo por Miguel Angel Alvarez
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
$B
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
+e#asando la creacin de clases
,ara continuar la creaci(n del +ideoclub y las e2plicaciones sobre la programaci(n orientada a
objetos (,==". +amos a programar la clase principal. 3ue engloba a todas las clases 3ue
hemos ido creando hasta el momento. &a clase principal se llama +ideoclub y modela el
comportamiento general del +ideoclub.
&legado este punto ser!a bueno 3ue remarcar dos cosas sobre el desarrollo de programas
orientados a objetos.
1. &a clase principal de un sistema 3ue deseamos modelar en ,== se suele llamar como el
propio sistema 3ue estamos modelando. ,or ejemplo. si estu+i8ramos creando una
biblioteca. la clase principal se llamar!a biblioteca. En este caso. 3ue estamos haciendo
un +ideoclub. la clase principal se llamar1 +ideoclub.
$. El proceso de creaci(n de un programa ,== se realiza al re+8s de como hemos hecho
en este manual. empezando el desarrollo de la clase general y #inalizando por las clases
m1s espec!#icas. De este modo. al crear la clase general. podemos ir +iendo 3u8 otros
objetos necesitaremos. cu1les ser1n sus m8todos y propiedades. En este manual lo
hemos hecho al re+8s por3ue nos +en!a bien para ir describiendo las caracter!sticas de
la ,==.
&a clase +ideoclub tendr1 como propiedades a los soportes en al3uiler (pel!culas o juegos" y
por otra parte. los socios o clientes 3ue al3uilan los productos. &os m8todos de la clase
+ideoclub ser1n la inclusi(n y listado de soportes en al3uiler y de socios. el al3uiler de soportes
por parte de clientes.
$ota:'i 3ue decir tiene 3ue el +ideoclub 3ue estamos creando est1 simpli#icado al m12imo. Est1 claro 3ue
si estu+i8semos creando un +ideoclub con el prop(sito de utilizarlo en producci(n. habr!a 3ue pensar y
desarrollar muchas otras #uncionalidades.
)amos ya con el c(digo y sus e2plicaciones.
Atriutos de la !lase video!lu
public KnombreN
pri+ate KproductosN
pri+ate KnumSproductosN
pri+ate KsociosN
pri+ate KnumSsociosN
El atributo Kproductos ser1 un array con los distintos soportes en al3uiler. KnumSproductos lo
utilizaremos para lle+ar la cuenta del n*mero de productos 3ue tenemos disponibles. De modo
similar. Ksocios ser1 un array de clientes y KnumSsocios lle+ar1 la cuenta de los socios 3ue
tenemos dados de alta. 7parte. nuestro +ideoclub tendr1 un nombre. 3ue almacenaremos en
la +ariable Knombre.
4onstru!tor
#unction SSconstruct(Knombre"O
KthisPQnombreLKnombreN
KthisPQproductosLarray("N
KthisPQnumSproductosLAN
KthisPQsociosLarray("N
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
$X
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
KthisPQnumSsociosLAN
R
Este m8todo inicializar1 los atributos del objeto 3ue se est1 construyendo. Fecibe *nicamente
el nombre del +ideoclub. :omo tareas destacables est1n las inicializaciones de los arrays de
productos y socios y la puesta a cero de los contadores 3ue +amos a utilizar.
M1todo in!luir:produ!to;<
pri+ate #unction incluirSproducto(Knue+oSproducto"O
KthisPQproductos\KthisPQnumSproductos]LKnue+oSproductoN
echo MIpQ6ncluido soporte M . KthisPQnumSproductosN
KthisPQnumSproductos@@N
R
Este m8todo ha sido declarado como pri+ate. por3ue s(lo 3ueremos 3ue se llame desde dentro
de la clase. Fecibe el nue+o producto 3ue se 3uiere dar de alta y lo guardar en el array de
productos. en la posici(n marcada por el atributo numSproductos. &uego muestra un mensaje
por pantalla y por *ltimo incrementa a uno el atributo numSproductos.
M1todos in!luir:dvd;<0in!luir:!inta:video;< e in!luir:&uego;<
&os tres siguientes m8todos 3ue +amos a +er. instancian los tres productos con los 3ue trabaja
el +ideoclub y luego los introducen en array de productos llamando a incluirSproducto(".
#unction incluirSd+d(Ktit.Kprecio.Kidiomas.Kpantalla"O
Kd+dSnue+o L new d+d(Ktit. KthisPQnumSproductos. Kprecio. Kidiomas. Kpantalla"N
KthisPQincluirSproducto(Kd+dSnue+o"N
R
#unction incluirScintaS+ideo(Ktit.Kprecio.Kduracion"O
KcintaS+ideoSnue+a L new cintaS+ideo(Ktit. KthisPQnumSproductos. Kprecio. Kduracion"N
KthisPQincluirSproducto(KcintaS+ideoSnue+a"N
R
#unction incluirSjuego(Ktit.Kprecio.Kconsola.KminSj.Kma2Sj"O
KjuegoSnue+o L new juego(Ktit. KthisPQnumSproductos. Kprecio. Kconsola. KminSj. Kma2Sj"N
KthisPQincluirSproducto(KjuegoSnue+o"N
R
,odemos #ijarnos 3ue el n*mero de identi#icaci(n del soporte. 3ue recibe el constructor de las
cintas de +!deo. D)Ds o juegos. lo generamos por medio del atributo de la clase de +ideclub
numSproductos. 3ue guarda el n*mero de productos dados de alta.
M1todo in!luir:so!io;<
Este m8todo hace las tareas de instanciaci(n del socio nue+o y su inclusi(n en el array de
socios.
#unction incluirSsocio(Knombre.Kma2Sal3uilerSconcurrenteL;"O
KsocioSnue+o L new cliente(Knombre.KthisPQnumSsocios.Kma2Sal3uilerSconcurrente"N
KthisPQsocios\KthisPQnumSsocios]LKsocioSnue+oN
echo MIpQ6ncluido socio M . KthisPQnumSsociosN
KthisPQnumSsocios@@N
R
Feciben los datos del nue+o socio: nombre y el m12imo n*mero de pel!culas 3ue puede
al3uilar (siendo ; el +alor por de#ecto". 0na +ez instanciado el nue+o socio. lo introduce en el
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
;A
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
array. en la posici(n marcada por el atributo numSsocios. &uego muestran un mensaje por
pantalla y por *ltimo incrementan a uno los atributos numSproductos o numSsocios.
El n*mero de socio. 3ue recibe entre otros par1metros. el constructor de la clase socio lo
generamos por medio del contador de socios numSsocios. de la clase +ideclub.
M1todos listar:produ!tos;< ( listar:so!ios;<
Dos m8todos muy similares. 3ue +eremos de una sola +ez.
#unction listarSproductos("O
echo MIpQ&istado de los M . KthisPQnumSproductos . M productos disponibles:MN
#or (KiLANKiIKthisPQnumSproductosNKi@@"O
echo MIpQMN
KthisPQproductos\Ki]PQimprimeScaracteristicas("N
R
R
#unction listarSsocios("O
echo MIpQ&istado de KthisPQnumSsocios socios del +ideoclub:MN
#or (KiLANKiIKthisPQnumSsociosNKi@@"O
echo MIpQMN
KthisPQsocios\Ki]PQimprimeScaracteristicas("N
R
R
Estos m8todos imprimen un listado completo de los socios y productos dados de alta.
4implemente hacen un recorrido del array de productos o de socios y +an imprimiendo sus
caracter!sticas.
M1todo al7uila:a:so!io;<
Fealiza las acciones necesarias para al3uiler un producto a un socio.
#unction al3uilaSaSsocio(KnumeroSsocio.KnumeroSproducto"O
i# (isSnull(KthisPQsocios\KnumeroSsocio]""O
echo MIpQ'o e2iste ese socioMN
Relsei#(isSnull(KthisPQproductos\KnumeroSproducto]""O
echo MIpQ'o e2iste ese soporteMN
RelseO
KthisPQsocios\KnumeroSsocio]PQal3uila(KthisPQproductos\KnumeroSproducto]"N
R
R
Este m8todo recibe el identi#icador del socio y del producto en al3uiler. 7ntes de proceder.
realiza un par de comprobaciones. &a primera para +er si e2iste un socio con el n*mero de
socio indicado por par1metro y la segunda para +er si tambi8n e2iste un producto con el
n*mero de producto dado.
4i todo #ue bien. llama al m8todo al3uila(" del socio. en+i1ndole el producto 3ue desea al3uilar.
$ota:El m8todo al3uila(" del socio tiene cierta complejidad. pero ya la +imos cuando e2plicamos la clase
socio. En este momento. por el principio de encapsulaci(n de la ,==. debemos abstraernos de su
di#icultad y no prestarle atenci(n por3ue sabemos 3ue #unciona y no nos debe preocupar c(mo lo hace.
,ara probar la clase +ideoclub podr!amos utilizar un c(digo como este:
K+c L new +ideoclub(M&a Eliana )ideoM"N
//+oy a incluir unos cuantos soportes de prueba
K+cPQincluirSjuego(MGinal GantasyM. $./. M,laystationM.1.1"N
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
;1
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
K+cPQincluirSjuego(M[, 5otoracerM. ;. M,laystation 66M.1.$"N
K+cPQincluirSd+d(M&os =trosM. <./. M6ngl8s y espa>olM.M1:XM"N
K+cPQincluirSd+d(M:iudad de Di(sM. ;. M,ortugu8s. ingl8s y espa>olM.M1:XM"N
K+cPQincluirSd+d(M&os ,icapiedraM. ;. MEspa>olM.M1:XM"N
K+cPQincluirScintaS+ideo(M&os =trosM. <./. M11/ minutosM"N
K+cPQincluirScintaS+ideo(MEl nombre de la FosaM. 1./. M1<A minutosM"N
//listo los productos
K+cPQlistarSproductos("N
//+oy a crear algunos socios
K+cPQincluirSsocio(MUos8 GuentesM"N
K+cPQincluirSsocio(M,edro [arc!aM.$"N
K+cPQal3uilaSaSsocio(1.$"N
K+cPQal3uilaSaSsocio(1.;"N
//al3uilo otra +ez el soporte $ al socio 1.
// no debe dejarme por3ue ya lo tiene al3uilado
K+cPQal3uilaSaSsocio(1.$"N
//al3uilo el soporte al socio 1.
//no se puede por3ue el socio 1 tiene $ al3uileres como m12imo
K+cPQal3uilaSaSsocio(1."N
//listo los socios
K+cPQlistarSsocios("N
4e hace una carga de datos y una llamada a todos los m8todos 3ue hemos +isto para el
+ideoclub. Este c(digo dar1 como resultado una salida como la siguiente:
6ncluido soporte A
6ncluido soporte 1
6ncluido soporte $
6ncluido soporte ;
6ncluido soporte <
6ncluido soporte /
6ncluido soporte
&istado de los T productos disponibles:
Uuego para: ,laystation
Ginal Gantasy
$./ (6)7 no incluido"
,ara un jugador
Uuego para: ,laystation 66
[, 5otoracer
; (6)7 no incluido"
De 1 a $ Uugadores.
,el!cula en D)D:
&os =tros
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
;$
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
<./ (6)7 no incluido"
6ngl8s y espa>ol
,el!cula en D)D:
:iudad de Di(s
; (6)7 no incluido"
,ortugu8s. ingl8s y espa>ol
,el!cula en D)D:
&os ,icapiedra
; (6)7 no incluido"
Espa>ol
,el!cula en )-4:
&os =tros
<./ (6)7 no incluido"
Duraci(n: 11/ minutos
,el!cula en )-4:
El nombre de la Fosa
1./ (6)7 no incluido"
Duraci(n: 1<A minutos
6ncluido socio A
6ncluido socio 1
Al7uilado soporte a: ,edro [arc!a
,el!cula en D)D:
&os =tros
<./ (6)7 no incluido"
6ngl8s y espa>ol
Al7uilado soporte a: ,edro [arc!a
,el!cula en D)D:
:iudad de Di(s
; (6)7 no incluido"
,ortugu8s. ingl8s y espa>ol
El cliente ya tiene al3uilado el soporte Los +tros
Este cliente tiene $ elementos al3uilados. 'o puede al3uilar m1s en este +ideoclub hasta 3ue
no de+uel+a algo
&istado de $ socios del +ideoclub:
4liente 9: Uos8 Guentes
7l3uileres actuales: A
4liente ,: ,edro [arc!a
7l3uileres actuales: $
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
;;
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
-asta a3u! ha llegado por ahora el desarrollo de este +ideoclub. 3ue no es muy #uncional pero
esperamos 3ue haya ser+ido para empezar a conocer las caracter!sticas de la programaci(n
orientada a objetos.
En adelante. seguiremos este manual comentando otras particularidades de la ,== en ,-, /.
3ue tambi8n hay 3ue conocer.
Artculo por Miguel Angel Alvarez
M"todos y clases abstractos en PHP 5
0na clase abstracta es la 3ue tiene m8todos abstractos. &os m8todos abstractos son los 3ue
est1n declarados en una clase. pero no se ha de#inido en la clase el c(digo de esos m8todos.
Esa puede ser una buena de#inici(n de clases y m8todos abstractos. pero +eamos con calma
una e2plicaci(n un poco m1s detallada y comprensible por todos.
En ocasiones. en un sistema de herencia como el de la programaci(n orientada a objetos
(,==". tenemos entidades 3ue declarar aun3ue no se puede dar su de#inici(n toda+!a.
simplemente las deseamos de#inir por encima para empezar una jerar3u!a de clases.
,ensemos en los productos l1cteos (los deri+ados de la leche". 'o cabe duda 3ue los productos
l1cteos son una gran #amilia. 6ncluyen a los yogures. mante3uillas. 3uesos. helados e incluso a
la propia leche. 4in embargo. los productos l1cteos en si no se encuentran en la +ida real. En
el supermercado no te +enden un producto l1cteo en general. ,or ejemplo. nadie compra un
Cilo de producto l1cteo... m1s bien preguntar1n por un litro de leche. un litro de helado o un
pacC de yogures.
Todos los productos l1cteos tienen algunas caracter!sticas comunes. como el porcentaje en
leche o la #echa de caducidad. Tambi8n tienen algunas #uncionalidades comunes como
conser+arse o consumirse. 4in embargo. la manera de conser+arse es distinta dependiendo del
producto l1cteo. &a leche se conser+a #uera de la ne+era. mientras 3ue no est8 abierto el bricC.
y los yogures deben conser+arse en la ne+era en todo momento. &os 3uesos se conser+an en
la ne+era. pero metidos dentro de un recipiente por si acaso desprenden olores #uertes. ,or lo
3ue respecta a los helados. se deben conser+ar en el congelador. siempre 3ue deseemos 3ue
no se con+iertan en l!3uido. 7l consumir un producto l1cteo la cosa tambi8n cambia. puesto
3ue el 3ueso se suele acompa>ar con pan o tostadas. la leche se bebe y el helado se toma con
cuchara.
En de#initi+a. a donde 3ueremos demostrar es 3ue podemos tener un conjunto de objetos 3ue
tienen unas caracter!sticas comunes y #uncionalidades. tambi8n comunes. pero 3ue di#ieren en
la manera de lle+arlas a cabo. ,ara esto est1 la abstracci(n.
&a clase de los productos l1cteos. tendr1 una serie de propiedades y unos m8todos abstractos.
&os m8todos abstractos. como hab!amos adelantado. son a3uellos 3ue no incluyen una
codi#icaci(n. sino 3ue simplemente se declaran. dejando para las clases 3ue hereden la tarea
de codi#icarlos.
En este caso. la clase producto l1cteo tendr1 los m8todos abstractos conser+arse(" y
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
;<
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
consumirse(". pero no se especi#icar1 el c(digo #uente de estos m8todos (por eso son
abstractos". &as clases 3ue hereden de producto l1cteo ser1n las encargadas de de#inir un
c(digo para los m8todos de#inidos como abstractos en la clase padre. 7s!. cada clase 3ue
herede de producto l1cteo. deber1 especi#icar el mecanismo concreto y espec!#ico por el cual se
+an a conser+ar o consumir.
&as clases 3ue incorporan m8todos abstractos se deben declarar como abstractas. Es una
condici(n #orzosa. &as clases abstractas no se pueden instanciar. Es decir. no podemos crear
objetos a partir de ellas. Es algo l(gico. ,ensemos en los productos l1cteos. estos no e2isten
m1s 3ue como una idea general. 4(lo podremos encontrar productos l1cteos de un tipo en
concreto. como leche o yogur. pero no la idea de producto l1cteo en general.
0na clase 3ue herede de un producto l1cteo debe de#inir los m8todos abstractos declarados en
la clase abstracta. De lo contrario. la clase 3ue hereda estar!a obligada a declararse como
abstracta.
En nuestro ejemplo de +ideoclub. tratado a lo largo de los distintos cap!tulos del manual de
,-, /. tenemos una clase 3ue tambi8n ser!a un buen ejemplo de clase abstracta. 4e trata de
la clase soporte. De esta clase heredaban los distintos productos del +ideoclub. como pel!culas
en D)D. cintas de +!deo o juegos. 'o hubiera sido mala idea declarar como abstracta la clase
soporte. dado 3ue no se +an a utilizar. ni e2isten. soportes en general. sino 3ue lo 3ue e2isten
son los distintos soportes concretos.
La sinta>is de la astra!!in
,ara declarar clases y m8todos abstractos se utiliza la siguiente sinta2is.
abstract class nombreSclaseO
//propiedades
public 2N
pri+ate yN
//m8todos
public #unction SSconstruct("O
^
R
public abstract #unction nombreSmetodo("N
R
'os #ijamos 3ue se utiliza la palabra cla+e MabstractM para de#inir las clases o m8todos
abstractos. 7dem1s. los m8todos abstractos no lle+an ning*n c(digo asociado. ni si3uiera las
lla+es para abrir y cerrar el m8todo.
Artculo por Miguel Angel Alvarez
Interfaces en PHP 5
&as inter#aces son un sistema bastante com*n. utilizado en programaci(n orientada a objetos.
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
;/
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
4on algo as! como declaraciones de #uncionalidades 3ue tienen 3ue cubrir las clases 3ue
implementan las inter#aces.
En una inter#az se de#inen habitualmente un juego de #unciones 3ue deben codi#icar las clases
3ue implementan dicha inter#az. De modo 3ue. cuando una clase implementa una inter#az.
podremos estar seguros 3ue en su c(digo est1n de#inidas las #unciones 3ue inclu!a esa
inter#az.
7 la hora de programar un sistema. podemos contar con objetos 3ue son muy di#erentes y 3ue
por tanto no pertenecen a la misma jerar3u!a de herencia. pero 3ue deben realizar algunas
acciones comunes. ,or ejemplo. todos los objetos con los 3ue comercia unos grandes
almacenes deben contar con la #uncionalidad de +enderse. 0na mesa tiene poco en com*n con
un cale#actor o unas zapatillas. pero todos los productos disponibles deben implementar una
#unci(n para poder +enderse.
=tro ejemplo. 0na bombilla. un coche y un ordenador son clases muy distintas 3ue no
pertenecen al mismo sistema de herencia. pero todas pueden encenderse y apagarse. En este
caso. podr!amos construir una inter#az llamada MencendibleM. 3ue incluir!a las #uncionalidades
de encender y apagar. En este caso. la inter#az contendr!a dos #unciones o m8todos. uno
encender(" y otro apagar(".
:uando se de#ine una inter#az. se declaran una serie de m8todos o #unciones sin especi#icar
ning*n c(digo #uente asociado. &uego. las clases 3ue implementen esa inter#az ser1n las
encargadas de proporcionar un c(digo a los m8todos 3ue contiene esa inter#az. Esto es
seguro: si una clase implementa una inter#az. deber!a declarar todos los m8todos de la
inter#az. 4i no tenemos c(digo #uente para alguno de esos m8todos. por lo menos debemos
declararlos como abstractos y. por tanto. la clase tambi8n tendr1 3ue declararse como
abstracta. por3ue tiene m8todos abstractos.
4digo para de.inir una inter.az
)eamos el c(digo para realizar una inter#az. En concreto +eremos el c(digo de la inter#az
encendible. 3ue tienen 3ue implementar todas las clases cuyos objetos se puedan encender y
apagar.
inter#ace encendibleO
public #unction encender("N
public #unction apagar("N
R
)emos 3ue para de#inir una inter#az se utiliza la palabra cla+e inter#ace. seguida por el nombre
de la inter#az y. entre lla+es. el listado de m8todos 3ue tendr1. &os m8todos no se deben
codi#icar. sino *nicamente declararse.
#mplementa!in de inter.a!es
7hora +eamos el c(digo para implementar una inter#az en una clase.
class bombilla implements encendibleO
public #unction encender("O
echo MIbrQW la luz se hizo...MN
R
public #unction apagar("O
echo MIbrQEstamos a oscuras...MN
R
R
,ara implementar una inter#az. en la declaraci(n de la clase. se debe utilizar la palabra
implements. seguida del nombre de la inter#az 3ue se +a a implementar. 4e podr!an
implementar +arias inter#aces en la misma clase. en cuyo caso se indicar!an todos los nombres
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
;
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
de las inter#aces separadas por comas.
En el c(digo de la clase estamos obligados a declarar y codi#icar todos los m8todos de la
inter#az.
$ota: en concreto. ,-, / entiende 3ue si una clase implementa una inter#az. los m8todos de esa inter#az
estar1n siempre en la clase. aun3ue no se declaren. De modo 3ue si no los declaramos e2pl!citamente.
,-, / lo har1 por nosotros. Esos m8todos de la inter#az ser1n abstractos. as! 3ue la clase tendr1 3ue
de#inirse como abstracta. 4e puede encontrar m1s in#ormaci(n sobre la abstracci(n en el art!culo 58todos
y clases abstractos en ,-, /.
7hora +eamos el c(digo de la clase coche. 3ue tambi8n implementa la inter#az encendible. Este
c(digo lo hemos complicado un poco m1s.
class coche implements encendibleO
pri+ate KgasolinaN
pri+ate KbateriaN
pri+ate Kestado L MapagadoMN
#unction SSconstruct("O
KthisPQgasolina L AN
KthisPQbateria L 1AN
R
public #unction encender("O
i# (KthisPQestado LL MapagadoM"O
i# (KthisPQbateria Q A"O
i# (KthisPQgasolina Q A"O
KthisPQestado L MencendidoMN
KthisPQbateria PPN
echo MIbrQIbQEnciendo...I/bQ estoy encendido?MN
RelseO
echo MIbrQ'o tengo gasolinaMN
R
RelseO
echo MIbrQ'o tengo bater!aMN
R
RelseO
echo MIbrQWa estaba encendidoMN
R
R
public #unction apagar("O
i# (KthisPQestado LL MencendidoM"O
KthisPQestado L MapagadoMN
echo MIbrQIbQ7pago...I/bQ estoy apagado?MN
RelseO
echo MIbrQWa estaba apagadoMN
R
R
public #unction cargarSgasolina(Klitros"O
KthisPQgasolina @L KlitrosN
echo MIbrQ:argados Klitros litrosMN
R
R
7 la +ista del anterior c(digo. se puede comprobar 3ue no hay mucho en com*n entre las
clases bombilla y coche. El c(digo para encender una bombilla era muy simple. pero para
poner en marcha un coche tenemos 3ue realizar otras tareas. 7ntes tenemos 3ue +er si el
coche estaba encendido pre+iamente. si tiene gasolina y si tiene bater!a. ,or su parte. el
m8todo apagar hace una *nica comprobaci(n para +er si estaba o no el coche apagado
pre+iamente.
Tambi8n hemos incorporado un constructor 3ue inicializa los atributos del objeto. :uando se
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
;T
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
construye un coche. la bater!a est1 llena. pero el dep(sito de gasolina est1 +ac!o. ,ara llenar el
dep(sito simplemente se debe utilizar el m8todo cargarSgasolina(".
Llamadas polimr.i!as pasando o&etos 7ue implementan una inter.az
&as inter#aces permiten el tratamiento de objetos sin necesidad de conocer las caracter!sticas
internas de ese objeto y sin importar de 3u8 tipo son... simplemente tenemos 3ue saber 3ue el
objeto implementa una inter#az.
,or ejemplo. tanto los coches como las bombillas se pueden encender y apagar. 7s! pues.
podemos llamar al m8todo encender(" o apagar(". sin importarnos si es un coche o una
bombilla lo 3ue hay 3ue poner en marcha o detener.
En la declaraci(n de una #unci(n podemos especi#icar 3ue el par1metro de#inido implementa
una inter#az. de modo 3ue dentro de la #unci(n. se pueden realizar acciones teniendo en
cuenta 3ue el par1metro recibido implementa un juego de #unciones determinado.
,or ejemplo. podr!amos de#inir una #unci(n 3ue recibe algo por par1metro y lo enciende.
Especi#icaremos 3ue ese algo 3ue recibe debe de implementar la inter#az encendible. as!
podremos llamar a sus m8todos enciende(" o apaga(" con la seguridad de saber 3ue e2isten.
#unction enciendeSalgo (encendible Kalgo"O
KalgoPQencender("N
R
Kmibombilla L new bombilla("N
Kmicoche L new coche("N
enciendeSalgo(Kmibombilla"N
enciendeSalgo(Kmicoche"N
4i tu+i8ramos una clase 3ue no implementa la inter#az encendible. la llamada a esta #unci(n
pro+ocar!a un error. ,or ejemplo. un :DPFom no se puede encender ni apagar.
class cdO
public KespacioN
R
Kmicd L new cd("N
enciendeSalgo(Kmicd"N //da un error. cd no implementa la inter#az encendible
Esto nos dar!a un error como este: Gatal error: 7rgument 1 must implement inter#ace
encendible in c:HwwwHejphp/H#uncionSencender.php on line . 9ueda muy claro 3ue
deber!amos implementar la inter#az encendible en la clase cd para 3ue la llamada a la #unci(n
se ejecute correctamente.
Artculo por Miguel Angel Alvarez
,legir entre PHP4 y PHP5- onviene la migracin.
&as dudas b1sicamente circulan siempre el mismo camino. y ambas elecciones tienen sus
+entajas y des+entajas. 6ntentaremos en este in#orme orientar a los desarrolladores a
decidirse por una u otra alternati+a.
Es importante remarcar antes de ubicarse de lleno en el an1lisis de las +entajas y des+entajas
de una u otra opci(n. las principales di#erencias e2istentes entre ambas +ersiones. cuales son
los cambios 3ue repercuten m1s #uertemente en la compatibilidad de los scripts. y 3ue es lo
3ue nos depara el #uturo en toda esta historia.
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
;B
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
4amios pro.undos
&a llegada de ,-,/ +ino emparejada de una reestructuraci(n del :ore de ,-,. lo 3ue los
creadores de ,-, llama _end Engine.
7s! como el lejano ,-,; incluye su _end Engine A./. y ,-,< el _end Engine 1.A. tenemos _end
Engine $.A en ,-,/. El cambio de +ersi(n no #ue tri+ialN incluye la reescritura casi total del
modelo de objetos. entre sus cambios m1s sustanciales.
Esto repercute directamente en los scripts de ,-,< 3ue utilizan clases. tanto en la
compatibilidad como en per#ormance de ejecuci(n. ,osteriormente en este art!culo nos
re#eriremos nue+amente a este tema.
)eamos un ejemplo 3ue nos muestra un cambio sustancial en la implementaci(n del modelo de
objetos:
IJ
class ,ersona O
#unction set'ombre(Knombre" O
KthisPQnombre L KnombreN
R
#unction get'ombre(" O
return KthisPQnombreN
R
R
#unction 7lgo(Kp" O
KpersonaPQset'ombre(MDanielM"N
R
1 Kpersona L new ,ersona("N
$ KpersonaPQset'ombre(M,ichongolM"N
; 7lgo(Kpersona"N
< echo KpersonaPQget'ombre("N
JQ
@4u8l es el prolema en este !digo !orriendo en PHP)A
En la l!nea 1 instanciamos un objeto de la clase ,ersona.
&uego le decimos 3ue se llama Daniel.
El error de implementaci(n +iene con la l!nea ;. El argumento Kp 3ue recibe 7lgo. no es mas
3ue una copia de Kpersona. y eso esta 57&. `,or3ueJ. m!nimamente por $ razones.
&a primera raz(n es 3ue esta estrategia es ,==P'o compatible. :laramente cuando hablamos
del ,aradigma =rientado a =bjetos. estamos casi descartando 3ue cada objeto sea
re#erenciado por su 6denti#icador.
4in embargo. el _end Engine 1.A no est1 preparado para dicha acci(n:
IJ
#unction ejemplo(K+al"O
echo K+alN
R
Kcadena L Mte2toMN
ejemplo(Kcadena"N
JQ
&a +ariable Kcadena pasada como argumento a la #unci(n ejemplo. es copiada para su uso
local dentro de dicha #unci(n. Es lo 3ue se conoce como paso de par1metros por +alor.
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
;X
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
El _end Engine 1.A hace e2actamente esto para todas las #unciones. inclusi+e para las 3ue
est1n dentro de una clase. las cuales en ese caso act*an como m8todos:
IJ
#unction 7lgo(Kpersona" O
KpersonaPQset'ombre(MDanielM"N
R
JQ.
)ol+iendo al ejemplo inicial de la clase persona. el m8todo 7lgo recibe una copia (un clon" del
objeto ,ersona.
&a segunda raz(n +iene emparejada con la primera. siendo consecuencia de esta.
:ual3uier modi#icaci(n del objeto ,ersona 3ue se produzca dentro del m8todo 7lgo. solo tendr1
alcance local. y no se +er1 re#lejado cuando la #unci(n retorne.
IJ
7lgo(Kpersona"N
echo KpersonaPQget'ombre("N
JQ
En ese caso la modi#icaci(n del nombre 3ue hace la #unci(n 7lgo al objeto ,ersona no se +e
re#lejada cuando hacemos echo KpersonaPQget'ombre(".
En nuestro browser +eremos M,ichongolM.
Este es solo un ejemplo del por3ue de la reestructuraci(n tan importante en el :ore de ,-,. Es
claro 3ue toda reestructuraci(n barre con cuestiones de compatibilidad. para ganar en otros
sCillsN en este caso claramente estamos ganando en per#ormance. al liberarnos del o+erhead
3ue implica la constante copia de objetos 3ue son argumentos de m8todos y #unciones.
En art!culos posteriores trataremos en mayor detalle y pro#undidad los distintos aspectos 3ue
#ueron modi#icados. haciendo una comparati+a entre como se logran en ,-,< y como se logran
en ,-,/. 7dem1s de e2plicar pro#undamente las di#erencias en el modelo de objetos nos
3uedan temas pendientes como =pciones de con#iguraci(n (php.ini". :one2i(n a 5y49&
(mys3li". cambios en los m(dulos. etc.
-echa esta introducci(n. estamos en condiciones de de#inir las distintas situaciones en las 3ue
se puede encontrar el desarrollador. y 3ue aspectos juegan a su #a+or o en contra seg*n la
situaci(n en la 3ue se encuentre.
@4ual es mi es!enarioA
En el momento de plantearse la pregunta. el desarrollador seguramente se ubicar1 en alguno
de los dos escenarios posibles:
M 'ewbie (6niciaci(n en ,-,".
M E2perimentado.
$ewie
En el planteo de esta discusi(n. podr!amos decir 3ue es la situaci(n ideal. o por lo menos la
m1s bene#iciosa. 4i eres una persona 3ue 3uiere arrancar en ,-,. no lo dudes. ,-,/ es para ti.
Tus aplicaciones gozaran de las nue+as capacidades en ==,. obtendr1s el bene#icio de una
mejor per#ormance de ejecuci(n (esta comprobado e2perimentalmente 3ue ,-,/ corre un
$/Z m1s r1pido 3ue ,-,<" y tu c(digo estar1 muy bien acondicionado en cuanto a la
compatibilidad con el nue+o hijo 3ue asoma: ,-,.
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
<A
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
,or cierto. no todo es color de rosas. 0na de los mayores bene#icios a la hora de elegir ,-,
para trabajar en nuestro proyecto es la gran cantidad de c(digo 3ue podemos encontrar en
6nternet. y utilizarlo para nuestros trabajos. Tenemos una gran probabilidad de 3ue ante
alguna tarea 3ue se nos plantea. podamos encontrar alg*n script 3ue nos solucione la +ida.
ob+iamente adapt1ndolo a nuestras necesidades.
7hora bien. no todo el c(digo 3ue +amos a encontrar es compatible con ,-,/. De hecho la
gran mayor!a toda+!a no se ha adaptado. Es cierto 3ue con alg*n setting en nuestro php.ini
podemos ayudar a darle mayor compatibilidad. pero como contrapartida muchas de estas
settings se eliminaran en ,-,.
`9u8 3uedaJ -acerlo compatible modi#icando el c(digo. una tarea 3ue para un desarrollador
3ue se inicia no siempre es sencillo. De todas #ormas a no alarmarse. 3ue los grandes
proyectos (,-,'uCe. ,-,aa. etc." o#recen compatibilidad.
%>perimentado
En este caso. el optar por 3uedarse con ,-,< o pasar a ,-,/ depende de nuestra aplicaci(n.
&as interrogantes 3ue el desarrollador se puede plantear podr!an ser:
P `5i aplicaci(n usa clases y objetosJ
P `5i motor de aase de datos es 5y49&J
P `0tilizo un hosting e2ternoJ
P `5i aplicaci(n su#re modi#icaciones en cuanto a los re3uerimientos y l(gica de negociosJ
,asemos a discutir +entajas y des+entajas en cada uno de los interrogantes:
@Mi apli!a!in usa !lases ( o&etosA
:omo pudimos comprender al comienzo de este articulo. uno de los principales es#uerzos de
los dise>adores del _end Engine radic( en el mejoramiento del modelo de objetos. bas1ndose
claramente en un re#erente indiscutible en esta materia como lo es 4un. 4al+ando las
di#erencias. se han tomado muchas cosas de Ua+a. desde con+enciones de nomenclaturas
hasta estrategias de implementaci(n.
4eria un desperdicio no utilizar dicho es#uerzo. sobre todo si nuestra aplicaci(n hace un uso
e2hausti+o de clases y objetos.
@Mi motor de Base de datos es M(=CLA
7 di#erencia de la estrategia de ,-,< para la conecti+idad ,-,/5y49&. en la 3ue el :ore de
,-, nos pro+ee de un set de #unciones para dicha interacci(n. en ,-,/ 5y49& nos pro+ee de
un 7,6 e2terno.
a1sicamente. la raz(n de este cambio #ue una modi#icaci(n de licencia de 5y49&. 3ue obligo a
,-, a hacer de 5y49& una base de datos m1s. y no M&7M base de datos. como +enia siendo en
,-,; y ,-,<.
De todas #ormas. esto no repercute en nuestro c(digo. sino en la per#ormance de nuestra
aplicaci(n.
El hecho de 3ue una e2tensi(n no #orme parte del :ore de ,-, y pase a ser e2terna nos
genera un o+erhead. una sobrecarga de ejecuci(n en detrimento de la per#ormance.
:omo contrapartida. ,-,/ nos da la posibilidad de sacarle el mayor jugo posible a las muchas
mejoras incorporadas en 5y49& <.1.; o superior. a tra+8s del 7,6 mys3li.
Esto implica hacer uso de otras #unciones. modi#icando nuestro c(digo.
7hora bien. `3ue tan costosa es esta reescrituraJ Depender1 de nuestra estrategia de cone2i(n
a base de datos. `0tilizamos una capa de abstracci(n del estilo 7D=db J 4i la utilizamos
estaremos mucho mejor parados #rente a tal reescritura. En caso contrario el tiempo in+ertido
ser1 sensiblemente mayor.
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
<1
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
@Dtilizo un hosting e>ternoA
En caso de no disponer de un hosting propio. y tener 3ue depender de un hosting e2terno 3ue
nos pro+ea de ,-,. seguramente el hecho de pensar en migrar a ,-,/ puede ser un problema.
De hecho. estad!sticas de principio de $AA nos indican 3ue solo alrededor del /Z de los
hosting 3ue proporcionan ,-,. tienen ,-,/.
Esto no hace mas 3ue re#lejar la lentitud con la 3ue se esta mo+iendo el proceso de traspaso
de ,-,< hacia ,-,/.
0na pregunta 3ue surge directamente sobre este tema es `,or 3u8J
aueno. si uno tomo una distribuci(n de &inu2. es poco probable 3ue la +ersi(n de ,-,/ sea la
incluida.
&a con#ormidad de los programadores con ,-,< es grande. y mucha de la documentaci(n
e2istente esta escrita para ,-,<.
De todas #ormas. a no dormirse con ,-,<. 0n tema 3ue se trata en la segunda parte de este
art!culo es lo nue+o 3ue nos trae ,-,. )eremos 3ue ,-,/ en muchos aspectos es una
transici(n mientras 3ue la con#irmaci(n se llama ,-,.
@Mi apli!a!in su.re modi.i!a!iones en !uanto a los re7uerimientos ( lgi!a de
nego!iosA
:uando las aplicaciones tienen re3uerimientos de cliente bastante cambiantes. y se emplean
recursos para su mantenimiento. o utilizamos una metodolog!a de desarrollo incremental
(so#tware +ersionado". lo ideal es utilizar lo *ltimo 3ue nos proporciona nuestra plata#orma de
programaci(n. [eneralmente lo 3ue se busca es un cambio gradual. modular. y sostenido.
,or otro lado. si nuestras aplicaciones residen en producci(n sin mayores modi#icaciones (alg*n
proceso batch. alguna aplicaci(n depurada. alg*n algoritmo estable" y estamos con#ormes con
su #uncionamiento. 3uiz1s no sea de nuestro inter8s migrar hacia una nue+a +ersi(n.
'os 3ueda analizar 3ue hay de nue+o en ,-, y 3ue cosas deber!amos ir teniendo en cuenta si
utilizamos ,-,< o ,-,/.
Artculo por !aniel $#ez
'eguridad P%# /I0
Desa#ortunadamente. eso signi#ica a menudo los programadores de ,-,. especialmente 8sos
m1s nue+os al desarrollo web. cometen ciertos riesgos de seguridad y desapro+echan el
potencial 3ue sus usos pueden contener. 73u! est1n algunos de los problemas mas comunes de
seguridad y c(mo e+itarlos.
Eegla nFmero uno: $un!a0 !on.iar en los usuarios
'unca debes con#iar en 3ue los usuarios te +an a mandar los datos 3ue tu esperas. 5ucha
gente responde a esto con algo comoD=h. nadie estar!a interesado en mi sitioE. Esta a#irmaci(n
no podr!a ser mas incorrecta . siempre hay un usuario mal8+olo 3ue 3uiere e2plotar un agujero
de seguridad ademas los problemas pueden presentarse #1cilmente debido a un usuario 3ue
hace algo mal inintencionalmente.
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
<$
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
,or todo esto la regla de todo desarrollador web tiene 3ue ser M'unca. con#iar en los
usuariosM . 7sumir 3ue cada pieza de datos 3ue tu sitio recoge de un usuario puede con+ertirse
en un agujero de seguridad. siempre. 4i la seguridad de tu sitio web es importante para ti.
este un buen puntopara comenzar a aprender. 4er!a con+eniente tener Duna hoja de seguridad
para ,-,E al lado de tu escritorio con los puntos mas importantes en te2to negrita grande.
Gariales gloales
En muchas lenguajes debes crear e2pl!citamente un +ariable para utilizarlas. En ,-,. hay una
opci(n. las DregisterSglobalsE. 3ue puedes #ijar en php.ini y 3ue permite 3ue utilices +ariables
globales.
:onsidera el c(digo siguiente:
i# (Kpassword LL MmySpasswordM" O
Kauthorized L 1N
R
i# (Kauthorized LL 1" O
echo M5is cosas importantes MN
R
7 muchos de +osotrosos puede parecer 3ue este c(digo esta #uncionando per#ectamente. `4in
embargo. si un ser+idor tiene DregisterSglobalsE encendidos. entonces simplemente
agregandoEJ authorizedL1 M al 0F& dar1 a cual3uier persona el acceso libre a e2actamentelo
3ue no 3uisieras 3ue todo el mundo +iera. bste es uno de los problemas mas comunes de la
seguridad de ,-,.
7#ortunadamente. esto tiene un par de soluciones simples y posibles. &a primera. y 3uiz1s la
mejor. es #ijar desacti+ar DregisterSglobalsE. &a segunda es asegurarse de 3ue utilizas
solamente las +ariables 3ue has #ijado e2pl!citamente t* mismo. En el ejemplo anterior. eso
signi#icar!a la adici(n DKauthorized L AN E al principio de la escritura:
Kauthorized L AN
i# (Kpassword LL MmySpasswordM" O
Kauthorized L 1N
R
i# (Kauthorized LL 1" O
echo M&ots o# important stu##.MN
R
Mensa&es de error
&os mensajes de error son una herramienta muy *til para los programadores y hacCers. 0n
desarrollador los necesita para detectar bugs. 0n hacCer puede utilizarlos para descubrir todas
las clases de in#ormaci(n sobre un sitio. desde la estructura del directorio del ser+idor a la
in#ormaci(n de la cone2i(n de la base de datos.En ,-, para e+itar esto puedes utilizar
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
<;
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
.htaccess o php.ini. #ijando DerrorSreportingE a DAE.
Artculo por Manu 1utierrez
'eguridad P%# /II0
5ucha gente hace el uso e2cesi+o de esto. y muchos grandes sitios. con#!a en las bases de
datos para #uncionar.
4in embargo. con esa +entaja hay problemas su#icientemente grandes en la seguridad a los
3ue tendras 3ue hacer #rente. 7#ortunadamente. hay un mont(n de soluciones. El peligro m1s
com*n de seguridad al 3ue debes de hacer #rente es cuando un usuario utiliza un #allo para
poder atacar directamente al ser+idor de bases de datos con sentencias 49&.
0tilicemos un ejemplo com*n. 5uchos sistemas utilizan un codigo muy parecido a este para
comprobar el usuario y la contrase>a pudiendose hacer todas las combinaciones +1lidas del
usuario y de su contrase>a. por ejemplo para controlar el acceso a un 1rea de administraci(n:
KchecC L mys3lS3uery(M4E&E:T 0sername. ,assword. 0ser&e+el GF=5 0sers W-EFE 0sername L cM.
KS,=4T\cusernamec].Mc and ,assword L cM.KS,=4T\cpasswordc].McM"N
`Te parece #amiliarJ . W parece 3ue no podr!a hacer mucho da>o. ,ero digamos por un
momento 3ue introduzco el siguiente Eusuario E en el #ormulario:
c= 1L1 d
&a pregunta 3ue +a a ser ejecutada ser!a esta:
4E&E:T 0sername. ,assword GF=5 0sers W-EFE 0sername L cc =F 1L1 dc and ,assword L cc
&a almohadilla (d" le dice a5y49& 3ue todo 3ue le sigue es un comentario y 3ue no debe de
hacerle caso. Ejecutar1 49& hasta ese punto. Despues 1 es igual a 1. 49& de+ol+er1 todos los
usuarios y contrase>as de la base de datos. W como la primera combinaci(n del usuario y de
contrase>a en la mayor!a de las bases de datos es la de el administrador. la persona 3ue
incorpor( simplemente algunos s!mbolos en un #ormulario ahora entra como administrador de
la Web . con los mismos pri+ilegios 3ue tendr!a si supiera realmente el usuario y la contrase>a.
:on una poca de creati+idad. este agujero de seguridad se puede e2plotar aun m1s lejos.
permitiendo 3ue un usuario cree su propia cuenta . lea n*meros de las tarjetas de cr8dito o
simplemente +acie la base de datos.
7#ortunadamente. este tipo de +ulnerabilidad es bastante #1cil de solucionar. :omprobando si
hay algun caracter raro cuando el usuario introduce los datos. y 3uit1ndolos o neutralizandos.
podemos e+itar 3ue cual3uier persona utilize su propio c(digo del 49& en nuestra base de
datos. &a #unci(n 3ue sigue ser!a la adecuada:
#unction maCeSsa#e(K+ariable" O
K+ariable L addslashes(trim(K+ariable""N
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
<<
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
return K+ariableN
R
7hora debemos modi#icar nuestra consulta. En +ez de usar +ariables S,=4T como en la
consulta de arriba. ahora utilizamos todos los datos del usuario con la #unci(n maCeSsa#e.
dando por resultado el c(digo siguiente:
Kusername L maCeSsa#e(KS,=4T\cusernamec]"N
Kpassword L maCeSsa#e(KS,=4T\cpasswordc]"N
KchecC L mys3lS3uery(M4E&E:T 0sername. ,assword. 0ser&e+el GF=5 0sers W-EFE 0sername L cM.Kusername.Mc and
,assword L cM.Kpassword.McM"N
7hora. si un usuario incorpor( los datos anteriormente citados. la consulta ser1 la siguiente.
3ue es totalmente ino#ensi+a. &a consulta siguiente seleccionar1 de una base de datos los
registros donde el usuario es igual a DH c= o 1L1 dE.
4E&E:T 0sername. ,assword. 0ser&e+el GF=5 0sers W-EFE 0sername L cHc =F 1L1 dc and ,assword L cc
7hora. a menos 3ue tengas un usuario con un nombre muy inusual y una contrase>a en
blanco. tu mal8+olo atacante no podr1 hacer ning*n da>o en tu sitio Web. Es importante
comprobar todos los datos pasados a tu base de datos. &as cabeceras de -TT, en+iados por
elusuario pueden ser #alsi#icadas. 4u direcci(n de remitente tambien puede ser #alsi#icada. 'o
con#ies en los datos en+iados por el usuario. y tu y tu sitio estareis a sal+o
Artculo por Manu 1utierrez
Manual de PHP 5: http://www.desarrollowe.!om/manuales/5"/
% &os manuales de DesarrolloWeb.com tienen el copyright de sus autores. 'o reproducir sin autorizaci(n.
</

También podría gustarte