Вы находитесь на странице: 1из 54

TALLER DE PROGRAMACION WEB DESIGNER IV UPLA

DISTANCIA -2011
CONTENIDO:
Programacin Orientada a Objetos con PHP
Componentes pilares de la POO.
Caractersticas bases de la POO.
Ventajas de la POO
POO en PHP
Ejemplo !" #ariable $t%is
Ejemplo !& De'inicin simple de (na Clase
Ejemplo !) Valores por de'ecto de los miembros de (na clase
Ejemplo !* Creando (na Instancia
Ejemplo ! Heredando de (na Clase
Ejemplo !+ De'iniendo , (sando (na constante
-ases sobre las .(e se asienta la Programacin Orientada a Objetos.
Cmo se piensa en objetos
Clases en POO
Propiedades en clases
/0todos en las clases
Objetos en POO
Estados en objetos
/ensajes en objetos
Ejemplo concreto de programacin orientada a objetos
Instanciar objetos a partir de clases
Constr(ctor , Destr(ctor para .(e sir#en
Ejemplo de (na clase .(e de'ine (n constr(ctor.
E1plicacin de los destr(ctores en PHP , ejemplos de '(ncionamiento.
P(blic2 Protected , Pri#ate.
/odi'icador p(blic (Ejemplo)
/odi'icador pri#ate (Ejemplo)
/odi'icador protected (Ejemplo)
E1plicamos la %erencia en PHP
3inta1is de %erencia en PHP (Ejemplo)
Para a'ian4ar los conocimientos sobre programacin orientada a objetos
#amos a concl(ir por a%ora la creacin de n(estro #ideocl(b con PHP.
5trib(tos de la clase #ideocl(b
Constr(ctor
/0todo incl(ir6prod(cto78
/0todos incl(ir6d#d782incl(ir6cinta6#ideo78 e incl(ir6j(ego78
/0todo incl(ir6socio78
/0todos listar6prod(ctos78 , listar6socios78
/0todo al.(ila6a6socio78
Orientacin a objetos a#an4ada
Clase abstracta , los m0todos abstractos.
9a sinta1is de la abstraccin
:(e son las inter'aces2 para .(0 se (tili4an , cmo trabajar con ellas en PHP.
Cdigo para de'inir (na inter'a4
Implementacin de inter'aces
9lamadas polimr'icas pasando objetos .(e implementan (na inter'a4
Otros as(ntos relacionados con la programacin en PHP
Cambios profundos
Cul es el problema en este cdigo corriendo en PHP4?
Cul es mi escenario?
Regla nmero uno: Nunca, confiar en los usuarios
ariables globales
!ensa"es de error
1
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
Programacin #rientada a #b"etos con PHP
PHP no es en s un lenguaje de programacin orientada a objetos, pero desde hace ya unas versiones se
ha implementado el uso de clases y objetos. Au tenemos un ejemplo de una clase sencilla en PHP!
class Clase {
var $Una_variable; //Creamos las variables
var $Otra_variable;

function Clase($var1, $var2){ //Creamos un constructor que defina las
variables Una_variable ! Otra_variable dentro de la clase"
$t#is$%Una_variable & $var1;
$t#is$%Otra_variable & $var2;
'
'
Ahora veremos como se llama a la clase previamente creada!
$clase & ne( Clase()sta es la variable 1, )sta es la variable 2);
El ejemplo anterior es v"lido para php#, el mismo ejemplo escrito php$, vara en el nombre del constructor
y en la %orma en como se declara la variable.
*+,#,

class Clase {
,ublic $Una_variable; //Creamos las variables ,ara ,#,-
,ublic $Otra_variable;

function __construct($var1, $var2){ //Creamos un constructor que defina las
variables Una_variable ! Otra_variable dentro de la clase"
$t#is$%Una_variable & $var1;
$t#is$%Otra_variable & $var2;
'
'

$instancia & ne( Clase(.ro/o.,.blanco.);

ec#o )l color de la variable 0$Una_variable es 1 " $instancia$%Una_variable "
)l color de la otra variable 0$Otra_variable es1 ;
$instancia$%Otra_variable;

+%
El valor ,ublic indica ue la propiedad o el m&todo est"n disponible para todo cdigo ue desee acceder
a los mismos. PHP $ o%rece tres niveles de visibilidad para utili'ar en clases! public, private, protected. A la
ve', cambia la %orma en la ue se declara el constructor de la clase, ya ue en PHP # se usaba el mismo
nombre de esta, y en PHP $ se crea el m&todo especial __construct
(na de las ventajas ue o%rece PHP desde su versin $.) es la capacidad de utili'ar completamente el
paradigma de programacin ue se conoce como Programacin Orientada a Objetos (P** de ahora en
adelante). POO utili'a +objetos, estructuras de datos ue consisten en propiedades y m&todos. Este
paradigma intenta representar las partes de una aplicacin y-o la aplicacin completa de una %orma m"s
humana.
2
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
Componentes pilares de la POO.
Para entender la P** es necesario dominar los siguientes conceptos.
Objeto. .e re%iere com/nmente a atributos (elementos) y comportamientos (m&todos) encapsulados en
una entidad. .on un m&todo natural para implementar estructuras de datos abstractos, trayendo
+%sicamente, componentes de datos con procedimientos para luego manipularlos. 0odo objeto tiene
estado, e1hibe un comportamiento bien de%inido y posee identidad /nica.
Clase. Es un tipo de dato de%inido por el programador ue determina las estructuras de datos ue lo
%orman y las %unciones asociadas con &l, es decir es un modelo con el ue se construyen los objetos.
.e de%ine como el constructor utili'ado como +plano, para crear un *bjeto. 2escribe el estado y el
comportamiento del objeto creado. (n objeto creado por una 3lase es una instancia de la clase y la clase
ue cre esa instancia es considerado como el tipo del objeto. (n ejemplo de un objeto creado por una
clase +%ruta, sera +pi4a,, otro +pera, y as sucesivamente. Es la abstraccin de un concepto.
Instancia. .e crea cuando una construye un objeto. 5as instancias de una clase comparten los mismo
atributos pero pueden di%erir en u& los atributos contengan. Por ejemplo una clase +Persona, describe los
atributos comunes de una persona6 cada persona es generalmente parecida, pero vara en atributos como
+altura, y +peso,. 5a clase listara tipos de atributos, as como tambi&n las acciones ue una persona
podra reali'ar! +saltar,, +caminar,, +andar,, +comer,. 5a instancia es el objeto creado en tiempo de corrida
de una aplicacin. *tro ejemplo sera! +5assie, es una instancia de la clase +Perro, y as tambi&n +Pluto,
sera otra instancia de la misma clase.
Caractersticas bases de la POO.
Herencia. Es la capacidad %ormar nuevas 3lases usando clases previamente de%inidas. 5as nuevas clases,
conocida como 3lases 2erivadas, toman (o heredan) los atributos y los m&todos pree1istentes de la clase
+madre,. Es una intento para ayudar a reusar cdigo con poca o casi ninguna modi%icacin.
/0todos. .e re%iere como las %unciones de un objeto.
5bstraccin. Es un concepto o idea no asociada a una instancia. El concepto se origin por la analoga
con las abstraccin en matem"ticas. 0ericamente envuelve la %acilidad de de%inir objetos ue representan
+actores, abstractos ue pueden reali'ar un trabajo o accin. (n ejemplo sera una clase +casa, ue de%ina
la estructura de una casa.
Encaps(lamiento. .e re%iere a +esconder, el estado de una propiedad o m&todo de un objeto.
Polimor'ismo. Es la habilidad de un tipo +A, ue aparece y es usado como otro tipo +7,. .igni%ica ue un
tipo +A, de alguna manera deriva de un tipo +7, o ue un tipo +A, implementa una inter%ace ue representa
un tipo +7,. Por ejemplo, si a un +Perro, se le ordenara ue hablara, &ste ladrara, mas si a un +3erdo, se
le ordenara ue hablara respondera con un +oink oink+.
Constante. Es la euivalencia de variable global de la programacin estructurada.
Ventajas de la POO
Fomenta a !e"t##$a%#&n ' e(ten)#&n *e %&*#+o,
Pe!m#te %!ea! )#)tema) m-) %om.e/o),
Rea%#ona! e )#)tema a m"n*o !ea,
Fa%##ta a %!ea%#&n *e .!o+!ama) 0#)"ae),
Con)t!"%%#&n *e .!otot#.o)
1
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
A+##$a e *e)a!!oo *e )o2t3a!e
Fa%##ta e t!a4a/o en e5"#.o
Fa%##ta e manten#m#ento *e )o2t3a!e
5o interesante de la P** es ue proporciona conceptos y herramientas con las cuales se modela y
representa el mundo real tan %ielmente como sea posible.
POO en PHP
3ada de%inicin de una clase comien'a con palabras clave +class,, seguido de un nombre de clase, ue
puede ser cualuier nombre ue no es una palabra reservada en PHP. 5uego por un par de llaves, ue
contiene la de%inicin de los miembros de las clases y m&todos. (na pseudovariable 8this est" disponible
cuando un m&todo se llama desde un objeto dentro del mismo conte1to. 8this es una re%erencia al objeto
de la convocatodo (por lo general, el objeto al ue pertenece el m&todo, pero puede ser otro objeto, si el
m&todo es llamado est"ticamente desde el conte1to de un objeto secundario).
0odo esto ueda ilustrado en los ejemplos siguientes!
Ejemplo !" #ariable $t%is
1
2
2
3
-
4
5
6
7
18
11
12
12
13
1-
14
15
16
17
28
21
22
22
23
2-
24
25
26
27
28
* +,#,
class 9
{
function foo()
{
if (isset($t#is)) {
ec#o .$t#is esta definido (.;
ec#o :et_class($t#is);
ec#o )\n;
' else {
ec#o \$t#is no esta definido"\n;
'
'
'

class ;
{
function bar()
{
911foo();
'
'

$a & new 9();
$a$%foo();
911foo();
$b & new ;();
$b$%bar();
;11bar();
?>
6
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
5a salida sera la siguiente!
8this is de%ined (a)
8this is not de%ined.
8this is de%ined (b)
8this is not de%ined.
Ejemplo !& De'inicin simple de (na Clase
1
2
2
3
-
4
5
6
7
18
11
12
* +,#,
class <im,leClass
{
// member declaration
public $var & .a default value.;

// method declaration
public function dis,la!=ar() {
ec#o $t#is$%var;
'
'
?>
Ejemplo !) Valores por de'ecto de los miembros de (na clase
1
2
2
3
-
4
5
6
7
18
11
12
12
13
1-
14
15
16
* +,#,
class <im,leClass
{
// invalid member declarations:
public $var1 & .#ello .".(orld.;
public $var2 & <<<EOD
hello world
EOD;
public $var2 & 1>2;
public $var3 & self11m!<tatic?et#od();
public $var- & $m!=ar;

// valid member declarations:
public $var4 & m!Constant;
public $var5 & self11classConstant;
public $var6 & arra!(true, false);
'
?>
Creando (na Instancia
Para crear una instancia de una clase un nuevo objeto debe ser creado y asignado a una variable. (n
objeto ser" siempre asignado cuando se crea un nuevo objeto al menos ue el objeto tenga un constructor
de%inido ue arroje una e1cepcin en caso de error. 5as clases deben ser de%inidas antes de crear la
instancia.
Ejemplo !* Creando (na Instancia
1
2
2
3
-
4
* +,#,
$instance & new <im,leClass();

// This can also be done with a variable:
$class@ame & .Aoo.;
$instance & new $class@ame(); // Foo()
7
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
5 ?>
E1tendiendo (na clase
(na clase puede heredad m&todos y miembros de otra clase usando la plabra clave +e1tends, en la
declaracin. 9os es posible e1tender de m/ltples clases, una clase puede solo heredar de una clase base.
5os m&todos y miembros heredados pueden ser sobreescribidos al menos ue la clase lo de%ina como
+%inal,, redeclar"ndolo con el mismo nombre ue en la clase padre.
Ejemplo ! Heredando de (na Clase
1
2
2
3
-
4
5
6
7
18
11
12
12
13
* +,#,
class )BtendClass extends <im,leClass
{
// Redefine the parent method
function dis,la!=ar()
{
ec#o )Btendin: class\n;
,arent11dis,la!=ar();
'
'

$eBtended & new )BtendClass();
$eBtended$%dis,la!=ar();
?>
Constantes
Es posible de%inir valores constantes en una clase. 5as 3onstantes di%ieren de las variables normales en
ue no se usa el smbolo +8, para declararlas. El valor debe ser una e1presin constante, no una variable,
ni tampoco el resultado de una operacin matem"tica.
Ejemplo !+ De'iniendo , (sando (na constante
1
2
2
3
-
4
5
6
7
18
11
12
12
13
1-
14
15
16
17
28
* +,#,
class ?!Class
{
const constant & .constant value.;

function s#o(Constant() {
ec#o self11constant " \n;
'
'

ec#o ?!Class11constant " \n;

$classname & ?!Class;
ec#o $classname11constant " \n; // PP !"#"$

$class & new ?!Class();
$class$%s#o(Constant();

ec#o $class11constant"\n; // PP !"#"$
?>
Concl(sin
Hasta au llega la primera parte de la Programacin Orientada a Objetos en PHP $. A/n %altan muchas
otras caractersticas interesantes ue ser"n tratadas m"s adelante. .e recomienda dominar bien el
8
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
concepto de *bjeto y 3lase, ya ue el resto es pura sinta1is. :ecomiendo ue prueben los ejemplos au
mostrados para un mayor dominio del tema.
-ases sobre las .(e se asienta la Programacin Orientada a Objetos.
5a programacin *rientada a objetos (P**) es una %orma especial de programar, m"s cercana a como
e1presaramos las cosas en la vida real ue otros tipos de programacin.
3on la P** tenemos ue aprender a pensar las cosas de una manera distinta, para escribir nuestros
programas en t&rminos de objetos, propiedades, m&todos y otras cosas ue veremos r"pidamente para
aclarar conceptos y dar una peue4a base ue permita soltarnos un poco con este tipo de programacin.
/oti#acin
2urante a4os, los programadores se han dedicado a construir aplicaciones muy parecidas ue resolvan
una y otra ve' los mismos problemas. Para conseguir ue los es%uer'os de los programadores puedan ser
utili'ados por otras personas se cre la P**. ;ue es una serie de normas de reali'ar las cosas de manera
ue otras personas puedan utili'arlas y adelantar su trabajo, de manera ue consigamos ue el cdigo se
pueda reutili'ar.
5a P** no es di%cil, pero es una manera especial de pensar, a veces subjetiva de uien la programa, de
manera ue la %orma de hacer las cosas puede ser di%erente seg/n el programador. Aunue podamos hacer
los programas de %ormas distintas, no todas ellas son correctas, lo di%cil no es programar orientado a
objetos sino programar bien. Programar bien es importante porue as nos podemos aprovechar de todas
las ventajas de la P**.
Cmo se piensa en objetos
Pensar en t&rminos de objetos es muy parecido a cmo lo haramos en la vida real. Por ejemplo vamos a
pensar en un coche para tratar de modeli'arlo en un esuema de P**. 2iramos ue el coche es el
elemento principal ue tiene una serie de caractersticas, como podran ser el color, el modelo o la marca.
Adem"s tiene una serie de %uncionalidades asociadas, como pueden ser ponerse en marcha, parar o
aparcar.
Pues en un esuema P** el coche sera el objeto, las propiedades seran las caractersticas como el color
o el modelo y los m&todos seran las %uncionalidades asociadas como ponerse en marcha o parar.
Por poner otro ejemplo vamos a ver cmo modeli'aramos en un esuema P** una %raccin, es decir, esa
estructura matem"tica ue tiene un numerador y un denominador ue divide al numerador, por ejemplo
<-=.
9
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
5a %raccin ser" el objeto y tendr" dos propiedades, el numerador y el denominador. 5uego podra tener
varios m&todos como simpli%icarse, sumarse con otra %raccin o n/mero, restarse con otra %raccin, etc.
Estos objetos se podr"n utili'ar en los programas, por ejemplo en un programa de matem"ticas har"s uso
de objetos %raccin y en un programa ue gestione un taller de coches utili'ar"s objetos coche. 5os
programas *rientados a objetos utili'an muchos objetos para reali'ar las acciones ue se desean reali'ar y
ellos mismos tambi&n son objetos. Es decir, el taller de coches ser" un objeto ue utili'ar" objetos coche,
herramienta, mec"nico, recambios, etc.
Clases en POO
5as clases son declaraciones de objetos, tambi&n se podran de%inir como abstracciones de objetos. Esto
uiere decir ue la de%inicin de un objeto es la clase. 3uando programamos un objeto y de%inimos sus
caractersticas y %uncionalidades en realidad lo ue estamos haciendo es programar una clase. En los
ejemplos anteriores en realidad habl"bamos de las clases coche o %raccin porue slo estuvimos
de%iniendo, aunue por encima, sus %ormas.
Propiedades en clases
5as propiedades o atributos son las caractersticas de los objetos. 3uando de%inimos una propiedad
normalmente especi%icamos su nombre y su tipo. 9os podemos hacer a la idea de ue las propiedades son
algo as como variables donde almacenamos datos relacionados con los objetos.
/0todos en las clases
.on las %uncionalidades asociadas a los objetos. 3uando estamos programando las clases las llamamos
m&todos. 5os m&todos son como %unciones ue est"n asociadas a un objeto.
Objetos en POO
5os objetos son ejemplares de una clase cualuiera. 3uando creamos un ejemplar tenemos ue especi%icar
la clase a partir de la cual se crear". Esta accin de crear un objeto a partir de una clase se llama
instanciar (ue viene de una mala traduccin de la palabra instace ue en ingl&s signi%ica ejemplar). Por
ejemplo, un objeto de la clase %raccin es por ejemplo <-$. El concepto o de%inicin de %raccin sera la
clase, pero cuando ya estamos hablando de una %raccin en concreto #->, ?-@))) o cualuier otra, la
llamamos objeto.
Para crear un objeto se tiene ue escribir una instruccin especial ue puede ser distinta dependiendo el
lenguaje de programacin ue se emplee, pero ser" algo parecido a esto.
mi3oche A neB 3oche()
:
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
3on la palabra neB especi%icamos ue se tiene ue crear una instancia de la clase ue sigue a
continuacin. 2entro de los par&ntesis podramos colocar par"metros con los ue iniciali'ar el objeto de la
clase coche.
Estados en objetos
3uando tenemos un objeto sus propiedades toman valores. Por ejemplo, cuando tenemos un coche la
propiedad color tomar" un valor en concreto, como por ejemplo rojo o gris metali'ado. El valor concreto
de una propiedad de un objeto se llama estado.
Para acceder a un estado de un objeto para ver su valor o cambiarlo se utili'a el operador punto.
mi3oche.color A rojo
El objeto es mi3oche, luego colocamos el operador punto y por /ltimo el nombre e la propiedad a la ue
deseamos acceder. En este ejemplo estamos cambiando el valor del estado de la propiedad del objeto a
rojo con una simple asignacin.
/ensajes en objetos
(n mensaje en un objeto es la accin de e%ectuar una llamada a un m&todo. Por ejemplo, cuando le
decimos a un objeto coche ue se ponga en marcha estamos pas"ndole el mensaje +ponte en marcha,.
Para mandar mensajes a los objetos utili'amos el operador punto, seguido del m&todo ue deseamos
invocar.
mi3oche.ponerseEnCarcha()
En este ejemplo pasamos el mensaje ponerseEnCarcha(). Hay ue colocar par&ntesis igual ue cualuier
llamada a una %uncin, dentro iran los par"metros.
Otras cosas
Hay mucho todava ue conocer de la P** ya ue slo hemos hecho re%erencia a las cosas m"s b"sicas.
0ambi&n e1isten mecanismos como la herencia y el polimor%ismo ue son unas de las posibilidades m"s
potentes de la P**.
5a herencia sirve para crear objetos ue incorporen propiedades y m&todos de otros objetos. As podremos
construir unos objetos a partir de otros sin tener ue reescribirlo todo.
;
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
El polimor%ismo sirve para ue no tengamos ue preocuparnos sobre lo ue estamos trabajando, y
abstraernos para de%inir un cdigo ue sea compatible con objetos de varios tipos.
.on conceptos avan'ados ue cuesta e1plicar en las lneas de ese in%orme. 9o hay ue olvidar ue e1isten
libros enteros dedicados a la P** y au solo pretendemos dar un repaso a algunas cosas para ue os
suenen cuando teng"is ue poneros delante de ellas en los lenguajes de programacin ue debe conocer
un desarrollador del Beb.
Ejemplo concreto de programacin orientada a objetos
Clases en PHP
5as clases en Programacin orientada a objetos (P**) son de%iniciones de los elementos ue %orman un
sistema, en este caso, de%iniciones de los objetos ue van a intervenir en nuestros programas.
(n objeto se de%ine indicando u& propiedades y %uncionalidades tiene. Dustamente esas declaraciones son
lo ue es una clase. 3uando se hace una clase simplemente se especi%ica u& propiedades y
%uncionalidades tiene. Por ejemplo, un hombre podra tener como propiedades el nombre o la edad y como
%uncionalidades, comer, moverse o estudiar.
En la clase hombre declararamos dos atributos! la edad o el nombre, ue seran como dos variables.
0ambi&n deberamos crear tres m&todos, con los procedimientos a seguir para ue el hombre pueda
comer, moverse o estudiar. Estos m&todos se de%inen declarando %unciones dentro de la clase.
El cdigo para de%inir una clase se puede ver a continuacin!
class #ombre{
var $nombre;
var $edad;
function comer($comida){
//aquC el cDdi:o del mEtodo
'
function moverse($destino){
//aquC el cDdi:o del mEtodo
'
function estudiar($asi:natura){
10
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
//aquC el cDdi:o del mEtodo
'
'
Podr" comprobarse ue este cdigo no di%iere en nada del de las versiones anteriores de PHP, ue ya
soportaban ciertas caractersticas de la P**. Esta situacin cambiar" a poco ue e1ploremos las
caractersticas m"s avan'adas de PHP $, ue implicar"n mejoras ue no estaban presentes en las
versiones anteriores
Instanciar objetos a partir de clases
Hemos visto ue una clase es tan slo una de%inicin. .i ueremos trabajar con las clases debemos
instanciar objetos, proceso ue consiste en generar un ejemplar de una clase.
Por ejemplo, tenemos la clase hombre anterior. 3on la clase en si no podemos hacer nada, pero podemos
crear objetos hombre a partir de esa clase. 3ada objeto hombre tendr" unas caractersticas propias, como
la edad o el nombre. Adem"s podr" desempe4ar unas %unciones como comer o moverse, ahora bien, cada
uno comer" o se mover" por su cuenta cuando le sea solicitado, sin inter%erir en principio con lo ue pueda
estar haciendo otro hombre.
Ea ue estamos, vamos a ver cmo se generaran un par de hombres, es decir, cmo se instanciaran un
par de objetos de la clase hombre. Para ello utili'amos el operador neB.
$,e,e & ne( #ombre();
$/uan & ne( #ombre();
Concl(sin
Es importante darse cuenta de la di%erencia entre un objeto y una clase. 5a clase es una de%inicin de unas
caractersticas y %uncionalidades, algo abstracto ue se concreta con la instanciacin de un objeto de dicha
clase.
(n objeto ya tiene propiedades, con sus valores concretos, y se le pueden pasar mensajes (llamar a los
m&todos) para ue hagan cosas.
11
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
Vamos a #er .(0 es (n constr(ctor , para .(e sir#en2 adem;s de (n sencillo
ejemplo de (na clase .(e de'ine (n constr(ctor.
5os constructores se encargan de resumir las acciones de iniciali'acin de los objetos. 3uando se instancia
un objeto, se tienen ue reali'ar varios pasos en su iniciali'acin, por ejemplo dar valores a sus atributos y
eso es de lo ue se encarga el constructor. 5os constructores pueden recibir unos datos para iniciali'ar los
objetos como se desee en cada caso.
5a sinta1is para la creacin de constructor vara con respecto a la de PHP < y #, pues debe llamarse con un
nombre %ijo! FFconstruct(). (.on dos guiones bajos antes de la palabra GconstructG)
A lo largo de los ejemplos de este manual vamos a ir creando un cdigo para gestin de un videoclub.
Hamos a empe'ar de%iniendo una clase cliente, ue utili'aremos luego en nuestro programa.
class cliente{
var $nombre;
var $numero;
var $,eliculas_alquiladas;
function __construct($nombre,$numero){
$t#is$%nombre&$nombre;
$t#is$%numero&$numero;
$t#is$%,eliculas_alquiladas&arra!();
'
function dame_numero(){
return $t#is$%numero;
'
'
El constructor en esta clase recibe el nombre y n/mero ue asignar al cliente, ue introduce luego en sus
correspondientes propiedades. Adem"s iniciali'a el atributo pelculasFaluiladas como un array, en este
caso vaco porue todava no tiene ninguna pelcula en su poder.
Nota: En programacin orientada a objetos 8this hace re%erencia al objeto sobre el ue se est" ejecutando
el m&todo. En este caso, como se trata de un constructor, 8this hace re%erencia al objeto ue se est"
construyendo. 3on 8thisIJnombreA8nombre6 estamos asignando al atributo +nombre, del objeto ue se
est" construyendo el valor ue contiene la variable 8nombre, ue se ha recibido por par"metro.
5uego hemos creado un m&todo muy sencillo para poder utili'ar el objeto. Hamos a ver unas acciones
12
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
simples para ilustrar el proceso de instanciacin y utili'acin de los objetos.
//instanciamos un ,ar de ob/etos cliente
$cliente1 & ne( cliente(Fe,e, 1);
$cliente2 & ne( cliente(Goberto, -43);
//mostramos el numero de cada cliente creado
ec#o )l identificador del cliente 1 es1 " $cliente1$%dame_numero();
ec#o )l identificador del cliente 2 es1 " $cliente2$%dame_numero();
Este ejemplo obtendra esta salida como resultado de su ejecucin!
El identi%icador del cliente @ es! @
El identi%icador del cliente = es! $K#
E1plicacin de los destr(ctores en PHP , ejemplos de '(ncionamiento.
5os destructores son %unciones ue se encargan de reali'ar las tareas ue se necesita ejecutar cuando un
objeto deja de e1istir. 3uando un objeto ya no est" re%erenciado por ninguna variable, deja de tener
sentido ue est& almacenado en la memoria, por tanto, el objeto se debe destruir para liberar su espacio.
En el momento de su destruccin se llama a la %uncin destructor, ue puede reali'ar las tareas ue el
programador estime oportuno reali'ar.
5a creacin del destructor es opcional. .lo debemos crearlo si deseamos hacer alguna cosa cuando un
objeto se elimine de la memoria.
El destructor es como cualuier otro m&todo de la clase, aunue debe declararse con un nombre %ijo!
FFdestruct().
En el cdigo siguiente vamos a ver un destructor en %uncionamiento. Aunue la accin ue reali'a al
destruirse el objeto no es muy /til, nos puede servir bien para ver cmo trabaja.
class cliente{
var $nombre;
var $numero;
var $,eliculas_alquiladas;
11
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
function __construct($nombre,$numero){
$t#is$%nombre&$nombre;
$t#is$%numero&$numero;
$t#is$%,eliculas_alquiladas&arra!();
'
function __destruct(){
ec#o *br%destruido1 " $t#is$%nombre;
'
function dame_numero(){
return $t#is$%numero;
'
'
//instanciamos un ,ar de ob/etos cliente
$cliente1 & ne( cliente(Fe,e, 1);
$cliente2 & ne( cliente(Goberto, -43);
//mostramos el numero de cada cliente creado
ec#o )l identificador del cliente 1 es1 " $cliente1$%dame_numero();
ec#o *br%)l identificador del cliente 2 es1 " $cliente2$%dame_numero();
Este cdigo es igual ue el anterior. .lo se ha a4adido el destructor, ue imprime un mensaje en pantalla
con el nombre del cliente ue se ha destruido. 0ras su ejecucin obtendramos la siguiente salida.
El identi%icador del cliente @ es! @
El identi%icador del cliente = es! $K#
destruido! Pepe
destruido! :oberto
3omo vemos, antes de acabar el script, se libera el espacio en memoria de los objetos, con lo ue se
ejecuta el destructor y aparece el correspondiente mensaje en la p"gina.
(n objeto puede uedar sin re%erencias y por lo tanto ser destruido, por muchas ra'ones. Por ejemplo, el
objeto puede ser una variable local de una %uncin y al %inali'arse la ejecucin de esa %uncin la variable
local dejara de tener valide', con lo ue debe destruirse.
16
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
El cdigo siguiente ilustra cmo una variable local a cualuier "mbito (por ejemplo, local a una %uncin), se
destruye cuando ese "mbito ha %inali'ado.
function crea_cliente_local(){
$cliente_local & ne( cliente(so! local, -);
'
crea_cliente_local()
5a %uncin simplemente crea una variable local ue contiene la instanciacin de un cliente. 3uando la
%uncin se acaba, la variable local deja de e1istir y por lo tanto se llama al destructor de%inido para ese
objeto.
Nota: 0ambi&n podemos deshacernos de un objeto sin necesidad ue acabe el "mbito donde %ue creado.
Para ello tenemos la %uncin unset() ue recibe una variable y la elimina de la memoria. 3uando se pierde
una variable ue contiene un objeto y ese objeto deja de tener re%erencias, se elimina al objeto y se llama al
destructor.
3on los P(blic2 Protected , Pri#ate2 .(e p(eden conocerse por.(e ,a se
(tili4an en otros leng(ajes orientados a objetos.
Heremos en este captulo los nuevos modi%icadores de acceso a los m&todos y atributos de los objetos ue
se han incorporado en PHP $. Estos modi%icadores de acceso no son otros ue los conocidos public,
protected y private, ue ya disponen otros lenguajes como Dava.
(no de los principios de la programacin orientada a objetos es la encapsulacin, ue es un proceso por el
ue se ocultan las caractersticas internas de un objeto a auellos elementos ue no tienen porue
conocerla. 5os modi%icadores de acceso sirven para indicar los permisos ue tendr"n otros objetos para
acceder a sus m&todos y propiedades.
/odi'icador p(blic
Es el nivel de acceso m"s permisivo. .irve para indicar ue el m&todo o atributo de la clase es p/blico. En
este caso se puede acceder a ese atributo, para visuali'arlo o editarlo, por cualuier otro elemento de
nuestro programa. Es el modi%icador ue se aplica si no se indica otra cosa.
Heamos un ejemplo de clase donde hemos declarado como public sus elementos, un m&todo y una
propiedad. .e trata de la clase GdadoG, ue tiene un atributo con su puntuacin y un m&todo para tirar el
dado y obtener una nueva puntuacin aleatoria.
17
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
class dado{
,ublic $,untos;
function __construct(){
srand((double)microtime()H1888888);
'
,ublic function tirate(){
$t#is$%,untos&$randval & rand(1,4);
'
'
$mi_dado & ne( dado();
for ($i&8;$i*28;$i>>){
$mi_dado$%tirate();
ec#o *br%Ian salido " $mi_dado$%,untos " ,untos;
'
Hemos la declaracin de la clase dado y luego unas lneas de cdigo para ilustrar su %uncionamiento. En el
ejemplo se reali'a un bucle <) veces, en las cuales se tira el dado y se muestra la puntuacin ue se ha
obtenido.
3omo el atributo 8puntos y el m&todo tirate() son p/blicos, se puede acceder a ellos desde %uera del
objeto, o lo ue es lo mismo, desde %uera del cdigo de la clase.
/odi'icador pri#ate
Es el nivel de acceso m"s restrictivo. .irve para indicar ue esa variable slo se va a poder acceder desde
el propio objeto, nunca desde %uera. .i intentamos acceder a un m&todo o atributo declarado private desde
%uera del propio objeto, obtendremos un mensaje de error indicando ue no es posible a ese elemento.
.i en el ejemplo anterior hubi&ramos declarado private el m&todo y la propiedad de la clase dado,
hubi&ramos recibido un mensaje de error.
Au tenemos otra posible implementacin de la clase dado, declarando como private el atributo puntos y
el m&todo tirate().
18
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
class dado{
,rivate $,untos;
function __construct(){
srand((double)microtime()H1888888);
'
,rivate function tirate(){
$t#is$%,untos&$randval & rand(1,4);
'
,ublic function dame_nueva_,untuacion(){
$t#is$%tirate();
return $t#is$%,untos;
'
'
$mi_dado & ne( dado();
for ($i&8;$i*28;$i>>){
ec#o *br%Ian salido " $mi_dado$%dame_nueva_,untuacion() " ,untos;
'
Hemos tenido ue crear un nuevo m&todo p/blico para operar con el dado, porue si es todo privado no
hay manera de hacer uso de &l. El mencionado m&todo es dameFnuevaFpuntuacin(), ue reali'a la accin
de tirar el dado y devolver el valor ue ha salido.
/odi'icador protected
Este indica un nivel de acceso medio y un poco m"s especial ue los anteriores. .irve para ue el m&todo
o atributo sea p/blico dentro del cdigo de la propia clase y de cualuier clase ue herede de auella
donde est" el m&todo o propiedad protected. Es privado y no accesible desde cualuier otra parte. Es
decir, un elemento protected es p/blico dentro de la propia clase y en sus heredadas.
C"s adelante e1plicaremos la herencia y podremos o%recer ejemplos con el modi%icador protected.
Concl(sin
19
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
Cuchas veces el propio desarrollador es el ue %ija su criterio a la hora de aplicar los distintos
modi%icadores de acceso a atributos y m&todos. Poca proteccin implica ue los objetos pierdan su
encapsulacin y con ello una de las ventajas de la P**. (na proteccin mayor puede hacer m"s laborioso
de generar el cdigo del programa, pero en general es aconsejable.
E1plicamos la %erencia en PHP 2 (n proceso por el c(al los objetos p(eden
%eredar las caractersticas de otros2 de modo .(e se p(eden %acer objetos
especiali4ados2 basados en otros m;s generales.
5a herencia es uno de los mecanismos %undamentales de la programacin orientada a objetos. Por medio
de la herencia, se pueden de%inir clases a partir de la declaracin de otras clases. 5as clases ue heredan
incluyen tanto los m&todos como las propiedades de la clase a partir de la ue est"n de%inidos.
Por ejemplo, pensemos en la clase GvehculoG. Esta clase general puede incluir las caractersticas generales
de todos los vehculos (atributos de la clase), como la matrcula, a4o de %abricacin y potencia. Adem"s,
incluir" algunas %uncionalidades (m&todos de la clase) como podran ser, arrancar() o moverse().
Ahora bien, en la pr"ctica e1isten varios tipos de vehculos, como los coches, los autobuses y los
camiones. 0odos ellos tienen unas caractersticas comunes, ue han sido de%inidas en la clase vehculo.
Adem"s, tendr"n una serie de caractersticas propias del tipo de vehculo, ue, en principio, no tienen
otros tipos de vehculos. Por ejemplo, los camiones pueden tener una carga m"1ima permitida o los
autobuses un n/mero de pla'as disponibles. 2el mismo modo, las clases m"s espec%icas pueden tener
unas %uncionalidades propias, como los camiones cargar() y descargar(), o los autobuses
aceptarFpasajeros() o venderFbillete().
5o normal en sistemas de herencia es ue las clases ue heredan de otras incluyan nuevas caractersticas
y %uncionalidades, aparte de los atributos y m&todos heredados. Pero esto no es imprescindible, de modo
ue se pueden crear objetos ue hereden de otros y no incluyan nada nuevo.
3inta1is de %erencia en PHP
5a programacin orientada a objetos nos o%rece una serie de mecanismos para de%inir este tipo de
estructuras, de modo ue se puedan crear jeraruas de objetos ue heredan unos de otros. Heremos
ahora cmo de%inir estas estructuras de herencia en PHP $. Para ello, continuando con nuestro ejemplo de
video club, vamos a crear los distintos tipos de elementos ue se o%recen en aluiler.
1:
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
3omo todo el mundo conoce, los video clubs o%recen distintos tipos de elementos para aluiler, como
pueden ser las pelculas (cintas de vdeo o 2H2) y los juegos. 3ada elemento tiene unas caractersticas
propias y algunas comunes. Hemos llamado GsoporteG a la clase general, ue incluye las caractersticas
comunes para todos los tipos de elementos en aluiler. 5uego hemos creado tres tipos de soportes
distintos, ue heredan de la clase soporte, pero ue incluyen algunas caractersticas y %uncionalidades
nuevas. Estos tipos de soporte ser"n GcintaFvideoG, GdvdG y GjuegoG.
El esuema de herencia ue vamos a reali'ar en este ejemplo se puede ver en la siguiente imagen.
Empe'amos por la clase soporte. .u cdigo ser" el siguiente!
class so,orte{
,ublic $titulo;
,rotected $numero;
,rivate $,recio;
function __construct($tit,$num,$,recio){
$t#is$%titulo & $tit;
$t#is$%numero & $num;
$t#is$%,recio & $,recio;
'
,ublic function dame_,recio_sin_iva(){
return $t#is$%,recio;
'
,ublic function dame_,recio_con_iva(){
return $t#is$%,recio H 1"14;
'
1;
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
,ublic function dame_numero_identificacion(){
return $t#is$%numero;
'
,ublic function im,rime_caracteristicas(){
ec#o $t#is$%titulo;
ec#o *br% " $t#is$%,recio " (J=9 no incluido);
'
'
5os atributos ue hemos de%inido son, ttulo, numero (un identi%icador del soporte) y precio. Hemos
aplicado a cada uno un modi%icador de acceso distinto, para poder practicar los distintos tipos de acceso.
Hemos de%inido un constructor, ue recibe los valores para la iniciali'acin del objeto. (n m&todo
dameFprecioFsinFiva(), ue devuelve el precio del soporte, sin aplicarle el LHA. *tro m&todo
dameFprecioFconFiva(), ue devuelve el precio una ve' aplicado el @KM de LHA. El m&todo
dameFnumeroFidenti%icacion(), ue devuelve el n/mero de identi%icador y imprimeFcaracteristicas(), ue
muestra en la p"gina las caractersticas de este soporte.
Nota: 3omo se ha de%inido como private el atributo precio, este atributo slo se podr" acceder dentro del
cdigo de la clase, es decir, en la propia de%inicin del objeto. .i ueremos acceder al precio desde %uera de
la clase (algo muy normal si tenemos en cuenta ue vamos a necesitar el precio de un soporte desde otras
partes de la aplicacin) ser" necesario crear un m&todo ue nos devuelva el valor del precio. Este m&todo
debera de%inirse como public, para ue se pueda acceder desde cualuier sitio ue se necesite.
En todos los m&todos se hace uso de la variable 8this. Esta variable no es m"s ue una re%erencia al
objeto sobre el ue se est" ejecutando el m&todo. En programacin orientada a objetos, para ejecutar
cualuiera de estos m&todos, primero tenemos ue haber creado un objeto a partir de una clase. 5uego
podremos llamar los m&todos de un objeto. Esto se hace con 8miFobjetoIJmetodoFaFllamar(). 2entro de
m&todo, cuando se utili'a la variable 8this, se est" haciendo re%erencia al objeto sobre el ue se ha
llamado al m&todo, en este caso, el objeto 8miFobjeto. 3on 8thisIJtitulo estamos haciendo re%erencia al
atributo GtituloG ue tiene el objeto 8miFobjeto.
.i ueremos probar la clase soporte, para con%irmar ue se ejecuta correctamente y ue o%rece resultados
coherentes, podemos utili'ar un cdigo como el siguiente.
$so,orte1 & ne( so,orte(Kos Jntocables,22,2);
ec#o *b% " $so,orte1$%titulo " */b%;
ec#o *br%Frecio1 " $so,orte1$%dame_,recio_sin_iva() " euros;
ec#o *br%Frecio J=9 incluido1 " $so,orte1$%dame_,recio_con_iva() " euros;
20
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
En este caso hemos creado una instancia de la clase soporte, en un objeto ue hemos llamado 8soporte@.
5uego imprimimos su atributo titulo (como el ttulo ha sido de%inido como public, podemos acceder a &l
desde %uera del cdigo de la clase.
5uego se llaman a los m&todos dameFprecioFsinFiva() y dameFprecioFconFiva() para el objeto creado.
9os dara como resultado esto!
5os Lntocables
Precio! < euros
Precio LHA incluido! <.#? euros
9os atrib(tos o propiedades de los objetos p(eden ser de c(al.(ier tipo2
incl(so p(eden ser otros objetos.
5as caractersticas de los objetos, ue se almacenan por medio de los llamados atributos o propiedades,
pueden ser de diversa naturale'a. 5a clase hombre puede tener distintos tipos de atributos, como la edad
(num&rico), el nombre propio (tipo cadena de caracteres), color de piel (ue puede ser un tipo cadena de
caracteres o tipo enumerado, ue es una especie de variable ue slo puede tomar unos pocos valores
posibles). 0ambi&n puede tener una estatura o un peso (ue podran ser de tipo %loat o n/mero en coma
%lotante).
En general, podemos utili'ar cualuier tipo para los atributos de los objetos, incluso podemos utili'ar otros
objetos. Por ejemplo, podramos de%inir como atributo de la clase hombre sus manos. 2ada la complejidad
de las manos, estas podran de%inirse como otro objeto. Por ejemplo, las manos tendran como
caractersticas la longitud de los dedos, un coe%iciente de elasticidad. 3omo %uncionalidades o m&todos,
podramos de%inir agarrar algo, soltarlo, pegar una bo%etada, o cortarse las u4as.
As pues, uno de los atributos de la clase hombre podra ser un nuevo objeto, con sus propias
caractersticas y %uncionalidades.
5a complejidad de las manos no le importa al desarrollador de la clase hombre, por el principio de
encapsulacin, dado ue este conoce sus propiedades (o auellas declaradas como public) y los m&todos
(tambi&n los ue se hayan decidido declarar como p/blicos) y no necesita preocuparse sobre cmo se han
codi%icado.
21
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
Clase cliente del #ideocl(b
Para continuar el ejemplo del videoclub, hemos creado la clase cliente ue vamos a e1plicar a
continuacin. En los clientes hemos de%inido como atributo, entre otros, las pelculas o juegos aluilados.
Nota:3omo vemos, los objetos pueden tener algunos atributos tambi&n de tipo objeto. En ese caso pueden
haber distintos tipos de relaciones entre objetos. Por ejemplo, por pertenencia, como en el caso de la clase
hombre y sus manos, pues a un hombre le pertenecen sus manos. 0ambi&n se pueden relacionar los objetos
por asociacin, como es el caso de los clientes y las pelculas ue aluilan, pues en ese caso un cliente no
tiene una pelcula propiamente dicha, sino ue se asocia con una pelcula moment"neamente.
5a clase cliente ue hemos creado tiene cierta complejidad, esperamos ue no sea demasiada para ue se
pueda entender %"cilmente. 5a e1plicaremos poco a poco para %acilitar las cosas.
5trib(tos de la clase cliente
Hemos de%inido una serie de atributos para trabajar con los clientes. 0enemos los siguientes!
,ublic $nombre;
,rivate $numero;
,rivate $so,ortes_alquilados;
,rivate $num_so,ortes_alquilados;
,rivate $maB_alquiler_concurrente;
3omo se puede ver, se han de%inido casi todos los atributos como private, con lo ue slo se podr"n
acceder dentro del cdigo de la clase.
El atributo nombre, ue guarda el nombre propio del cliente, es el /nico ue hemos dejado como p/blico y
ue por tanto se podr" re%erenciar desde cualuier parte del programa, incluso desde otras clases. El
atributo numero se utili'a para guardar el identi%icador num&rico del cliente. Por su parte, soportes
aluilados nos servir" para asociar al cliente las pelculas o juegos cuando este las aluile. El atributo
numFsoportesFaluilados almacenar" el n/mero de pelculas o juegos ue un cliente tiene aluilados en
todo momento. Por /ltimo, ma1FaluilerFconcurrente indica el n/mero m"1imo de soportes ue puede
tener aluilados un cliente en un mismo instante, no permiti&ndose aluilar a ese cliente, a la ve', m"s
ue ese n/mero de pelculas o juegos.
El /nico atributo sobre el ue merece la pena llamar la atencin es soportesFaluilados, ue contendr" un
array de soportes. En cada casilla del array se introducir"n las pelculas o juegos ue un cliente vaya
aluilando, para asociar esos soportes al cliente ue las aluil. El array contendr" tantas casillas como el
22
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
ma1FaluilerFconcurrente, puesto ue no tiene sentido asignar mayor espacio al array del ue se va a
utili'ar. Para %acilitar las cosas, cuando un cliente no tiene aluilado nada, tendr" el valor null en las
casillas del array.
Nota::ecordemos ue los soportes %ueron de%inidos en captulos anteriores de este manual de PHP $ ,
mediante un mecanismo de herencia. .oporte era una clase de la ue heredaban las pelculas en 2H2, las
cintas de vdeo y los juegos.
Constr(ctor de la clase cliente
function __construct($nombre,$numero,$maB_alquiler_concurrente&2){
$t#is$%nombre&$nombre;
$t#is$%numero&$numero;
$t#is$%so,ortes_alquilados&arra!();
$t#is$%num_so,ortes_alquilados&8;
$t#is$%maB_alquiler_concurrente & $maB_alquiler_concurrente;
//inicialiLo las casillas del arra! de alquiler a null
//un valor null quiere decir que el no #a! alquiler en esa casilla
for ($i&8;$i*$maB_alquiler_concurrente;$i>>){
$t#is$%so,ortes_alquiladosM$iN&null;
'
'
El constructor de la clase cliente recibe los datos para iniciali'ar el objeto. Estos son 8nombre, 8numero y
8ma1FaluilerFconcurrente. .i nos %ijamos, se ha de%inido por de%ecto a < el n/mero m"1imo de aluileres
ue puede tener un cliente, de modo ue, en el caso de ue la llamada al constructor no enve el
par"metro 8ma1FaluilerFconcurrente se asumir" el valor <.
El atributo soportesFaluilados, como habamos adelantado, ser" un array ue tendr" tantas casillas como
el m"1imo de aluileres concurrentes. En las /ltimas lneas se iniciali'an a null el contenido de las casillas
del array
Contin(acin del artc(lo sobre las propiedades de los objetos.
/0todo dame6n(mero78
function dame_numero(){
return $t#is$%numero;
21
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
'
Este m&todo simplemente devuelve el numero de identi%icacin del cliente. 3omo se ha de%inido el atributo
numero como private, desde %uera del cdigo de la clase, slo se podr" acceder a este a trav&s del m&todo
dameFnumero().
/0todo tiene6al.(ilado7$soporte8
function tiene_alquilado($so,orte){
for ($i&8;$i*$t#is$%maB_alquiler_concurrente;$i>>){
if (Ois_null($t#is$%so,ortes_alquiladosM$iN)){
if ($t#is$%so,ortes_alquiladosM$iN$%dame_numero_identificacion() && $so,orte$
%dame_numero_identificacion()){
return true;
'
'
'
//si esto! aqui es que no tiene alquilado ese so,orte
return false;
'
Este recibe un soporte y devuelve true si est" entre los aluileres del cliente. 2evuelve %alse en caso
contrario.
A este m&todo lo llamamos desde dentro de la clase cliente, en la codi%icacin de otro m&todo. Podramos
haber de%inido entonces el m&todo como private, si pens"semos ue slo lo vamos a utili'ar desde dentro
de esta clase. En este caso lo hemos de%inido como public (el modi%icador por de%ecto) porue pensamos
ue puede ser /til para otras partes del programa.
Este m&todo recibe un soporte (cualuier tipo de soporte, tanto cintas de vdeo, como 2H2s o juegos).
:eali'a un recorrido por el array de soportes aluilados preguntando a cada soporte ue tenga aluilado el
cliente si su n/mero de identi%icacin es igual ue el del soporte recibido por par"metro. 3omo el n/mero
de identi%icacin del soporte est" de%inido como private en la clase soporte, para acceder a su valor
tenemos ue utili'ar el m&todo de soporte dameFnumeroFidenti%icacin().
*tra cosa importante. 3omo no es seguro ue en el array de soportes aluilados haya alg/n soporte
(recordamos ue si el cliente no tiene nada aluilado las casillas est"n a null), antes de llamar a ning/n
m&todo del soporte debemos comprobar ue realmente e1iste. Esto se hace con la %uncin isFnull() a la
26
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
ue le enviamos la casilla del array donde ueremos comprobar si e1iste un soporte. .i la %uncin isFnull()
devuelve true es ue tiene almacenado el valor null, con lo ue sabremos ue no hay soporte. 2e manera
contraria, si la casilla almacena un soporte, la %uncin isFnull() devolver" %alse.
/0todo al.(ila7$soporte8
function alquila($so,orte){
if ($t#is$%tiene_alquilado($so,orte)){
ec#o *,%)l cliente !a tiene alquilado el so,orte *b% " $so,orte$%titulo " */b%;
'elseif ($t#is$%num_so,ortes_alquilados&&$t#is$%maB_alquiler_concurrente){
ec#o *,%)ste cliente tiene " $t#is$%num_so,ortes_alquilados " elementos alquilados" ;
ec#o @o ,uede alquilar mPs en este videoclub #asta que no devuelva al:o;
'else{
//miro en el arra! a ver donde ten:o sitio ,ara meter el so,orte
$cont & 8;
(#ile (Ois_null($t#is$%so,ortes_alquiladosM$contN)){
$cont>>;
'
$t#is$%so,ortes_alquiladosM$contN&$so,orte;
$t#is$%num_so,ortes_alquilados>>;
ec#o *,%*b%9lquilado so,orte a1 */b% " $t#is$%nombre " *br%;
$so,orte$%im,rime_caracteristicas();
'
'
Este m&todo sirve para aluilar una pelcula o juego por parte del cliente. :ecibe el soporte a aluilar y, en
caso ue el aluiler se pueda producir, debe introducir el objeto soporte recibido en el array de soportes
aluilados del cliente.
5o primero ue hace es comprobar ue el cliente no tiene aluilado ese mismo soporte, utili'ando el
m&todo tieneFaluilado() de la clase soporte. .i no lo tiene aluilado comprueba ue todava tiene
capacidad para aluilar otro soporte, es decir, ue no ha llegado al m"1imo en el n/mero de soportes
aluilados.
.i se puede aluilar el soporte, lo introduce dentro del array soportesFaluilados en una posicin vaca
(una casilla donde antes hubiera un null), incrementa en uno el n/mero de soportes aluilados e imprime
las caractersticas del soporte ue se ha aluilado.
27
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
/0todo de#(el#e7$identi'icador6soporte8
function devuelve($identificador_so,orte){
if ($t#is$%num_so,ortes_alquilados&&8){
ec#o *,%)ste cliente no tiene alquilado nin:Qn elemento;
return false;
'
//recorro el arra! a ver si encuentro el so,orte con identificador recibido
for ($i&8;$i*$t#is$%maB_alquiler_concurrente;$i>>){
if (Ois_null($t#is$%so,ortes_alquiladosM$iN)){
if ($t#is$%so,ortes_alquiladosM$iN$%dame_numero_identificacion() && $identificador_so,orte){
ec#o *,%<o,orte devuelto1 " $identificador_so,orte;
ec#o *b% " $t#is$%so,ortes_alquiladosM$iN$%titulo " */b%;
$t#is$%so,ortes_alquiladosM$iN&null;
$t#is$%num_so,ortes_alquilados$$;
return true;
'
'
'
//si esto! aqui es que el cliente no tiene ese so,orte alquilado
ec#o *,%@o se #a ,odido encontrar el so,orte en los alquileres de este cliente;
return false;
'
El m&todo devuelve recibe el identi%icador del soporte ue debe devolver el cliente. 2evuelve true si se
consigui devolver el soporte, %alse en caso contrario. 5o primero ue hace es comprobar si el cliente tiene
aluilado alg/n soporte, comprobando ue la variable numFsoportesFaluilados no sea cero.
5uego hace un recorrido por el array de soportes aluilados para ver si encuentra el soporte ue se desea
devolver. Para cada soporte aluilado (cada casilla del array ue no contenga el valor null) comprueba si el
identi%icador es el mismo ue el recibido por par"metro. 3uando encuentra el soporte, muestra un
mensaje por pantalla y lo devuelve simplemente poniendo a null la casilla correspondiente del array
soportesFaluilados y decrementando en uno el atributo numFsoportesFaluilados.
.i se encuentra el soporte, se sale de la %uncin devolviendo true. Por lo ue, si no se ha salido de la
%uncin despu&s de hacer el recorrido por el array, sabemos ue no se ha encontrado ese soporte.
Entonces mostramos un mensaje en pantalla y devolvemos %alse.
28
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
/0todo lista6al.(ileres78
function lista_alquileres(){
if ($t#is$%num_so,ortes_alquilados&&8){
ec#o *,%)ste cliente no tiene alquilado nin:Qn elemento;
'else{
ec#o *,%*b%)l cliente tiene " $t#is$%num_so,ortes_alquilados " so,ortes alquilados*/b%;
//recorro el arra! ,ara listar los elementos que tiene alquilados
for ($i&8;$i*$t#is$%maB_alquiler_concurrente;$i>>){
if (Ois_null($t#is$%so,ortes_alquiladosM$iN)){
ec#o *,%;
$t#is$%so,ortes_alquiladosM$iN$%im,rime_caracteristicas();
'
'
'
'
Este m&todo hace un recorrido por el array de soportes aluilados y muestra las caractersticas de cada
soporte. 3omprueba ue el cliente tiene algo aluilado antes de hacer el recorrido.
:ecordar siempre, antes de llamar a un m&todo del soporte almacenado en cada casilla del array,
comprobar ue el contenido de esa casilla no es null.
/0todo imprime6caracteristicas78
function im,rime_caracteristicas(){
ec#o *,%*b%Cliente " $t#is$%numero " 1*/b% " $t#is$%nombre;
ec#o *br%9lquileres actuales1 " $t#is$%num_so,ortes_alquilados
'
.implemente muestra algunos de los datos del cliente. Es un m&todo para obtener alg/n dato por pantalla
de un cliente.
Comprobar el '(ncionamiento de la clase cliente
Es importante se4alar ue, para ue la clase cliente %uncione, debe disponer de los cdigos de las distintas
clases de las ue hace uso (la clase soporte, cintaFvideo, juego y dvd). Estos cdigos se pueden haber
escrito en el mismo archivo o bien incluirse con unas instrucciones como estas!
29
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
include so,orte",#,;
include dvd",#,;
include /ue:o",#,;
include cinta_video",#,;
5a clase cliente se puede poner en %uncionamiento, para probar su correcta implementacin, con un cdigo
como este!
//instanciamos un ,ar de ob/etos cliente
$cliente1 & ne( cliente(Fe,e, 1);
$cliente2 & ne( cliente(Goberto, -43);
//mostramos el numero de cada cliente creado
ec#o )l identificador del cliente 1 es1 " $cliente1$%dame_numero();
ec#o *br%)l identificador del cliente 2 es1 " $cliente2$%dame_numero();
//instancio al:unos so,ortes
$so,orte1 & ne( cinta_video(Kos Otros, 1, 2"-, 11- minutos);
$so,orte2 & ne( /ue:o(Ainal Aantas!, 2, 2"-, Fla!station,1,1);
$so,orte2 & ne( dvd(Kos Jntocables, 2, 2, Jn:lEs ! es,aRol,1417);
$so,orte3 & ne( dvd()l Jm,erio Contraataca, 3, 2, Jn:lEs ! es,aRol,1417);
//alquilo al:unos so,ortes
$cliente1$%alquila($so,orte1);
$cliente1$%alquila($so,orte2);
$cliente1$%alquila($so,orte2);
//vo! a intentar alquilar de nuevo un so,orte que !a tiene alquilado
$cliente1$%alquila($so,orte1);
//el cliente tiene 2 so,ortes en alquiler como mPBimo
//este so,orte no lo va a ,oder alquilar
$cliente1$%alquila($so,orte3);
//este so,orte no lo tiene alquilado
$cliente1$%devuelve(3);
//devuelvo un so,orte que sC que tiene alquilado
$cliente1$%devuelve(2);
2:
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
//alquilo otro so,orte
$cliente1$%alquila($so,orte3);
//listo los elementos alquilados
$cliente1$%lista_alquileres();
9a ejec(cin de este cdigo2 si todo '(nciona correctamente2 debera de#ol#ernos como
res(ltado esta salida:
El identi%icador del cliente @ es! @
El identi%icador del cliente = es! $K#
5l.(ilado soporte a! Pepe
Pelcula en HH.!
5os *tros
<.$ (LHA no incluido)
2uracin! @@$ minutos
5l.(ilado soporte a: Pepe
Duego para! Playstation
Ninal Nantasy
=.$ (LHA no incluido)
Para un jugador
5l.(ilado soporte a: Pepe
Pelcula en 2H2!
5os Lntocables
< (LHA no incluido)
Lngl&s y espa4ol
El cliente ya tiene aluilado el soporte 9os Otros
Este cliente tiene < elementos aluilados. 9o puede aluilar m"s en este videoclub hasta ue no devuelva
algo
9o se ha podido encontrar el soporte en los aluileres de este cliente
.oporte devuelto! & <inal <antas,
2;
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
5l.(ilado soporte a: Pepe
Pelcula en 2H2!
El Lmperio 3ontraataca
< (LHA no incluido)
Lngl&s y espa4ol
El cliente tiene ) soportes al.(ilados
Pelcula en HH.!
5os *tros
<.$ (LHA no incluido)
2uracin! @@$ minutos
Pelcula en 2H2!
El Lmperio 3ontraataca
< (LHA no incluido)
Lngl&s y espa4ol
Pelcula en 2H2!
5os Lntocables
< (LHA no incluido)
Lngl&s y espa4ol
Para a'ian4ar los conocimientos sobre programacin orientada a objetos
#amos a concl(ir por a%ora la creacin de n(estro #ideocl(b con PHP.
Para continuar la creacin del videoclub y las e1plicaciones sobre la programacin orientada a objetos
(P**), vamos a programar la clase principal, ue engloba a todas las clases ue hemos ido creando hasta
el momento. 5a clase principal se llama videoclub y modela el comportamiento general del videoclub.
5legado este punto sera bueno ue remarcar dos cosas sobre el desarrollo de programas orientados a
objetos.
@. 5a clase principal de un sistema ue deseamos modelar en P** se suele llamar como el propio
sistema ue estamos modelando. Por ejemplo, si estuvi&ramos creando una biblioteca, la clase
principal se llamara biblioteca. En este caso, ue estamos haciendo un videoclub, la clase principal
se llamar" videoclub.
10
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
=. El proceso de creacin de un programa P** se reali'a al rev&s de como hemos hecho en este
manual, empe'ando el desarrollo de la clase general y %inali'ando por las clases m"s espec%icas.
2e este modo, al crear la clase general, podemos ir viendo u& otros objetos necesitaremos,
cu"les ser"n sus m&todos y propiedades. En este manual lo hemos hecho al rev&s porue nos
vena bien para ir describiendo las caractersticas de la P**.
5a clase videoclub tendr" como propiedades a los soportes en aluiler (pelculas o juegos) y por otra parte,
los socios o clientes ue aluilan los productos. 5os m&todos de la clase videoclub ser"n la inclusin y
listado de soportes en aluiler y de socios, el aluiler de soportes por parte de clientes.
Nota:9i ue decir tiene ue el videoclub ue estamos creando est" simpli%icado al m"1imo. Est" claro ue si
estuvi&semos creando un videoclub con el propsito de utili'arlo en produccin, habra ue pensar y
desarrollar muchas otras %uncionalidades.
Hamos ya con el cdigo y sus e1plicaciones.
5trib(tos de la clase #ideocl(b
,ublic $nombre;
,rivate $,roductos;
,rivate $num_,roductos;
,rivate $socios;
,rivate $num_socios;
El atributo 8productos ser" un array con los distintos soportes en aluiler. 8numFproductos lo utili'aremos
para llevar la cuenta del n/mero de productos ue tenemos disponibles. 2e modo similar, 8socios ser" un
array de clientes y 8numFsocios llevar" la cuenta de los socios ue tenemos dados de alta. Aparte, nuestro
videoclub tendr" un nombre, ue almacenaremos en la variable 8nombre.
Constr(ctor
function __construct($nombre){
$t#is$%nombre&$nombre;
$t#is$%,roductos&arra!();
$t#is$%num_,roductos&8;
$t#is$%socios&arra!();
$t#is$%num_socios&8;
'
11
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
Este m&todo iniciali'ar" los atributos del objeto ue se est" construyendo. :ecibe /nicamente el nombre
del videoclub. 3omo tareas destacables est"n las iniciali'aciones de los arrays de productos y socios y la
puesta a cero de los contadores ue vamos a utili'ar.
/0todo incl(ir6prod(cto78
,rivate function incluir_,roducto($nuevo_,roducto){
$t#is$%,roductosM$t#is$%num_,roductosN&$nuevo_,roducto;
ec#o *,%Jncluido so,orte " $t#is$%num_,roductos;
$t#is$%num_,roductos>>;
'
Este m&todo ha sido declarado como private, porue slo ueremos ue se llame desde dentro de la clase.
:ecibe el nuevo producto ue se uiere dar de alta y lo guardar en el array de productos, en la posicin
marcada por el atributo numFproductos. 5uego muestra un mensaje por pantalla y por /ltimo incrementa
a uno el atributo numFproductos.
/0todos incl(ir6d#d782incl(ir6cinta6#ideo78 e incl(ir6j(ego78
5os tres siguientes m&todos ue vamos a ver, instancian los tres productos con los ue trabaja el videoclub
y luego los introducen en array de productos llamando a incluirFproducto().
function incluir_dvd($tit,$,recio,$idiomas,$,antalla){
$dvd_nuevo & ne( dvd($tit, $t#is$%num_,roductos, $,recio, $idiomas, $,antalla);
$t#is$%incluir_,roducto($dvd_nuevo);
'
function incluir_cinta_video($tit,$,recio,$duracion){
$cinta_video_nueva & ne( cinta_video($tit, $t#is$%num_,roductos, $,recio, $duracion);
$t#is$%incluir_,roducto($cinta_video_nueva);
'
function incluir_/ue:o($tit,$,recio,$consola,$min_/,$maB_/){
$/ue:o_nuevo & ne( /ue:o($tit, $t#is$%num_,roductos, $,recio, $consola, $min_/, $maB_/);
$t#is$%incluir_,roducto($/ue:o_nuevo);
'
Podemos %ijarnos ue el n/mero de identi%icacin del soporte, ue recibe el constructor de las cintas de
12
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
vdeo, 2H2s o juegos, lo generamos por medio del atributo de la clase de videclub numFproductos, ue
guarda el n/mero de productos dados de alta.
/0todo incl(ir6socio78
Este m&todo hace las tareas de instanciacin del socio nuevo y su inclusin en el array de socios.
function incluir_socio($nombre,$maB_alquiler_concurrente&2){
$socio_nuevo & ne( cliente($nombre,$t#is$%num_socios,$maB_alquiler_concurrente);
$t#is$%sociosM$t#is$%num_sociosN&$socio_nuevo;
ec#o *,%Jncluido socio " $t#is$%num_socios;
$t#is$%num_socios>>;
'
:eciben los datos del nuevo socio! nombre y el m"1imo n/mero de pelculas ue puede aluilar (siendo <
el valor por de%ecto). (na ve' instanciado el nuevo socio, lo introduce en el array, en la posicin marcada
por el atributo numFsocios. 5uego muestran un mensaje por pantalla y por /ltimo incrementan a uno los
atributos numFproductos o numFsocios.
El n/mero de socio, ue recibe entre otros par"metros, el constructor de la clase socio lo generamos por
medio del contador de socios numFsocios, de la clase videclub.
/0todos listar6prod(ctos78 , listar6socios78
2os m&todos muy similares, ue veremos de una sola ve'.
function listar_,roductos(){
ec#o *,%Kistado de los " $t#is$%num_,roductos " ,roductos dis,onibles1;
for ($i&8;$i*$t#is$%num_,roductos;$i>>){
ec#o *,%;
$t#is$%,roductosM$iN$%im,rime_caracteristicas();
'
'
function listar_socios(){
ec#o *,%Kistado de $t#is$%num_socios socios del videoclub1;
for ($i&8;$i*$t#is$%num_socios;$i>>){
ec#o *,%;
11
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
$t#is$%sociosM$iN$%im,rime_caracteristicas();
'
'
Estos m&todos imprimen un listado completo de los socios y productos dados de alta. .implemente hacen
un recorrido del array de productos o de socios y van imprimiendo sus caractersticas.
/0todo al.(ila6a6socio78
:eali'a las acciones necesarias para aluiler un producto a un socio.
function alquila_a_socio($numero_socio,$numero_,roducto){
if (is_null($t#is$%sociosM$numero_socioN)){
ec#o *,%@o eBiste ese socio;
'elseif(is_null($t#is$%,roductosM$numero_,roductoN)){
ec#o *,%@o eBiste ese so,orte;
'else{
$t#is$%sociosM$numero_socioN$%alquila($t#is$%,roductosM$numero_,roductoN);
'
'
Este m&todo recibe el identi%icador del socio y del producto en aluiler. Antes de proceder, reali'a un par
de comprobaciones. 5a primera para ver si e1iste un socio con el n/mero de socio indicado por par"metro
y la segunda para ver si tambi&n e1iste un producto con el n/mero de producto dado.
.i todo %ue bien, llama al m&todo aluila() del socio, envi"ndole el producto ue desea aluilar.
Nota:El m&todo aluila() del socio tiene cierta complejidad, pero ya la vimos cuando e1plicamos la clase
socio. En este momento, por el principio de encapsulacin de la P**, debemos abstraernos de su di%icultad y
no prestarle atencin porue sabemos ue %unciona y no nos debe preocupar cmo lo hace.
Para probar la clase videoclub podramos utili'ar un cdigo como este!
$vc & ne( videoclub(Ka )liana =ideo);
//vo! a incluir unos cuantos so,ortes de ,rueba
$vc$%incluir_/ue:o(Ainal Aantas!, 2"-, Fla!station,1,1);
$vc$%incluir_/ue:o(SF ?otoracer, 2, Fla!station JJ,1,2);
$vc$%incluir_dvd(Kos Otros, 3"-, Jn:lEs ! es,aRol,1417);
$vc$%incluir_dvd(Ciudad de TiDs, 2, Fortu:uEs, in:lEs ! es,aRol,1417);
$vc$%incluir_dvd(Kos Fica,iedra, 2, )s,aRol,1417);
16
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
$vc$%incluir_cinta_video(Kos Otros, 3"-, 11- minutos);
$vc$%incluir_cinta_video()l nombre de la Gosa, 1"-, 138 minutos);
//listo los ,roductos
$vc$%listar_,roductos();
//vo! a crear al:unos socios
$vc$%incluir_socio(UosE Auentes);
$vc$%incluir_socio(Fedro SarcCa,2);
$vc$%alquila_a_socio(1,2);
$vc$%alquila_a_socio(1,2);
//alquilo otra veL el so,orte 2 al socio 1"
// no debe de/arme ,orque !a lo tiene alquilado
$vc$%alquila_a_socio(1,2);
//alquilo el so,orte 4 al socio 1"
//no se ,uede ,orque el socio 1 tiene 2 alquileres como mPBimo
$vc$%alquila_a_socio(1,4);
//listo los socios
$vc$%listar_socios();
.e hace una carga de datos y una llamada a todos los m&todos ue hemos visto para el videoclub. Este
cdigo dar" como resultado una salida como la siguiente!
Lncluido soporte )
Lncluido soporte @
Lncluido soporte =
Lncluido soporte <
Lncluido soporte #
Lncluido soporte $
Lncluido soporte K
17
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
5istado de los > productos disponibles!
Duego para! Playstation
Ninal Nantasy
=.$ (LHA no incluido)
Para un jugador
Duego para! Playstation LL
OP Cotoracer
< (LHA no incluido)
2e @ a = Dugadores.
Pelcula en 2H2!
5os *tros
#.$ (LHA no incluido)
Lngl&s y espa4ol
Pelcula en 2H2!
3iudad de 2is
< (LHA no incluido)
Portugu&s, ingl&s y espa4ol
Pelcula en 2H2!
5os Picapiedra
< (LHA no incluido)
Espa4ol
Pelcula en HH.!
5os *tros
#.$ (LHA no incluido)
2uracin! @@$ minutos
Pelcula en HH.!
El nombre de la :osa
@.$ (LHA no incluido)
2uracin! @#) minutos
18
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
Lncluido socio )
Lncluido socio @
5l.(ilado soporte a: Pedro Oarca
Pelcula en 2H2!
5os *tros
#.$ (LHA no incluido)
Lngl&s y espa4ol
5l.(ilado soporte a: Pedro Oarca
Pelcula en 2H2!
3iudad de 2is
< (LHA no incluido)
Portugu&s, ingl&s y espa4ol
El cliente ya tiene aluilado el soporte 9os Otros
Este cliente tiene = elementos aluilados. 9o puede aluilar m"s en este videoclub hasta ue no devuelva
algo
5istado de = socios del videoclub!
Cliente =: Dos& Nuentes
Aluileres actuales! )
Cliente ": Pedro Oarca
Aluileres actuales! =
Hasta au ha llegado por ahora el desarrollo de este videoclub, ue no es muy %uncional pero esperamos
ue haya servido para empe'ar a conocer las caractersticas de la programacin orientada a objetos.
En adelante, seguiremos este manual comentando otras particularidades de la P** en PHP $, ue tambi&n
hay ue conocer.
19
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
Orientacin a objetos a#an4ada
Heremos a continuacin algunos conceptos, ya m"s avan'ados, de la programacin orientada a objetos en
PHP $, como son las clases y m&todos abstractos y las inter%aces.
Conoceremos lo .(e es (na clase abstracta , los m0todos abstractos. Cmo se
de'inen , en .(0 sit(aciones se deben (tili4ar.
(na clase abstracta es la ue tiene m&todos abstractos. 5os m&todos abstractos son los ue est"n
declarados en una clase, pero no se ha de%inido en la clase el cdigo de esos m&todos.
Esa puede ser una buena de%inicin de clases y m&todos abstractos, pero veamos con calma una
e1plicacin un poco m"s detallada y comprensible por todos.
En ocasiones, en un sistema de herencia como el de la programacin orientada a objetos (P**), tenemos
entidades ue declarar aunue no se puede dar su de%inicin todava, simplemente las deseamos de%inir
por encima para empe'ar una jerarua de clases.
Pensemos en los productos l"cteos (los derivados de la leche). 9o cabe duda ue los productos l"cteos son
una gran %amilia. Lncluyen a los yogures, manteuillas, uesos, helados e incluso a la propia leche. .in
embargo, los productos l"cteos en si no se encuentran en la vida real. En el supermercado no te venden
un producto l"cteo en general. Por ejemplo, nadie compra un Pilo de producto l"cteo... m"s bien
preguntar"n por un litro de leche, un litro de helado o un pacP de yogures.
0odos los productos l"cteos tienen algunas caractersticas comunes, como el porcentaje en leche o la %echa
de caducidad. 0ambi&n tienen algunas %uncionalidades comunes como conservarse o consumirse. .in
embargo, la manera de conservarse es distinta dependiendo del producto l"cteo. 5a leche se conserva
%uera de la nevera, mientras ue no est& abierto el bricP, y los yogures deben conservarse en la nevera en
todo momento. 5os uesos se conservan en la nevera, pero metidos dentro de un recipiente por si acaso
desprenden olores %uertes. Por lo ue respecta a los helados, se deben conservar en el congelador,
siempre ue deseemos ue no se conviertan en luido. Al consumir un producto l"cteo la cosa tambi&n
cambia, puesto ue el ueso se suele acompa4ar con pan o tostadas, la leche se bebe y el helado se toma
con cuchara.
En de%initiva, a donde ueremos demostrar es ue podemos tener un conjunto de objetos ue tienen unas
caractersticas comunes y %uncionalidades, tambi&n comunes, pero ue di%ieren en la manera de llevarlas a
cabo. Para esto est" la abstraccin.
1:
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
5a clase de los productos l"cteos, tendr" una serie de propiedades y unos m&todos abstractos. 5os
m&todos abstractos, como habamos adelantado, son auellos ue no incluyen una codi%icacin, sino ue
simplemente se declaran, dejando para las clases ue hereden la tarea de codi%icarlos.
En este caso, la clase producto l"cteo tendr" los m&todos abstractos conservarse() y consumirse(), pero
no se especi%icar" el cdigo %uente de estos m&todos (por eso son abstractos). 5as clases ue hereden de
producto l"cteo ser"n las encargadas de de%inir un cdigo para los m&todos de%inidos como abstractos en
la clase padre. As, cada clase ue herede de producto l"cteo, deber" especi%icar el mecanismo concreto y
espec%ico por el cual se van a conservar o consumir.
5as clases ue incorporan m&todos abstractos se deben declarar como abstractas. Es una condicin
%or'osa. 5as clases abstractas no se pueden instanciar. Es decir, no podemos crear objetos a partir de ellas.
Es algo lgico. Pensemos en los productos l"cteos, estos no e1isten m"s ue como una idea general. .lo
podremos encontrar productos l"cteos de un tipo en concreto, como leche o yogur, pero no la idea de
producto l"cteo en general.
(na clase ue herede de un producto l"cteo debe de%inir los m&todos abstractos declarados en la clase
abstracta. 2e lo contrario, la clase ue hereda estara obligada a declararse como abstracta.
En nuestro ejemplo de videoclub, tratado a lo largo de los distintos captulos del manual de PHP $,
tenemos una clase ue tambi&n sera un buen ejemplo de clase abstracta. .e trata de la clase soporte. 2e
esta clase heredaban los distintos productos del videoclub, como pelculas en 2H2, cintas de vdeo o
juegos. 9o hubiera sido mala idea declarar como abstracta la clase soporte, dado ue no se van a utili'ar,
ni e1isten, soportes en general, sino ue lo ue e1isten son los distintos soportes concretos.
9a sinta1is de la abstraccin
Para declarar clases y m&todos abstractos se utili'a la siguiente sinta1is.
abstract class nombre_clase{
//,ro,iedades
,ublic B;
,rivate !;
//mEtodos
1;
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
,ublic function __construct(){
V
'
,ublic abstract function nombre_metodo();
'
9os %ijamos ue se utili'a la palabra clave GabstractG para de%inir las clases o m&todos abstractos. Adem"s,
los m&todos abstractos no llevan ning/n cdigo asociado, ni siuiera las llaves para abrir y cerrar el
m&todo.
Vemos lo .(e son las inter'aces2 para .(0 se (tili4an , cmo trabajar con ellas
en PHP.
5as inter%aces son un sistema bastante com/n, utili'ado en programacin orientada a objetos. .on algo as
como declaraciones de %uncionalidades ue tienen ue cubrir las clases ue implementan las inter%aces.
En una inter%a' se de%inen habitualmente un juego de %unciones ue deben codi%icar las clases ue
implementan dicha inter%a'. 2e modo ue, cuando una clase implementa una inter%a', podremos estar
seguros ue en su cdigo est"n de%inidas las %unciones ue inclua esa inter%a'.
A la hora de programar un sistema, podemos contar con objetos ue son muy di%erentes y ue por tanto
no pertenecen a la misma jerarua de herencia, pero ue deben reali'ar algunas acciones comunes. Por
ejemplo, todos los objetos con los ue comercia unos grandes almacenes deben contar con la
%uncionalidad de venderse. (na mesa tiene poco en com/n con un cale%actor o unas 'apatillas, pero todos
los productos disponibles deben implementar una %uncin para poder venderse.
*tro ejemplo. (na bombilla, un coche y un ordenador son clases muy distintas ue no pertenecen al
mismo sistema de herencia, pero todas pueden encenderse y apagarse. En este caso, podramos construir
una inter%a' llamada GencendibleG, ue incluira las %uncionalidades de encender y apagar. En este caso, la
inter%a' contendra dos %unciones o m&todos, uno encender() y otro apagar().
3uando se de%ine una inter%a', se declaran una serie de m&todos o %unciones sin especi%icar ning/n cdigo
%uente asociado. 5uego, las clases ue implementen esa inter%a' ser"n las encargadas de proporcionar un
cdigo a los m&todos ue contiene esa inter%a'. Esto es seguro! si una clase implementa una inter%a',
debera declarar todos los m&todos de la inter%a'. .i no tenemos cdigo %uente para alguno de esos
60
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
m&todos, por lo menos debemos declararlos como abstractos y, por tanto, la clase tambi&n tendr" ue
declararse como abstracta, porue tiene m&todos abstractos.
Cdigo para de'inir (na inter'a4
Heamos el cdigo para reali'ar una inter%a'. En concreto veremos el cdigo de la inter%a' encendible, ue
tienen ue implementar todas las clases cuyos objetos se puedan encender y apagar.
interface encendible{
,ublic function encender();
,ublic function a,a:ar();
'
Hemos ue para de%inir una inter%a' se utili'a la palabra clave inter%ace, seguida por el nombre de la
inter%a' y, entre llaves, el listado de m&todos ue tendr". 5os m&todos no se deben codi%icar, sino
/nicamente declararse.
Implementacin de inter'aces
Ahora veamos el cdigo para implementar una inter%a' en una clase.
class bombilla im,lements encendible{
,ublic function encender(){
ec#o *br%W la luL se #iLo""";
'
,ublic function a,a:ar(){
ec#o *br%)stamos a oscuras""";
'
'
Para implementar una inter%a', en la declaracin de la clase, se debe utili'ar la palabra implements,
seguida del nombre de la inter%a' ue se va a implementar. .e podran implementar varias inter%aces en la
misma clase, en cuyo caso se indicaran todos los nombres de las inter%aces separadas por comas.
En el cdigo de la clase estamos obligados a declarar y codi%icar todos los m&todos de la inter%a'.
Nota: en concreto, PHP $ entiende ue si una clase implementa una inter%a', los m&todos de esa inter%a'
estar"n siempre en la clase, aunue no se declaren. 2e modo ue si no los declaramos e1plcitamente, PHP
$ lo har" por nosotros. Esos m&todos de la inter%a' ser"n abstractos, as ue la clase tendr" ue de%inirse
como abstracta. .e puede encontrar m"s in%ormacin sobre la abstraccin en el artculo C&todos y clases
abstractos en PHP $.
61
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
Ahora veamos el cdigo de la clase coche, ue tambi&n implementa la inter%a' encendible. Este cdigo lo
hemos complicado un poco m"s.
class coc#e im,lements encendible{
,rivate $:asolina;
,rivate $bateria;
,rivate $estado & a,a:ado;
function __construct(){
$t#is$%:asolina & 8;
$t#is$%bateria & 18;
'
,ublic function encender(){
if ($t#is$%estado && a,a:ado){
if ($t#is$%bateria % 8){
if ($t#is$%:asolina % 8){
$t#is$%estado & encendido;
$t#is$%bateria $$;
ec#o *br%*b%)nciendo"""*/b% esto! encendidoO;
'else{
ec#o *br%@o ten:o :asolina;
'
'else{
ec#o *br%@o ten:o baterCa;
'
'else{
ec#o *br%Wa estaba encendido;
'
'
,ublic function a,a:ar(){
if ($t#is$%estado && encendido){
$t#is$%estado & a,a:ado;
ec#o *br%*b%9,a:o"""*/b% esto! a,a:adoO;
'else{
ec#o *br%Wa estaba a,a:ado;
'
62
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
'
,ublic function car:ar_:asolina($litros){
$t#is$%:asolina >& $litros;
ec#o *br%Car:ados $litros litros;
'
'
A la vista del anterior cdigo, se puede comprobar ue no hay mucho en com/n entre las clases bombilla y
coche. El cdigo para encender una bombilla era muy simple, pero para poner en marcha un coche
tenemos ue reali'ar otras tareas. Antes tenemos ue ver si el coche estaba encendido previamente, si
tiene gasolina y si tiene batera. Por su parte, el m&todo apagar hace una /nica comprobacin para ver si
estaba o no el coche apagado previamente.
0ambi&n hemos incorporado un constructor ue iniciali'a los atributos del objeto. 3uando se construye un
coche, la batera est" llena, pero el depsito de gasolina est" vaco. Para llenar el depsito simplemente se
debe utili'ar el m&todo cargarFgasolina().
9lamadas polimr'icas pasando objetos .(e implementan (na inter'a4
5as inter%aces permiten el tratamiento de objetos sin necesidad de conocer las caractersticas internas de
ese objeto y sin importar de u& tipo son... simplemente tenemos ue saber ue el objeto implementa una
inter%a'.
Por ejemplo, tanto los coches como las bombillas se pueden encender y apagar. As pues, podemos llamar
al m&todo encender() o apagar(), sin importarnos si es un coche o una bombilla lo ue hay ue poner en
marcha o detener.
En la declaracin de una %uncin podemos especi%icar ue el par"metro de%inido implementa una inter%a',
de modo ue dentro de la %uncin, se pueden reali'ar acciones teniendo en cuenta ue el par"metro
recibido implementa un juego de %unciones determinado.
Por ejemplo, podramos de%inir una %uncin ue recibe algo por par"metro y lo enciende. Especi%icaremos
ue ese algo ue recibe debe de implementar la inter%a' encendible, as podremos llamar a sus m&todos
enciende() o apaga() con la seguridad de saber ue e1isten.
function enciende_al:o (encendible $al:o){
$al:o$%encender();
'
61
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
$mibombilla & ne( bombilla();
$micoc#e & ne( coc#e();
enciende_al:o($mibombilla);
enciende_al:o($micoc#e);
.i tuvi&ramos una clase ue no implementa la inter%a' encendible, la llamada a esta %uncin provocara un
error. Por ejemplo, un 32I:om no se puede encender ni apagar.
class cd{
,ublic $es,acio;
'
$micd & ne( cd();
enciende_al:o($micd); //da un error" cd no im,lementa la interfaL encendible
Esto nos dara un error como este! Natal error! Argument @ must implement inter%ace encendible in
c!QBBBQejphp$Q%uncionFencender.php on line K. ;ueda muy claro ue deberamos implementar la inter%a'
encendible en la clase cd para ue la llamada a la %uncin se ejecute correctamente.
66
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
Otros as(ntos relacionados con la programacin en PHP
A modo de eplogo presentamos algunos artculos directamente relacionados con la versin $ de PHP.
Ahora bien, cabe recordar ue en 2esarrolloReb.com tenemos en la seccin Conotem"ticos-PHP muchos
otros manuales y talleres para seguir aprendiendo PHP $.
5 m;s de dos a>os de la llegada de la #ersin de PHP2 a?n la com(nidad de
desarrolladores de PHP se plantea el interrogante.
5as dudas b"sicamente circulan siempre el mismo camino, y ambas elecciones tienen sus ventajas y
desventajas. Lntentaremos en este in%orme orientar a los desarrolladores a decidirse por una u otra
alternativa.
Es importante remarcar antes de ubicarse de lleno en el an"lisis de las ventajas y desventajas de una u
otra opcin, las principales di%erencias e1istentes entre ambas versiones, cuales son los cambios ue
repercuten m"s %uertemente en la compatibilidad de los scripts, y ue es lo ue nos depara el %uturo en
toda esta historia.
Cambios profundos
5a llegada de PHP$ vino emparejada de una reestructuracin del 3ore de PHP, lo ue los creadores de PHP
llama Send Engine.
As como el lejano PHP< incluye su Send Engine ).$, y PHP# el Send Engine @.), tenemos Send Engine =.)
en PHP$. El cambio de versin no %ue trivial6 incluye la reescritura casi total del modelo de objetos, entre
sus cambios m"s sustanciales.
Esto repercute directamente en los scripts de PHP# ue utili'an clases, tanto en la compatibilidad como en
per%ormance de ejecucin. Posteriormente en este artculo nos re%eriremos nuevamente a este tema.
Heamos un ejemplo ue nos muestra un cambio sustancial en la implementacin del modelo de objetos!
*+
class Fersona {
function set@ombre($nombre) {
$t#is$%nombre & $nombre;
'
function :et@ombre() {
return $t#is$%nombre;
'
67
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
'
function 9l:o($,) {
$,ersona$%set@ombre(Taniel);
'
1 $,ersona & ne( Fersona();
2 $,ersona$%set@ombre(Fic#on:ol);
2 9l:o($,ersona);
3 ec#o $,ersona$%:et@ombre();
+%
Cul es el problema en este cdigo corriendo en PHP4?
En la lnea @ instanciamos un objeto de la clase Persona.
5uego le decimos ue se llama 2aniel.
El error de implementacin viene con la lnea <. El argumento 8p ue recibe Algo, no es mas ue una
copia de 8persona, y eso esta CA5. TPorueU, mnimamente por = ra'ones.
5a primera ra'n es ue esta estrategia es P**I9o compatible. 3laramente cuando hablamos del
Paradigma *rientado a *bjetos, estamos casi descartando ue cada objeto sea re%erenciado por su
Ldenti%icador.
.in embargo, el Send Engine @.) no est" preparado para dicha accin!
*+
function e/em,lo($val){
ec#o $val;
'
$cadena & teBto;
e/em,lo($cadena);
+%
5a variable 8cadena pasada como argumento a la %uncin ejemplo, es copiada para su uso local dentro de
dicha %uncin. Es lo ue se conoce como paso de par"metros por valor.
El Send Engine @.) hace e1actamente esto para todas las %unciones, inclusive para las ue est"n dentro de
una clase, las cuales en ese caso act/an como m&todos!
*+
function 9l:o($,ersona) {
$,ersona$%set@ombre(Taniel);
68
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
'
+%,
Holviendo al ejemplo inicial de la clase persona, el m&todo Algo recibe una copia (un clon) del objeto
Persona.
5a segunda ra'n viene emparejada con la primera, siendo consecuencia de esta.
3ualuier modi%icacin del objeto Persona ue se produ'ca dentro del m&todo Algo, solo tendr" alcance
local, y no se ver" re%lejado cuando la %uncin retorne.
*+
9l:o($,ersona);
ec#o $,ersona$%:et@ombre();
+%
En ese caso la modi%icacin del nombre ue hace la %uncin Algo al objeto Persona no se ve re%lejada
cuando hacemos echo 8personaIJget9ombre().
En nuestro broBser veremos GPichongolG.
Este es solo un ejemplo del porue de la reestructuracin tan importante en el 3ore de PHP. Es claro ue
toda reestructuracin barre con cuestiones de compatibilidad, para ganar en otros sPills6 en este caso
claramente estamos ganando en per%ormance, al liberarnos del overhead ue implica la constante copia de
objetos ue son argumentos de m&todos y %unciones.
En artculos posteriores trataremos en mayor detalle y pro%undidad los distintos aspectos ue %ueron
modi%icados, haciendo una comparativa entre como se logran en PHP# y como se logran en PHP$. Adem"s
de e1plicar pro%undamente las di%erencias en el modelo de objetos nos uedan temas pendientes como
*pciones de con%iguracin (php.ini), 3one1in a Cy.;5 (mysli), cambios en los mdulos, etc.
Hecha esta introduccin, estamos en condiciones de de%inir las distintas situaciones en las ue se puede
encontrar el desarrollador, y ue aspectos juegan a su %avor o en contra seg/n la situacin en la ue se
encuentre.
Cual es mi escenario?
En el momento de plantearse la pregunta, el desarrollador seguramente se ubicar" en alguno de los dos
escenarios posibles!
G 9eBbie (Lniciacin en PHP).
G E1perimentado.
Ne$bie
69
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
En el planteo de esta discusin, podramos decir ue es la situacin ideal, o por lo menos la m"s
bene%iciosa. .i eres una persona ue uiere arrancar en PHP, no lo dudes, PHP$ es para ti. 0us aplicaciones
go'aran de las nuevas capacidades en **P, obtendr"s el bene%icio de una mejor per%ormance de ejecucin
(esta comprobado e1perimentalmente ue PHP$ corre un =$M m"s r"pido ue PHP#) y tu cdigo estar"
muy bien acondicionado en cuanto a la compatibilidad con el nuevo hijo ue asoma! PHPK.
Por cierto, no todo es color de rosas. (na de los mayores bene%icios a la hora de elegir PHP para trabajar
en nuestro proyecto es la gran cantidad de cdigo ue podemos encontrar en Lnternet, y utili'arlo para
nuestros trabajos. 0enemos una gran probabilidad de ue ante alguna tarea ue se nos plantea, podamos
encontrar alg/n script ue nos solucione la vida, obviamente adapt"ndolo a nuestras necesidades.
Ahora bien, no todo el cdigo ue vamos a encontrar es compatible con PHP$. 2e hecho la gran mayora
todava no se ha adaptado. Es cierto ue con alg/n setting en nuestro php.ini podemos ayudar a darle
mayor compatibilidad, pero como contrapartida muchas de estas settings se eliminaran en PHPK.
T;u& uedaU Hacerlo compatible modi%icando el cdigo, una tarea ue para un desarrollador ue se inicia
no siempre es sencillo. 2e todas %ormas a no alarmarse, ue los grandes proyectos (PHP9uPe, PHP77,
etc.) o%recen compatibilidad.
%&perimentado
En este caso, el optar por uedarse con PHP# o pasar a PHP$ depende de nuestra aplicacin.
5as interrogantes ue el desarrollador se puede plantear podran ser!
I TCi aplicacin usa clases y objetosU
I TCi motor de 7ase de datos es Cy.;5U
I T(tili'o un hosting e1ternoU
I TCi aplicacin su%re modi%icaciones en cuanto a los reuerimientos y lgica de negociosU
Pasemos a discutir ventajas y desventajas en cada uno de los interrogantes!
!i aplicacin usa clases ' ob"etos?
3omo pudimos comprender al comien'o de este articulo, uno de los principales es%uer'os de los
dise4adores del Send Engine radic en el mejoramiento del modelo de objetos, bas"ndose claramente en
un re%erente indiscutible en esta materia como lo es .un. .alvando las di%erencias, se han tomado muchas
cosas de Dava, desde convenciones de nomenclaturas hasta estrategias de implementacin.
.eria un desperdicio no utili'ar dicho es%uer'o, sobre todo si nuestra aplicacin hace un uso e1haustivo de
clases y objetos.
!i motor de (ase de datos es !')*+?
A di%erencia de la estrategia de PHP# para la conectividad PHP-Cy.;5, en la ue el 3ore de PHP nos
provee de un set de %unciones para dicha interaccin, en PHP$ Cy.;5 nos provee de un APL e1terno.
6:
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
7"sicamente, la ra'n de este cambio %ue una modi%icacin de licencia de Cy.;5, ue obligo a PHP a hacer
de Cy.;5 una base de datos m"s, y no G5AG base de datos, como venia siendo en PHP< y PHP#.
2e todas %ormas, esto no repercute en nuestro cdigo, sino en la per%ormance de nuestra aplicacin.
El hecho de ue una e1tensin no %orme parte del 3ore de PHP y pase a ser e1terna nos genera un
overhead, una sobrecarga de ejecucin en detrimento de la per%ormance.
3omo contrapartida, PHP$ nos da la posibilidad de sacarle el mayor jugo posible a las muchas mejoras
incorporadas en Cy.;5 #.@.< o superior, a trav&s del APL mysli.
Esto implica hacer uso de otras %unciones, modi%icando nuestro cdigo.
Ahora bien, Tue tan costosa es esta reescrituraU 2epender" de nuestra estrategia de cone1in a base de
datos. T(tili'amos una capa de abstraccin del estilo A2*db U .i la utili'amos estaremos mucho mejor
parados %rente a tal reescritura. En caso contrario el tiempo invertido ser" sensiblemente mayor.
,tili-o un .osting e&terno?
En caso de no disponer de un hosting propio, y tener ue depender de un hosting e1terno ue nos provea
de PHP, seguramente el hecho de pensar en migrar a PHP$ puede ser un problema. 2e hecho, estadsticas
de principio de =))K nos indican ue solo alrededor del $M de los hosting ue proporcionan PHP, tienen
PHP$.
Esto no hace mas ue re%lejar la lentitud con la ue se esta moviendo el proceso de traspaso de PHP#
hacia PHP$.
(na pregunta ue surge directamente sobre este tema es TPor u&U
7ueno, si uno tomo una distribucin de 5inu1, es poco probable ue la versin de PHP$ sea la incluida.
5a con%ormidad de los programadores con PHP# es grande, y mucha de la documentacin e1istente esta
escrita para PHP#.
2e todas %ormas, a no dormirse con PHP#. (n tema ue se trata en la segunda parte de este artculo es lo
nuevo ue nos trae PHPK. Heremos ue PHP$ en muchos aspectos es una transicin mientras ue la
con%irmacin se llama PHPK.
!i aplicacin sufre modificaciones en cuanto a los re/uerimientos ' lgica de negocios?
3uando las aplicaciones tienen reuerimientos de cliente bastante cambiantes, y se emplean recursos para
su mantenimiento, o utili'amos una metodologa de desarrollo incremental (so%tBare versionado), lo ideal
es utili'ar lo /ltimo ue nos proporciona nuestra plata%orma de programacin. Oeneralmente lo ue se
busca es un cambio gradual, modular, y sostenido.
Por otro lado, si nuestras aplicaciones residen en produccin sin mayores modi%icaciones (alg/n proceso
batch, alguna aplicacin depurada, alg/n algoritmo estable) y estamos con%ormes con su %uncionamiento,
ui'"s no sea de nuestro inter&s migrar hacia una nueva versin.
6;
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
9os ueda anali'ar ue hay de nuevo en PHPK y ue cosas deberamos ir teniendo en cuenta si utili'amos
PHP# o PHP$.
PHP es (na leng(a m(, ';cil a aprender2 , m(c%os programadores lo
aprenden como manera de agregar interacti#idad a s(s 3itio @eb.
2esa%ortunadamente, eso signi%ica a menudo los programadores de PHP, especialmente &sos m"s nuevos
al desarrollo Beb, cometen ciertos riesgos de seguridad y desaprovechan el potencial ue sus usos pueden
contener. Au est"n algunos de los problemas mas comunes de seguridad y cmo evitarlos.
Aegla n?mero (no: N(nca2 con'iar en los (s(arios
9unca debes con%iar en ue los usuarios te van a mandar los datos ue tu esperas. Cucha gente responde
a esto con algo como+*h, nadie estara interesado en mi sitio,. Esta a%irmacin no podra ser mas
incorrecta , siempre hay un usuario mal&volo ue uiere e1plotar un agujero de seguridad ademas los
problemas pueden presentarse %"cilmente debido a un usuario ue hace algo mal inintencionalmente.
Por todo esto la regla de todo desarrollador Beb tiene ue ser G9unca, con%iar en los usuariosG . Asumir
ue cada pie'a de datos ue tu sitio recoge de un usuario puede convertirse en un agujero de seguridad,
siempre. .i la seguridad de tu sitio Beb es importante para ti, este un buen puntopara comen'ar a
aprender. .era conveniente tener +una hoja de seguridad para PHP, al lado de tu escritorio con los puntos
mas importantes en te1to negrita grande.
Variables globales
En muchas lenguajes debes crear e1plcitamente un variable para utili'arlas. En PHP, hay una opcin, las
+registerFglobals,, ue puedes %ijar en php.ini y ue permite ue utilices variables globales.
3onsidera el cdigo siguiente!
if ($,ass(ord && m!_,ass(ord) {
$aut#oriLed & 1;
'
if ($aut#oriLed && 1) {
70
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
ec#o ?is cosas im,ortantes ;
'
A muchos de vosotrosos puede parecer ue este cdigo esta %uncionando per%ectamente. T.in embargo, si
un servidor tiene +registerFglobals, encendidos, entonces simplemente agregando,U authori'edA@ G al (:5
dar" a cualuier persona el acceso libre a e1actamentelo ue no uisieras ue todo el mundo viera. Vste
es uno de los problemas mas comunes de la seguridad de PHP.
A%ortunadamente, esto tiene un par de soluciones simples y posibles. 5a primera, y ui'"s la mejor, es %ijar
desactivar +registerFglobals,. 5a segunda es asegurarse de ue utili'as solamente las variables ue has
%ijado e1plcitamente t/ mismo. En el ejemplo anterior, eso signi%icara la adicin +8authori'ed A )6 , al
principio de la escritura!
$aut#oriLed & 8;
if ($,ass(ord && m!_,ass(ord) {
$aut#oriLed & 1;
'
if ($aut#oriLed && 1) {
ec#o Kots of im,ortant stuff";
'
/ensajes de error
5os mensajes de error son una herramienta muy /til para los programadores y hacPers. (n desarrollador
los necesita para detectar bugs. (n hacPer puede utili'arlos para descubrir todas las clases de in%ormacin
sobre un sitio, desde la estructura del directorio del servidor a la in%ormacin de la cone1in de la base de
datos.En PHP para evitar esto puedes utili'ar .htaccess o php.ini, %ijando +errorFreporting, a +),.
71
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
Bna de las #entajas m;s grandes de PHP es la 'acilidad con la c(al p(ede
com(nicarse con las bases de datos2 lo m;s normal con /,3:9.
Cucha gente hace el uso e1cesivo de esto, y muchos grandes sitios, con%a en las bases de datos para
%uncionar.
.in embargo, con esa ventaja hay problemas su%icientemente grandes en la seguridad a los ue tendras
ue hacer %rente. A%ortunadamente, hay un montn de soluciones. El peligro m"s com/n de seguridad al
ue debes de hacer %rente es cuando un usuario utili'a un %allo para poder atacar directamente al servidor
de bases de datos con sentencias .;5.
(tilicemos un ejemplo com/n. Cuchos sistemas utili'an un codigo muy parecido a este para comprobar el
usuario y la contrase4a pudiendose hacer todas las combinaciones v"lidas del usuario y de su contrase4a,
por ejemplo para controlar el acceso a un "rea de administracin!
$c#ecX & m!sql_quer!(<)K)CY Username, Fass(ord, UserKevel AGO? Users ZI)G) Username & ."
$_FO<YM.username.N". and Fass(ord & ."$_FO<YM.,ass(ord.N".);
T0e parece %amiliarU . E parece ue no podra hacer mucho da4o. Pero digamos por un momento ue
introdu'co el siguiente ,usuario , en el %ormulario!
.O 1&1 [
5a pregunta ue va a ser ejecutada sera esta!
<)K)CY Username, Fass(ord AGO? Users ZI)G) Username & .. OG 1&1 [. and Fass(ord & ..
5a almohadilla (W) le dice aCy.;5 ue todo ue le sigue es un comentario y ue no debe de hacerle caso.
Ejecutar" .;5 hasta ese punto. 2espues @ es igual a @, .;5 devolver" todos los usuarios y contrase4as de
la base de datos. E como la primera combinacin del usuario y de contrase4a en la mayora de las bases
de datos es la de el administrador, la persona ue incorpor simplemente algunos smbolos en un
%ormulario ahora entra como administrador de la Reb , con los mismos privilegios ue tendra si supiera
realmente el usuario y la contrase4a.
72
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
3on una poca de creatividad, este agujero de seguridad se puede e1plotar aun m"s lejos, permitiendo ue
un usuario cree su propia cuenta , lea n/meros de las tarjetas de cr&dito o simplemente vacie la base de
datos.
A%ortunadamente, este tipo de vulnerabilidad es bastante %"cil de solucionar. 3omprobando si hay algun
caracter raro cuando el usuario introduce los datos, y uit"ndolos o neutrali'andos, podemos evitar ue
cualuier persona utili'e su propio cdigo del .;5 en nuestra base de datos. 5a %uncin ue sigue sera la
adecuada!
function maXe_safe($variable) {
$variable & addslas#es(trim($variable));
return $variable;
'
Ahora debemos modi%icar nuestra consulta. En ve' de usar variables FP*.0 como en la consulta de arriba,
ahora utili'amos todos los datos del usuario con la %uncin maPeFsa%e, dando por resultado el cdigo
siguiente!
$username & maXe_safe($_FO<YM.username.N);
$,ass(ord & maXe_safe($_FO<YM.,ass(ord.N);
$c#ecX & m!sql_quer!(<)K)CY Username, Fass(ord, UserKevel AGO? Users ZI)G) Username & ."
$username". and Fass(ord & ."$,ass(ord".);
Ahora, si un usuario incorpor los datos anteriormente citados, la consulta ser" la siguiente, ue es
totalmente ino%ensiva. 5a consulta siguiente seleccionar" de una base de datos los registros donde el
usuario es igual a +Q X* o @A@ W,.
<)K)CY Username, Fass(ord, UserKevel AGO? Users ZI)G) Username & .0. OG 1&1 [. and Fass(ord & ..
Ahora, a menos ue tengas un usuario con un nombre muy inusual y una contrase4a en blanco, tu
mal&volo atacante no podr" hacer ning/n da4o en tu sitio Reb. Es importante comprobar todos los datos
pasados a tu base de datos. 5as cabeceras de H00P enviados por elusuario pueden ser %alsi%icadas. .u
71
TALLER DE PROGRAMACION WEB DESIGNER IV UPLA
DISTANCIA -2011
direccin de remitente tambien puede ser %alsi%icada. 9o con%ies en los datos enviados por el usuario, y tu
y tu sitio estareis a salvo
76

Вам также может понравиться