POO y MVC en PHP

El paradigma de la Programación Orientada a Objetos en PHP y el patrón de arquitectura de Software MVC

por

Eugenia Bahit http://eugeniabahit.blogspot.com

AVISO LEGAL

“POO y MVC en PHP” de Eugenia a!it se distribuye bajo una "icencia Creati#e Commons $tribución% &oComercial%Sin'eri#adas ()* +nported)

Usted es libre de:
Compartir, copiar, distribuir, ejecutar y comunicar p-blicamente la obra)

Bajo las ondi iones si!"ientes:
Atrib" i#n$ 'ebe reconocer los cr.ditos de la obra de la manera especificada por el autor o el licenciante /pero no de una manera que sugiera que tiene su apoyo o que apoyan el uso que !ace de su obra0) %o Co&er ial$ &o puede utili1ar esta obra para fines comerciales) Sin Obras 'eri(adas$ &o se puede alterar, transformar o generar una obra deri#ada a partir de esta obra)

M)s in*or&a i#n de esta li en ia en: !ttp233creati#ecommons)org3licenses3by%nc%nd34)53ar3

POO y MVC en PHP + E"!enia Ba,it

-ndi e de ontenidos
Antes de comenzar con el libro............................................................................................................................................... 6 Objetivo del libro....................................................................................................................................................................6 Requisitos previos.............................................................................................................................................................6 ¿A quiénes está dirigido este libro ...............................................................................................................................6 !l ¿por qué de este libro " #i $edicatoria........................................................................................................................6 %ontenido del libro.................................................................................................................................................................& !structura del libro...........................................................................................................................................................& !ntender el contenido di'erenciado ............................................................................................................................& #arco te(rico )contenido propio*............................................................................................................................+ #arco te(rico )cita de terceros*...............................................................................................................................+ !jemplo práctico )c(digo 'uente*.............................................................................................................................+ #etá'oras )comparaci(n con la vida real*..............................................................................................................+ ,ugerencias de estilo..................................................................................................................................................+ !jercicios de autoevaluaci(n......................................................................................................................................rogramaci(n real.......................................................................................................................................................Respuestas a preguntas 'recuentes........................................................................................................................Introducción a la programación orientada a objetos (POO)......................................................................................... !lementos de la .OO...........................................................................................................................................................// %lase..................................................................................................................................................................................// Objeto...............................................................................................................................................................................// #étodo.............................................................................................................................................................................// !vento " #ensaje............................................................................................................................................................// .ropiedades " atributos................................................................................................................................................// %aracter0sticas conceptuales de la .OO........................................................................................................................../1 Abstracci(n....................................................................................................................................................................../1 !ncapsulamiento............................................................................................................................................................/1 #odularidad...................................................................................................................................................................../1 Ocultaci(n )aislamiento*.............................................................................................................................................../1 .olimor'ismo.................................................................................................................................................................../1 2erencia............................................................................................................................................................................/1 Recolecci(n de basura.................................................................................................................................................../1 Programación Orientada a Objetos en P!P "................................................................................................................... # %lases " Objetos en .2. 3................................................................................................................................................../4 $e'inici(n de %lases......................................................................................................................................................./4 $eclaraci(n de %lases abstractas................................................................................................................................/4 2erencia de %lases........................................................................................................................................................./3 $eclaraci(n de %lases 'inales !n .2........................................................................................................................../3 ¿5ué tipo de clase declarar .............................................................................................................................................../3 Objetos en .2. 3................................................................................................................................................................./3 6nstanciar una clase......................................................................................................................................................../3 .ropiedades en .2. 3........................................................................................................................................................./6 .ropiedades p7blicas...................................................................................................................................................../6 .ropiedades privadas...................................................................................................................................................../6 $

..................................................................................................................................................................................../& %onstantes de %lase....................................B: B.............................................................................................................................................................................................................................o'tCare...................................... Respuestas a preguntas 'recuentes de la clase $>Abstract#odel......................................................................................ropiedades estáticas........................construct)*....11............../#étodos mágicos en ........................1: Otros métodos mágicos...............................................................................................................abstract................................13 Programación 'eal Orientada a Objetos en P!P..................................................................................................................................................................................1/...................... Respuestas a preguntas sobre la clase ?suario...............................................................................16 Archivo db........ 3........: un nuevo concepto para crear modelos...............................................................................................................................................BB ¿5ué es la arquitectura de so'tCare ..........................................................................................................................it ....................................................................................................................................../6 .................................................................................... #.....................1+ !8plicando el c(digo en el conte8to de la ..........................................................................................................................13 !jercicio <=/...........................1: !l #étodo #ágico ....................................................................../#étodos abstractos.....B3 !l ...............................................................................................................................................php.................................................................o'tCare............................................OO: @a mejor 'orma de aprender " comprender...................................................................../+ #étodos en .........BB Dendencias de la Arquitectura de .............reguntas Arecuentes sobre el c(digo...................................................................B4 $e lo general a lo particular: del estilo arquitect(nico al patr(n de diseEo..............................................................................................................php..................................... $$ 6ntroducci(n a la Arquitectura de .........................................................................................................................................................../& Accediendo a las propiedad de un objeto...................................................................................................................../& Acceso a variables desde el e8terior de la clase........................................ropiedades protegidas................................................... && ................................................................... &6 Archivos 'uente del A># de ?suarios......................................../+ #étodos p7blicos9 privados9 protegidos " estáticos......................................................................................................................................................atr(n Arquitect(nico modeloFvistaFcontrolador )#G%* ...............................B3 Relaci(n " $i'erencia..............................................model................16 Archivo usuarios..........1Respuestas a ..............................................B4 Atributos de calidad que pueden observarse durante la ejecuci(n del so'tCare...................................................................................................oluciones a los ejercicios / " 1......................4/ # .............................................................2..........................B6 ¿%(mo 'unciona el patr(n #G% ...................1: !l método mágico .......................................................................................B3 Aclarciones previas...............................1/ Ejercicios Pr%cticos...B/ Introducción al patrón Ar(uitectónico )*+...e8ample.............................................................................................................................................4: $i'erencia entre 6nter'aces " %lases abstractas........................... !l modelo.................................... Respuestas a preguntas sobre el archivo de instancias................................................model...................................B4 Atributos de calidad inherentes al proceso de desarrollo del so'tCare................................................................1& Archivo abm.................................................................................................................................................................................................................................................................................... 3......................................BB %aracter0sticas de la Arquitectura de .................................................................................................................................................................................................................................4: 6nter'aces en ..............................................B3 ¿5ué es el patr(n #G% ................B6 El Patrón )*+ en P!P.............destruct)*..........................................................................................................................................................................................................................................................................2...............................................................................................................................................................................php...............................13 !jercicio <=1...................................................................................../& Acceso a variables desde el ámbito de la clase..........POO y MVC en PHP + E"!enia Ba.........2.......................................................................o'tCare: Atributos de calidad...................................................................................................................................................

....................inal.3Archivo ............................................/site................................php..................................................................... .............................................................................................media/html/usuario.................................................................. "# !structura de directorios............................................................................................................htaccess................................/site..............................................................................................................................................................................................................................................................................................php.........................36 Archivos de la Gista................61 !l controlador..................................................................................................................................................................................36 %(digo 'uente del archivo................................................................borrar...............................................................................44 Dercer paso: reemplaHar el contenido .......................................................................................................................................................................................41 Gista: la inter'aH grá'ica...............buscar........4B @a @(gica de la Gista...............................................................................................................................................................................................................................................................................................................................................................3Archivo .........................................................................................................................................................................................................63 Archivo ...oluciones a los ejercicios B " 4..........................41 @a vista.4Ejercicios Pr%cticos.........................................6: Archivo ..............................................................................63 Archivo .................................34 Archivos del #odelo ..........................................media/html/usuario...........................................................................................3+ Archivo ...................................../usuarios/model.................../site.............................3+ Archivos de la I?6............................POO y MVC en PHP + E"!enia Ba..............................html........................................................................................................egundo paso: obtener la plantilla 2D#@............................................../site................................................................... 66 " ................................................................................................./usuarios/vieC.........................html.....................................................................................4Dercer paso: enviar la in'ormaci(n a la vista...............egundo paso: invocar al modelo e'ectuando los cambios adecuados..............................44 .......abstract........................6: Archivo ................................................................................43 !l controlador..............................6: Archivo ....media/html/usuario......................................................................................................................................................agregar...........................................................................................63 -ota ....................................................................................................................................................................................33 Archivo ................................44 ......................3B !jercicio <=4........4+ .6B Archivo .................................................................................................................................template................................................................................................................................................................................media/css/base................................template................................44 %uarto paso: mostrar el contenido 'inal al usuario..........36 #odi'icaciones incorporadas...............................html......./core/db.............................................6B Archivos de con'iguraci(n complementarios...rimer paso: identi'icar el modelo............................./site..modi'icar..............................................................................media/html/usuario.....33 %(digo 'uente del archivo...................................................................................................................................................rimer paso: crear un diccionario de datos.......php.............model...................................................................................................................6: Archivo .....................43 ........../usuarios/controller...................................html..................................................................................../usuarios/constants....................33 #odi'icaciones incorporadas...................................................css..................................................................................3B Programación 'eal +on el patrón )*+.............................................................................................................media/html/usuario..php......................it @o que <O deben hacer las inster'aces................................................................................................................................................................................................/site.........3B !jercicio <=B....................33 Archivo .....................................................................................................html.............php................................................................................ "..................................................................................................

" que cuenten con m4nimos conocimientos de este lenguaje. .: en algunos ejemplos9 evitando el uso de J2D#@9 a 'in de que programadores sin e8periencia en el diseEo " maquetado de sitios Keb9 puedan comprender más 'ácilmente los ejemplos utiliHados*. El ¿por qué? de este libro y Mi Dedicatoria #i 'rase de cabecera es “el por qué de las cosas es relativo ya que no tiene forma de ser comprobado”.ara poder entender este libro9 los requisitos previos que debe tener el lector9 no son muchos.OO " #G% en . Objetivo del libro !l objetivo de este libro9 es dar una introducci(n general a conceptos básicos de la programaci(n como lo son9 el paradigma de la programación orientada a objetos " el patrón ar(uitectónico )*+ (modelo/ 0ista/ controlador)9 a la veH de intentar introducir estos conceptos9 en la programaci(n espec0'ica del lenguaje P!P. #e ha tocado trabajar con e7celentes programadores " con unos pocos no tan buenos.it Antes de comenzar con el libro Antes de comenHar con la lectura puntual sobre . Recomiendo que se tengan conocimientos b%sicos del lenguaje P!P as0 como la 1acilidad para entender código !2)3 b%sico )se utiliHará 2D#@ Dransitional 4.olo puedo decir 5cómo6 'ue que se me ocurri( escribirlo. .erd0 la cuenta de la cantidad de programadores con los que he trabajado. As0 que se me hace mu" di'0cil e8plicar un Lpor quéM. 2an sido much0simos en los 7ltimos /3 aEos de mi vida. Requisitos previos .9 hago meritorio notar ciertas cuestiones que considero deben contemplarse a 'in de lograr un mejor entendimiento de lo e8puesto.e desconoce por completo o no se logra entender del todo9 la di'erencia entre Lestilo arquitect(nicoM9 Lpatr(n arquitect(nicoM " Lpatr(n de diseEoM9 provocando en consecuencia9 el desaprovechamiento o mal uso9 de patrones arquitect(nicos 6 .2.e usan elementos de la programaci(n orientada a objetos9 con la 'alsa creencia de que escribiendo una LclaseM "a se está programando orientado a objetos . .POO y MVC en PHP + E"!enia Ba. N ésto que he notado " me ha llamado mucho la atenci(n9 es que: • • .ero ha" algo9 que he notado en una gran parte de progrmadores9 con los que tal veH9 no me ha tocado trabajar en 'orma directa9 pero s09 tener que continuar desarrollando algo "a empeHado por ellos o modi'icarlo. ¿A quiénes está dirigido este libro? !ste libro está dirigido principalmente9 a programadores P!P que quieran salir de la programaci(n estructurada para insertarse en la programaci(n orientada a objetos "9 a programadores de otros lenguajes que quieran comenHar a insertarse en la .2.OO en .

met%1oras )comparaci(n con ejemplos de la vida real Q tomando esta técnica de un principio básico de !8treme .a(aS ri/t.ues no me interesa hacerme eco de la competiti0idad que invade varios ámbitos de la vida. <o hacer nada 1. A 'in de alcanHar un abordaje más preciso " 'ácilmente entendible9 se ha divido el libro en . Dransmitir a otros programadores9 todo lo que hab0a aprendido9 para que pudiesen implementarlo si ese 'uese su deseo .it como #G% desencadenando as09 en una arquitectura de so'tCare de'iciente @as alternativas que me quedaban eran dos: /.com$. .OO " el patr(n #G% )en general* " los otros dos9 colocan a la .2. Estructura del libro !ste libro se encuentra dividido en # cap4tulos donde dos de ellos9 introducen a conceptos básicos de la .* 6 4 ( !ttp233www)maestrosdelweb)com3 t"nait nos ofrece una de las mejores colecciones de códigos . marco teórico )contenido propio " citas de terceros* &. Contenido del libro A 'in de lograr cumplir con los objetivos propuestos9 este libro ha sido diseEado con una estructura esquemática " seguiendo normas de estilo a 'in de di'erenciar su contenido.POO y MVC en PHP + E"!enia Ba. Entender el contenido di erenciado !ste libro no pretende ser un compendio de conceptos meramente te(ricos.orque esto" segura que el conocimiento debe ser transmitido " no se debe escatimar en su di1usión.or l(gica " sin dudarlo ni tener que pensarlo demasiado9 eleg0 la segunda opci(n.OO " al patr(n #G% en el conte8to del lenguaje . ejemplo pr%ctico )c(digo 'uente de ejemplo* $. de la comunidad !ispanoparlante .com " . N es por ello9 que este libro/ lo dedico a todos ellos9 a los creadores de )astros8el9eb.. tipi1icaciones de contenido di'erenciadas: .cript de A$K " al madrileEo )iguel :ngel :l0arez9 'undador " director del portal de programaci(n9 8esarrollo9eb. sugerencias de estilo )reglas de estilo sugeridas para la programaci(n en . . .oros8el9eb.com " en especial9 a mis dos grandes colegas9 de quienes he aprendido gran parte de lo que ho" se: • • a la barcelonesa !elena !eidenreich )aOa: tunait&*9 gran colaboradora del 'oro Pava. en su sitio 7eb !ttp233tunait)com3ja#ascript3 !ttp233www)desarrolloweb)com Portal de desarrollo 0eb y /ro!ra&a i#n.or el contrario9 pre1iero seguir el ejemplo de a(uellos/ mis colegas/ (ue lo han brindado todo al saber general .2. .rogramming* #.

.i bien es un rasgo de personalidad tal veH admirable9 en la práctica9 provoca que sea di'0cil modi'icar el c(digo 'uente escrito previamente por otro programador.it ".POO y MVC en PHP + E"!enia Ba. . # Métodos public function set_usuario() { $this->nombre = 'Juan'. . La fuente se encuentra al pie de página. programación real )ejemplos con c(digos 'uente reales* . !sto9 hace que muchas veces9 cada programador le de al c(digo 'uente un LtoqueM caracter0stico. . preguntas a respuestas 1recuentes #arco te(rico )contenido propio* De8to general del libro.ugerencias de estilo A di'erencia de otros lenguajes de programaci(n como . A 'in de proponer una alternativa para solucionar este inconveniente " basándome en el principio de Lpropiedad colectivaM de E7treme Programming as0 como en la técnica de 8 Este libro !a sido editado utili1ando O/enO**i e 0riter 1$2 con el plug%in COOoder para el coloreado de sinta9is < ."thon9 por ejemplo9 .” !jemplo práctico )c(digo 'uente* !l c(digo 'uente se encuentra con una tipogra'0a monoespaciada " con la sinta8is del lenguaje coloreada4. ejercicios de autoe0aluación 6. #arco te(rico )cita de terceros* @as citas presentan el siguiente 'ormato: “Esto es una cita textual de terceros. !stas metá'oras9 se presentarán con un diseEo como el siguiente: !sto es una met%1ora.i no tengo el 0cono9 so" un ejemplo de la vida real9 pero no so" una metá'ora.2. no tiene una gu0a de prácticas recomendadas o sugerencias de estilo. class Usuario { # Propiedades public $nombre. } } #etá'oras )comparaci(n con la vida real* A 'in de ejempli'icar con 'acilidad un concepto netamente te(rico9 se darán ejemplos utiliHando hechos de la vida cotideana9 que puedan asemejarse al concepto que se esté e8plicando.

como el que se muestra a la iHquierda de este párra'o. Respuestas a preguntas 'recuentes Aqu0 encontrarás todas las preguntas sobre los c(digos 'uente que se encuentren en la secci(n Lprogramaci(n realM. @as =ugerencias de Estilo presenta un 'ormato similar al siguiente: 'eglas de estilo sugeridas !sto es una regla de estilo sugerida en re'erencia al tema que se está tratando. . !jercicios de autoevaluaci(n Al 'inal de los cap0tulos 66 " 6G9 ha" una breve serie de ejercicios9 cu"a 'inalidad9 es la de asimilar los conocimientos adquiridos en los cap0tulos anteriores.POO y MVC en PHP + E"!enia Ba. $icha secci(n9 se encuentra identi'icada con el icono que se muestra a la derecha de este párra'o.rogramaci(n real Dras los ejercicios presentados al 'inaliHar los cap0tulos 66 " 6G9 se podrá encontrar c(digo 'uente de casos reales.it establecimiento de pautas de estilo que hagan un c(digo homogéneo9 a lo largo del libro iré sugiriendo algunas reglas de estilo seg7n surjan9 cu"o 'inalidad tiende a: /. hacer los c(digos 'uente más intuitivosR 1. @as soluciones a dichos ejercicios9 se encuentran al 'inal de cada uno de ellos. @os encontrarás 'ácilmente identi'icando el 0cono de .. !echa estas aclaraciones/ ahora. >A programar? @ .. $ichos c(digos9 pretenden dar al lector9 una noci(n más práctica de los temas que se han tratado9 aplicándola a la vida cotideana de un desarrollador.2. escribir c(digos 'uente 'ácilmente legibles.

it CAP-3ULO I :ntroducción a la Programación Orientada a Objetos /POO0 . .POO y MVC en PHP + E"!enia Ba.

it Introducción a la programación orientada a objetos (POO) @a . $a"tura = '#$% mts'. .us caracter0sticas )propiedades* pueden ser el color de ojos9 color de pelo9 su estado civil9 etc.OO está compuesta por una serie de elementos que se detallan a continuaci(n. function caminar() { #.uede estar en estado despierto9 dormido9 etc.POO y MVC en PHP + E"!enia Ba.. Clase ?na clase es un modelo que se utiliHa para crear objetos que comparten un mismo comportamiento9 estado e identidad. que se ha creado siguiendo el modelo de la clase Persona */ Método !s el algoritmo asociado a un objeto que indica la capacidad de lo que éste puede hacer. $persona = new Persona(). )et%1ora Persona es la metá'ora de una clase )la abstracci(n de Puan9 ..edro9 Ana " #ar0a*9 cu"o comportamiento puede ser caminar9 correr9 estudiar9 leer9 etc. Ele!entos de la "OO @a . . .OO es un paradigma de programación )o técnica de programaci(n* que utiliHa objetos e interacciones en el diseEo de un sistema. /* El objeto. "ropiedades y atributos @as propiedades " atributos9 son 0ariables que contienen datos asociados a un objeto. $nombre = 'Juan'. $edad = '2 a!os'. class Persona { # Propiedades # Métodos } Objeto !s una entidad provista de métodos o mensajes a los cuales responde )comportamiento*R atributos con valores concretos )estado*R " propiedades )identidad*. es $persona. } Evento y Mensaje ?n e0ento es un suceso en el sistema mientras que un mensaje es la comunicaci(n del suceso dirigida al objeto. ahora.

Encapsula!iento Re7ne al mismo nivel de abstracci(n9 a todos los elementos que puedan considerarse pertenecientes a una misma entidad. "oli!or is!o !s la capacidad que da a di'erentes objetos9 la posibilidad de contar con métodos9 propiedades " atributos de igual nombre9 sin que los de un objeto inter'ieran con el de otro. Ocultaci$n %aisla!iento& @os objetos están aislados del e8terior9 protegiendo a sus propiedades para no ser modi'icadas por aquellos que no tengan derecho a acceder a las mismas. Abstracci$n Aislaci(n de un elemento de su conte8to. Recolecci$n de basura !s la técnica que consiste en destruir aquellos objetos cuando "a no son necesarios9 liberándolos de la memoria. $ichas caracter0sticas se describen a continuaci(n.POO y MVC en PHP + E"!enia Ba.it Caracter#sticas conceptuales de la "OO @a . & .OO debe guardar ciertas caracter0sticas que la identi'ican " di'erencian de otros paradigmas de programaci(n. Modularidad %aracter0stica que permite dividir una aplicaci(n en varias partes más pequeEas )denominadas m(dulos*9 independientes unas de otras. $e'ine las caracter0sticas esenciales de un objeto. 'erencia !s la relaci(n e8istente entre dos o más clases9 donde una es la principal )madre* " otras son secundarias " dependen )heredan* de ellas )clases LhijasM*9 donde a la veH9 los objetos heredan las caracter0sticas de los objetos de los cuales heredan.

it CAP-3ULO II Programación Orientada a Objetos en PHP 5 $ .POO y MVC en PHP + E"!enia Ba.

(n nombre válido de clase comien"a con una letra o un guión ba!o$ seguido de la cantidad de letras$ n)meros o guiones ba!os ue sea..e de'inen anteponiendo la palabra clave abstract a class: abstract class &ombre'e(i)"ase*bstracta { #. 3S.ara de'inir una clase9 el )anual O1icial de P!P9 contin7a diciendo: […] “La definición básica de clases comien"a con la palabra clave class$ seguido por un nombre de clase$ continuado por un par de llaves ue encierran las definiciones de las propiedades y m%todos pertenecientes a la clase. . Declaraci$n de Clases abstractas @as clases abstractas son aquellas que no necesitan ser instanciadas pero sin embargo9 ser%n heredadas en algAn momento..” […]* Geamos un ejemplo de de1inición de clase: class &ombre'e(i)"ase { #. 5 = . Clases y Objetos en "'" ( De inici$n de Clases .POO y MVC en PHP + E"!enia Ba.. @a lla0e de apertura en la misma l4nea que el nombre de la clase9 permite una mejor legibilidad del c(digo..eg7n el )anual O1icial de P!P9 una +lase es: […] “una colección de variables y funciones ue traba!an con estas variables.]# . } 'eglas de Estilo sugeridas ?tiliHar +amel+ase para el nombre de las clases.OO en el entorno del lenguaje .uente de la cita2 !ttp233www)p!p)net3manual3es3language)oop5)basic)p!p # ..uente de la cita2 !ttp233p!p)net3manual3es3<eyword)class)p!p . Las variables se definen utili"ando var y las funciones utili"ando function” [. El nombre de clase puede ser cual uier eti ueta válida ue no sea una palabra reservada de &'&.2.it Programación Orientada a Objetos en PHP 5 !n este cap0tulo veremos como aplicar los conceptos de la . } !ste tipo de clases9 será la que contenga mBtodos abstractos )que veremos más adelante* " generalmente9 su 'inalidad9 es la de declarar clases LgenéricasM que necesitan ser declaradas pero a las cuales9 no se puede otorgar una de'inici(n precisa )de eso9 se encargarán las clases que la hereden*..

ara ello9 . @(gicamente9 la clase debe haber sido declarada antes de ser instanciada9 como se muestra a continuaci(n: " . . ¿%(mo saber qué tipo de clase declarar Dodo dependerá9 de lo que necesitemos hacer..e de'inen anteponiendo la palabra clave final.ara instanciar una clase9 solo es necesario utiliHar la palabra clave new.a extends &ombre'e(i)"ase(adre { /* esta clase hereda todos los métodos y propiedades de la clase madre ombre!eMi"laseMadre */ } Declaraci$n de Clases inales En "'" . *nstanciar una clase .. . } class &ombre'e(i)"ase+i.2. class &ombre'e(i)"ase(adre { #. %rear una clase que pueda ser instanciada "/o heredada %rear una clase cu"o objeto guarda relaci(n con los métodos " propiedades de otra clase %rear una clase que solo sirva de modelo para otra clase9 sin que pueda ser instanciada %rear una clase que pueda instanciarse pero que no pueda ser heredada por ninguna otra clase J J Instanciable J J Abstracta !eredada . permite la Le8tensi(nM )herencia* de clases9 cu"a caracter0stica representa la relaci(n e8istente entre di'erentes objetos.inal Objetos en "'" ( ?na veH que las clases han sido declaradas9 será necesario crear los objetos " utiliHarlos9 aunque hemos visto que algunas clases9 como las clases abstractas son solo modelos para otras9 " por lo tanto no necesitan instanciar al objeto. !ste cuadro9 puede servirnos como gu0a básica: -ecesito..ara de'inir una clase como e8tenci(n de una clase LmadreM se utiliHa la palabra clave extends.POO y MVC en PHP + E"!enia Ba.2. final class &ombre'e(i)"ase-ina" { #esta clase no podr# ser heredada } ¿)ué tipo de clase declarar? 2asta aqu09 han quedado en claro9 cuatro tipos de clases di'erentes: Instanciables9 astractas9 heredadas " 1inales. .. !l objeto será creado9 asignando esta instancia a una variable )la cual9 adoptará la 'orma de objeto*.it 'erencia de Clases @os objetos pueden heredar propiedades C mBtodos de otros objetos . 3 incorpora clases 'inales que no pueden ser heredadas por otra.

} @as propiedades pueden goHar de di'erentes caracter0sticas9 como por ejemplo9 la visibilidad: pueden ser pAblicas/ pri0adas o protegidas.or ejemplo si el nombre de la clase es -ombre8e)i+lase como variable utiliHar DnombreEdeEmiEclase.POO y MVC en PHP + E"!enia Ba. %omo veremos más adelante9 la visiblidad de las propiedades9 es aplicable también a la visibilidad de los métodos. Tstas9 se de'inen anteponiendo la palabra clave protected al nombre de la variable: 6 .enero. . public $.. } "ropiedades protegidas @as propiedades protegidas pueden ser accedidas por la propia clase (ue la de1inió/ as4 como por las clases (ue la heredan 9 pero no9 desde otras partes de la aplicaci(n. private $edad. Tstas solo pueden ser accedidas por la clase (ue las de1inió. !sto permitirá una ma"or legibilidad del c(digo. } # creo el objeto instanciando la clase $persona = new Persona(). class Persona { public $nombre.enero. "ropiedades en "'" ( @as propiedades representan ciertas caracter0sticas del objeto en s0 mismo.e de'inen anteponiendo la palabra clave var al nombre de la variable )propiedad*: class Persona { var $nombre. "ropiedades p+blicas @as propiedades p7blicas se de'inen anteponiendo la palabra clave public al nombre de la variable. var $. Tstas9 pueden ser accedidas desde cual(uier parte de la aplicación 9 sin restricci(n. 'eglas de Estilo sugeridas ?tiliHar nombres de variables )objetos* descriptivos9 siempre en letra min7scula9 separando palabras por guiones bajos. . public $. class Persona { public $nombre. var $edad.enero..it # declaro la clase class Persona { #. } "ropiedades privadas @as propiedades privadas se de'inen anteponiendo la palabra clave private al nombre de la variable.

re = '*0'. ?na propiedad declarada como estática9 puede ser accedida sin necesidad de instanciar un objeto. . Acceso a variables desde el á!bito de la clase . # creo el objeto instanciando la clase $persona_a_positi/o = new Persona*Positi/o(). 3.ara acceder a las propiedad de un objeto9 e8isten varias maneras de hacerlo.or lo tanto9 solo variables p7blicas pueden ser accedidas desde cualquier ámbito 'uera de la clase o clases heredadas.enero. . # accedo a la $ariable NO estática print $persona_a_positi/o->nombre. Acceso a variables desde el e. } "ropiedades estáticas @as propiedades estáticas representan una caracter0stica de LvariabilidadM de sus datos9 de gran importancia en .terior de la clase . Dodas ellas9 dependerán del ámbito desde el cual se las invoque as0 como de su condici(n " visibilidad.POO y MVC en PHP + E"!enia Ba.it class Persona { public $nombre.eto->/ariab"e <(tese además9 que este acceso dependerá de la visibilidad de la variable. print parent11$/ariab"e_estatica_de_c"ase_madre. %uando la variable es est%tica9 se accede a ella mediante el operador de resoluci(n de ámbito9 doble dosFpuntos FF anteponiendo la palabra clave self o parent seg7n si trata de una variable de la misma clase o de otra de la cual se ha heredado9 respectivamente: print self11$/ariab"e_estatica_de_esta_c"ase.e accede a una propiedad no est%tica dentro de la clase9 utiliHando la pseudoFvariable $this siendo esta pseudoFvariable una re'erencia al objeto mismo: return $this->nombre. . public $.2. protected $pasaporte. Tsta9 se de'ine anteponiendo la palabra clave static al nombre de la variable: class Persona*Positi/o extends Persona { public static $tipo_san.e accede a una propiedad no est%tica con la siguiente sintá8is: $ob. } Accediendo a las propiedad de un objeto . private $edad. " su valor es estático )es decir9 no puede variar ni ser modi'icado*.

A di'erencia de las propiedades estáticas9 las constantes solo pueden tener una 0isibilidad pAblica.OO*9 mientras que llamamos guiones bajos9 a"uda a comprender mejor el 'unciones9 a los algoritmos de la programaci(n c(digo 'uente haciéndolo más intuitivo " legible. } } Al igual que cualquier otra 'unci(n en ..re() { #.%?@A9 a"uda a di'erenciar rápidamente constantes de variables9 haciendo más legible el c(digo. 3. estructurada. sugeridas @a 7nica di'erencia entre método " 'unci(n9 es ?tiliHar nombresEdeE1uncionesEdescripti0os9 en que llamamos mBtodo a las 1unciones de una letra min7scula9 separando palabras por clase )en la .9 los métodos recibirán los parámetros necesarios indicando aquellos requeridos9 dentro de los paréntisis: < .re.ara acceder a una propiedad p7blica " est%tica el objeto no necesita ser instanciado9 permitiendo as09 el acceso a dicha variable mediante la siguiente sintá8is: Clase::$variable_estática # accedo a la $ariable estática print Persona*Positi/o11$tipo_san. !l acceso a constantes es e8actamente igual que al de otras propiedades. Métodos en "'" ( %abe recordar9 para quienes vienen de la programaci(n estructurada9 que el método de 'eglas de Estilo una clase9 es un algoritmo igual al de una 'unci(n. @a 'orma de declarar un método es anteponiendo la palabra clave function al nombre del método9 seguido por un par paréntesis de apertura " cierre " llaves que encierren el algoritmo: # declaro la clase class Persona { #propiedades #métodos function donar_san. const (2_)3&45*&56 = '6ste es e" /a"or est7tico de mi constante'.uede declararse una constante de clase como cualquier constante normal en ..2. 'eglas de Estilo sugeridas ?tiliHar -O)B'EE8EE+O-=2A-2E en letra #ANU.2. .it .POO y MVC en PHP + E"!enia Ba. Constantes de Clase Otro tipo de LpropiedadM de una clase9 son las constantes9 aquellas que mantienen su 0alor de 1orma permanente C sin cambios.

re($destinatario) { #. ¿.e trataba de hacer un sistema de gesti(n in'ormática9 para las 'armacias de los 2ospitales del Iobierno de la %iudad de >uenos Aires. +uando se .or ejemplo9 todos los insumos . Dal veH9 te preguntes G+u%l es la utilidad de de1inir mBtodos abstractos C clases abstractasH .uente de la cita2 !ttp233www)p!p)net3manual3es3language)oop5)abstract)p!p @ . } } Métodos p+blicos. Ejemplo .or > qué Aundamentalmente9 porque si bien e8isten insumos 'armacéuticos de todo tipo " especie9 cada uno de ellos9 comparte caracter0sticas comunes9 que por s0 solas no pueden de'inirse con precisi(n.adicionalmente$ estos m%todos deben ser definidos con la misma visibilidad . static function a() { } protected function b() { } private function c() { } # etc. &or e!emplo$ si el m%todo abstracto está definido como protected$ la implementación de la función puede ser redefinida como protected o public$ pero nunca como private. Métodos abstractos A di'erencia de las propiedades9 los métodos9 pueden ser abstractos como sucede con las clases.” […]0 .o con una menos restrictiva/.. !l )anual O1icial de P!P9 se re'iere a los métodos abstractos9 describiéndolos de la siguiente 'orma: […] “Los m%todos definidos como abstractos simplemente declaran la estructura del m%todo$ pero no pueden definir la implementación..it # declaro la clase class Persona { #propiedades #métodos function donar_san.privados..ereda de una clase abstracta$ todos los m%todos definidos como abstract en la definición de la clase parent deben ser redefinidos en la clase c.protegidos y estáticos @os métodos9 al igual que las propiedades9 pueden ser pAblicos/ pri0ados/ protegidos o est%ticos.ild..POO y MVC en PHP + E"!enia Ba.ara responder a esta pregunta9 vo" en'ocarme en un caso de la vida real9 en el cual estuve trabajando hace poco tiempo. @a 'orma de declarar su visibilidad tanto como las caracter0sticas de ésta9 es e8actamente la misma que para las propiedades.ara entender mejor los métodos abstractos9 podr0amos decir que a grandes rasgos9 los mBtodos abstractos son a(uellos (ue se declaran inicialmente en una clase abstracta/ sin especi1icar el algoritmo (ue implementar%n 9 es decir9 que solo son declarados pero no contienen un Lc(digoM que espec0'ique qué harán " c(mo lo harán. ?n punto 'undamental9 era pensar en los insumos 'armacéuticos como Lun todo abstractoM. .

.it 'armacéuticos requieren de un tipo de conservaci(n especial. !l método mágico __destruct() !l método __destruct() es el encargado de liberar de la memoria9 al objeto cuando "a no es re'erenciado.9 que pueden aportar valor a nuestras clases " ahorrarnos grandes cantidades de c(digo. . ¿. $eclarar un método conservar. protected $estado. #de%ino el método set&estado&producto'( protected function set_estado_producto($estado) { $this->estado = $estado. . Métodos !ágicos en "'" ( .insumo)* como abstracto9 servir0a para luego de'inir con e8actitud9 en una clase heredada9 el algoritmo e8acto que determinado insumo necesitar0a para procesar su conservaci(n.i se agregaran otros métodos9 éstos9 podrán hacer re'erencia al estado del producto9 para determinar si ejecutar o no determinada 'unci(n. 39 nos trae una gran cantidad de autoFdenominados 5mBtodos m%gicos6. %on ellas declaramos aquellos LobjetosM que no pueden ser de'inidos con presici(n pero aseguramos all09 todas aquellas caracter0sticas que dichos objetos9 guardarán entre s0.u 'unci(n es la de ejecutar cualquier inicialiHaci(n que el objeto necesite antes de ser utiliHado. !stos métodos9 otorgan una 'uncionalidad preFde'inida por . } # constructor de la clase function __construct() { $this->set_estado_producto('en uso'). en un lenguaje orientado a objetos9 cada veH más robusto. .2. # declaro la clase class Producto { #de%ino algunas propiedades public $nombre. .roducto* comience a utiliHarse. } } !n el ejemplo anterior9 el constructor de la clase se encarga de de'inir el estado del producto como Len usoM9 antes de que el objeto ). Algunos requieren re'rigeraci(n a determinada temperatura que solo puede ser satis'echa conservándolos en una heladeraR otros requieren conservarse en un ambiente secoR otros9 no pueden tomar contacto con el e8terior9 a 'in de conservar su capacidad estérilR etc.insumo)* indicando un algoritmo que solicitara la temperatura a la cual deb0a conservarse en heladera9 etc. !ntre los métodos mágicos9 podemos encontrar los siguientes: !l #étodo #ágico __construct() !l método __construct() es aquel que será invocado de manera automática9 al instanciar un objeto.od0a de'inirse con e8actitud una clase 6nsumo @a respuesta a esa pregunta9 es justamente su pregunta ret(rica ¿ir0as a la 'armacia a pedirle al 'armacéutico Ldeme un insumo de 3:: mgM 6nsumo9 representa la entidad LabstractaM " para eso9 sirven las clases abstractas.2. @o que muchos programadores consideramos9 a"uda a convertir a .or ejemplo9 no podr0a mostrarse a la venta un producto Len uso por el sistemaM9 "a que a éste9 se le podr0a estar modi'icando el precio. public $precio.e puede aprovechar este método9 para realiHar otras tareas que se &.2.POO y MVC en PHP + E"!enia Ba. !s as0 entonces9 que una clase 6nsumoRe'rigerado heredar0a de 6nsumo9 " rede'inir0a el método conservar.

uede verse una descripci(n " ejemplo de su uso9 en el sitio Keb o'icial de . } # constructor de la clase function __construct() { $this->set_estado_producto('en uso'). !ttp233www)p!p)net3manual3es3language)oop5)magic)p!p __ca""$ __ca""4tatic$ __8a9eup$ __to4trin. protected $estado. # declaro la clase class Producto { #de%ino algunas propiedades public $nombre. } # destructor de la clase function __destruct() { $this->set_estado_producto('"iberado'). } } Otros métodos mágicos . nos o'rece otros métodos mágicos tales como __.et$ __set$ __isset$ __unset$ __s"eep$ __in/o9e$ __set_state : __c"one.: & .it estimen necesarias al momento de destruir un objeto.POO y MVC en PHP + E"!enia Ba.$ . print '6" ob.eto ha sido destruido'. #de%ino el método set&estado&producto'( protected function set_estado_producto($estado) { $this->estado = $estado.2.2. public $precio.

() ¿$uál de las siguientes a'irmaciones es )*+S* con respecto a las caracter.#) ¿$uál de las siguientes opciones% responde mejor a los elementos &ue 'orman parte de la P!!" a) Clases.POO y MVC en PHP + E"!enia Ba.it Ejercicios Prácticos .1) ¿Qu es la Programación !rientada a !bjetos" a) Un patrón de diseño de software b) Un paradigma de programación c) La única forma en la que se puede programar en PHP d) Ninguna de las anteriores 1.sticas de la P!!" a) La abstracción " el polimorfismo son caracter'stica esenciales de la programación orientada a ob etos b) (ncapsulamiento es sinónimo de aislamiento c) (n la P)). abstracción. en partes m*s pequeñas. Ejercicio Nº1: Sobre la programación orientada a objetos 1. ob etos. es la caracter'stica que permite di$idir una aplicación. la modularidad. inmutabilidad. e$entos " funciones c) %!todos. funciones " prototipos e) &ariables. con independencia unas de las otras && . atributos " propiedades b) #tributos. constantes " funciones 1.ara practicar lo que hemos visto hasta ahora9 les propongo hacer algunos ejercicios9 a 'in de asimilar los conocimientos de los cap0tulos 6 " 66. m!todos.

eredar de +temProducto "a que esta clase ...ado el siguiente código: <=php >ina" c"ass 2temProducto { #.POO y MVC en PHP + E"!enia Ba.it Ejercicio Nº#: Sobre la P!! en P-P #.eredando de otra clase b) No fallar'a nada c) Producto no puede . } print )"iente11$nombre_comp"eto. => a) Cliente desconocido -.. } c"ass Producto e?tends 2temProducto { #.() ¿$uál crees &ue será la salida del siguiente código" <=php c"ass )"iente { static pub"ic $nombre_comp"eto = ')"iente desconocido'. print )"iente11$id...#) ¿$uál crees &ue será la salida del siguiente código" <=php c"ass )"iente { static pub"ic $nombre_comp"eto = ')"iente desconocido'.1) . protected $id = #@@#.a sido declarada como clase final #. } => ¿Qu crees &ue 'allar. &$ .a al intentar ejecutarlo" a) +temProducto fallar* "a que est* .b) Cliente desconocido c) /e imprimir'a Cliente desconocido pero fallar'a luego el acceso a 0id "a que es una propiedad protegida #.

POO y MVC en PHP + E"!enia Ba,it

protected $id = #@@#; >unction __construct() { se">11$nombre = 'Juan PAreB'; } } print )"iente11$nombre_comp"eto; =>

a) Cliente desconocido b) 1uan P!re2

E/plica por&u

0as elegido esa respuesta:

#.1) 2eniendo en cuenta el siguiente código:
<=php c"ass )"iente { static pub"ic $nombre_comp"eto = ')"iente desconocido'; protected $id = #@@#; } =>

¿$uál de las siguientes opciones% estimas &ue ser,a la apropiada para imprimir en pantalla% la propiedad 3nombre4completo3
a) print )"iente11nombre_comp"eto; b) print )"iente11$nombre_comp"eto; c) $c"iente = ne8 )"iente();
print $c"iente->nombre_comp"eto;

d) $c"iente = ne8 )"iente();
print $c"iente->$nombre_comp"eto;

&#

POO y MVC en PHP + E"!enia Ba,it

.oluciones a los ejercicios / y 0 Ejercicio 12/ Pregunta . F respuesta b Pregunta .&F respuesta a Pregunta .$F respuesta b Ejercicio 120 Pregunta &. F respuesta c Pregunta &.&F respuesta c Pregunta &.$F respuesta a
por ue a las propiedades estáticas no se les puede modificar su valor

Pregunta &.#F respuesta b

&"

POO y MVC en PHP + E"!enia Ba,it

Programación Real Orientada a Objetos en PHP Geremos ahora9 un ejemplo basado en la realidad de un programador. !n este caso9 se trata de un AB) de usuarios.
Nótese ue los m%todos respectivos ,an sido resumidos no encontrándose en %stos$ algoritmos de validación de datos. 1e e!emplifica todo a uello ue es relevante en la &22.

Arc3ivos uente del A4M de 5suarios Arc3ivo db_abstract_model.php
<=php abstract class 'C*bstract(ode" { private static $db_host = '"oca"host'; private static $db_user = 'usuario'; private static $db_pass = 'contrase!a'; protected $db_name = 'm:db'; protected $Duer:; protected $ro8s = arra:(); private $conn; # métodos abstractos para )*M de clases que hereden abstract protected function .et(); abstract protected function set(); abstract protected function edit(); abstract protected function de"ete(); # los siguientes métodos pueden de%inirse con e+actitud # y no son abstractos # "onectar a la base de datos private function open_connection() { $this->conn = new m:sD"i(self11$db_host$ self11$db_user$ self11$db_pass$ $this->db_name); } # !esconectar la base de datos private function c"ose_connection() { $this->conn->c"ose(); } # Ejecutar un query simple del tipo , -E./, !E0E/E, 1P!)/E protected function e?ecute_sin."e_Duer:() { $this->open_connection(); $this->conn->Duer:($this->Duer:); $this->c"ose_connection(); } # /raer resultados de una consulta en un )rray protected function .et_resu"ts_>rom_Duer:() { $this->open_connection(); $resu"t = $this->conn->Duer:($this->Duer:); 8hi"e ($this->ro8sEF = $resu"t->>etch_assoc()); $resu"t->c"ose(); $this->c"ose_connection();

&6

et_resu"ts_>rom_Duer:(). public $emai".et($user_emai"='') { i>($user_emai" G= '')1 $this->Duer: = H 46I6)5 id$ nombre$ ape""ido$ emai"$ c"a/e -J3( usuarios K+6J6 emai" = '$user_emai"' H. . protected $id. endi>. public $ape""ido. end>oreach. endi>. } public function . private $c"a/e. } public function edit($user_data=arra:()) { >oreach ($user_data as $campo=>$/a"or)1 $$campo = $/a"or. &.POO y MVC en PHP + E"!enia Ba."e_Duer:(). $this->Duer: = H 2&46J5 2&53 usuarios (nombre$ ape""ido$ emai"$ c"a/e) L*IU64 ('$nombre'$ '$ape""ido'$ '$emai"'$ '$c"a/e') H. endi>. i>(count($this->ro8s) == #)1 >oreach ($this->ro8sE@F as $propiedad=>$/a"or)1 $this->$propiedad = $/a"or. $this->e?ecute_sin. endi>.php').et($user_dataE'emai"'F). } public function set($user_data=arra:()) { i>(arra:_9e:_e?ists('emai"'$ $user_data))1 $this->. function __construct() { $this->db_name = 'boo9_e?amp"e'.it arra:_pop($this->ro8s). i>($user_dataE'emai"'F G= $this->emai")1 >oreach ($user_data as $campo=>$/a"or)1 $$campo = $/a"or. $this->. } } => Arc3ivo usuarios_model.php <=php reDuire_once('db_abstract_mode". end>oreach. class Usuario extends 'C*bstract(ode" { public $nombre.

et('userMemai". ' ha sido editado<br>'. # "rear un nue$o usuario $ne8_user_data = arra:( 'nombre'=>'*"berto'$ 'ape""ido'=>'Jacinto'$ 'emai"'=>'a"bert2@@@Mmai". $usuarioR = new Usuario(). $usuario2->. } } => Arc3ivo abm_example. # /raer los datos de un usuario $usuario# = new Usuario(). ' ' .acaranda' ).com'). $this->e?ecute_sin. print $usuario#->nombre . $usuario2->set($ne8_user_data). $this->Duer: = H UP'*56 usuarios 465 nombre='$nombre'$ ape""ido='$ape""ido'$ c"a/e='$c"a/e' K+6J6 emai" = '$emai"' H. ' e?iste<br>'. $usuario2->ape""ido ."e_Duer:(). ' ha sido creado<br>'.php'). ' ' .et($ne8_user_dataE'emai"'F).it end>oreach."e_Duer:(). } function __destruct() { unset($this). $usuarioR->ape""ido . $usuario2 = new Usuario().et($edit_user_dataE'emai"'F). $usuario#->. } public function de"ete($user_emai"='') { $this->Duer: = H '6I656 -J3( usuarios K+6J6 emai" = '$user_emai"' H. $usuario#->ape""ido . ' ' .php <=php reDuire_once('usuarios_mode". # Eliminar un usuario &< . print $usuarioR->nombre .com'$ 'c"a/e'=>'. $usuarioR->. # Editar los datos de un usuario e+istente $edit_user_data = arra:( 'nombre'=>'Nabrie"'$ 'ape""ido'=>'IopeB'$ 'emai"'=>'marconiMmai". $this->e?ecute_sin.com'$ 'c"a/e'=>'OP2%Q' ). print $usuario2->nombre .POO y MVC en PHP + E"!enia Ba. $usuarioR->edit($edit_user_data).

' ' .plicando el c$digo en el conte. <o var0an.to de la "OO6 7a !ejor or!a de aprender y co!prender !n principio tenemos $ archi0os: • • 1 archivos son VclasesV de dos modelos de objetos. <o estar0a respetando el principio de modularidad de la . Respuestas a preguntas 'recuentes de la clase 8BAbstract)odel .i solo contemplara los métodos de inserci(n9 edici(n9 consulta " eliminaci(n de usuarios en esta clase9 estar0a cometiendo dos errores imperdonable: /. !l algoritmo de cada uno de esos métodos no puede de1inirse con e7actitud ¿por qué . $usuarioQ->.orque cada dato que se inserte9 modi'icque9 elimine o consulte9 variará en in'inidad de aspectos: desde los tipos de datos hasta las tablas " los campos a los que se deba acceder9 etc. &@ . print $usuarioQ->nombre .OO9 es necesario tener en cuenta9 que 2ON9 necesito un A># de usuarios9 pero maEana9 este requisito puede ampliarse "9 debo dejar todo preparado para que el sistema pueda ser escalable " modular )otros m(dulos pueden ser requeridos en el 'uturo*.ues entonces9 la pregunta es GPara (uB (uerr4a una clase JhijaJ conocer el host/ usuario C contraseIa de una base de datosH !s una cuesti(n nétamente de seguridad9 "a que a una constante no se la puede de'inir como pri0ada " si se la quiere ocultar a las clases VhijasV9 no quedará otra alternativa que declararlas como propiedades estáticas. @os métodos mencionados ¿no son a caso métodos de un nuevo objeto llamado ?suario . .com'). . .POO y MVC en PHP + E"!enia Ba.com'). GPor (uB la clase est% de1inida como abstractaH ?na base de datos9 puede tener varios métodos9 como insertar datos/ editar datos/ eliminar datos o simplemente consultar datos.OO 1. Respuestas a "reguntas 8recuentes sobre el c$digo /. $usuarioQ->ape""ido .$ GPor (uB propiedades est%ticas C no constantes de claseH .et('"eiMmai". ' ha sido e"iminado'.or otro lado9 por cuestiones de seguridad9 se hac0a necesario no permitir instanciar esta clase desde ning7n lugar de la aplicaci(n " controlar con mucha precauci(n9 el acceso a sus métodos " propiedades9 "a que una base de datos9 es el ValmaV de toda aplicaci(n. >asados en el principio de modularidad de la .it $usuarioQ = new Usuario().orque a las constantes9 aunque l(gicamente guardan en s0 mismas la condici(n de VestáticasV en el sentido de que Vno pueden ser modi'icadasV9 pueden ser accedidas desde cualquier clase que herede de la clase que las declare. $usuarioQ->de"ete('"eiMmai". .& GPara (uB declarar propiedades est%ticasH !n principio9 tanto el host como el usuario C contraseIa de la base de datos9 en esta aplicaci(n9 son 7nicos. $e all09 que como caracter0stica se les asign( ser est%ticos9 a 'in de9 por cuestiones de seguridad9 no puedan ser modi'icados dinámicamente )tengamos en cuenta que una clase abstracta debe ser heredada s4 o s4 para ser utilizada*. / archivo9 es el que realiHa las instancias creando la cantidad de objetos necesaria. => E.

GPor (uB los mBtodos de consulta C ejecución son protegidos C no pAblicosH %onsultar una base de datos9 modi'icar o eliminar sus datos9 as0 como insertar nuevos9 no puede ser una tarea que se deje librada al aHar " al libre acceso de cualquiera.< GPor (uB haC mBtodos declarados como abstractos C adem%s protegidosH !sta pregunta9 en gran parte9 la responde la respuesta de la pregunta /.i necesitas insertar datos9 consultarlos o hacer con ellos otras actividades9 tienes métodos protegidos pero no privados9 que te permiten hacerlo.6 GPor (uB los mBtodos open C closeEconnection son pri0adosH . !sto9 da lugar a las clases hijas9 a que modi'iquen su visibilidad de acuerdo al criterio de cada una de ellas. 3a contraseIa es un dato (ue debe ser pri0ado.i lo haces9 deja de hacerlo. !l n7mero de I8/ ser4a como tu nAmero de documento o pasaporte. Respuestas a preguntas sobre la clase Lsuario &.# GPor (uB propiedades est%ticas C a la 0ez pri0adasH )ver respuestas anteriores* técnicamente hablando* "a que tal cual se e8plic( en la pregunta /. . !s necesario VprotegerV los datos a 'in de resguardar su integridad "9 la 'orma de hacerlo9 es VprotegerV los métodos que se encuentran al servicio de dichos datos.or ejemplo9 no podr0as negarte a mostrar tu pasaporte en migraciones.ero solo la clase hija9 podrá de'inirlos )reFde'inirlos $. . . negarte a decirle el . ./.in embargo9 $!>!. . <adie puede tener acceso a él.ues porque la clase es la 7nica con permiso para abrir " cerrar cone8iones a la base de datos. .9 solo ellas conocen los requerimientos espec0'icos. GPor (uB la clase Lsuario es una e7tensión de 8BAbstract)odelH @a clase usuario D6!<! necesariamente que heredar de $>Abstract#odel "a que $!>! utiliHar sus métodos )propios " de'inidos para acceder a la base de datos* " rede'inir obligadamente aquellos declarados como abstractos9 a 'in de continuar un modelo de administraci(n de los A># )altas9 bajas " modi'icaciones*. Ahora bien Gle das tu contraseIa a cual(uieraH .& G+on (uB 1in nombre/ apellido e eM mail son propiedades pAblicas mientras (ue cla0e es pri0ada C id/ protegidaH Pensemos esto como en la 0ida realF tu nombre9 apellido e eFmail9 puede ser necesario para cientos de VtrámitesV " acciones de tu vida diaria " no andas por la vida negándolos a todo quien te los pida. N l(gicamente9 todos necesitarán acceder " conocer los resultados de los datos arrojados por una consulta. !s un dato que debes mantener protegido pero que en algunos casos9 te será requerido " necesitarás darlo obligadamente.olo por las clases hijas de $>Abstract#odel ¿5ué sentido tendr0a permitir a un programador acceder a estas propiedades si puede ser la clase hija9 quien las controle 1. Dodos los m(dulos9 necesitarán ueries personaliHados para sus consultas.6< de tu tarjeta de crédito a cualquier persona. ..POO y MVC en PHP + E"!enia Ba. &.odr0amos decir9 que no tiene nada de malo (ue 1acilites pAblicamente estos datos/ a (uien decidas./. .it . !l hecho de que se de'inan como abstractos9 es porque necesariamente $!>!< ser métodos comunes a toda clase que los hereden. . !s decir9 que tanto la propiedad dbEname como (uerC C roKs9 deben tener permisos para ser le0das " modi'icadas9 pero WOjoX . . Algunos m(dulos pueden necesitar utiliHar una base de datos di'erente.e declaran además como protegidos9 por una cuesti(n de seguridad )Vpor las dudasV para que solo puedan ser vistos por clases heredadas*. ." G+on (uB sentido declarar las propiedades como protegidasH !s simple. !s una cuesti(n de seguirdad. !s una cuesti(n de control " seguridad.

.it &. Al tratarse de una $ .POO y MVC en PHP + E"!enia Ba. !s decir9 todos los seres humanos tenemos ciertas caracter0sticas en com7n " realiHamos acciones similares. Respuestas a preguntas sobre el archi0o de instancias $. clase que VrequiereV s0 o s09 de su clase madre9 no tendr0a sentido permitir que se contin7e ejecutando9 si no ha podido cargarse el archivo. B. &.eguramente9 de e8istir en el 'uturo una clase llamada . .# GPor (uB se utiliza re(uireEonce C no includeEonceH @a di'erencia entre include " require es que require9 si no puede incluir el archivo al que se está importando9 'rena la ejecuci(n del script9 siendo que include9 solo arroja un error9 pero contin7a la ejecuci(n.roducto9 ésta9 sobreescribirá el valor de db_name.ero cada uno de nosotros9 tiene una Anica identidad.or eso9 no puede decirse que se instancia cuadro veces el mismo objeto9 porque en realidad9 son cuatro objetos di'erentes donde cada uno de ellos9 tiene una identidad propia. GPor (uB el archi0o tiene cuatro instancias al mismo objetoH !s necesario hacer notar que si bien los objetos comparten propiedades C mBtodos en comAn/ no todos son idBnticos.$ GPor (uB se utiliza el mBtodo EEconstruct() para modi1icar el nombre de la base de datosH GPor (uB no se encarga la clase madre de modi1icar ese 0alorH !l nombre de la base de datos9 es algo que variará de acuerdo al módulo que lo esté trabajando. . #odi'icarlo automáticamente utiliHando un cosntructor9 nos asegura instanciar el objeto con un valor de propiedad adecuado.

it CAP-3ULO III :ntroducción al patrón arquitectónico MVC $& .POO y MVC en PHP + E"!enia Ba.

” . *ntroducci$n a la Arquitectura de .. @a respuesta es s0. 3 grandes rasgos$ puede decirse ue “ la Arquitectura de Software es la forma en la que se or ani!an los componentes de un sistema" interact#an y se relacionan entre s$ y con el contexto" aplicando normas y principios de dise%o y calidad" que fortale!can y fomenten la usabilidad a la ve! que de&an preparado el sistema" para su propia evolución”' Dal veH estés pensando “.o t9are ¿)ué es la arquitectura de so t9are? !s necesario aclarar9 que no e8iste una de'inici(n 7nica9 e8acta9 abarcativa e inequ0voca de Larquitectura de so'tCareM.ero si quieres poder aplicar de 'orma decuada el patr(n #G%9 debes hacer el es'uerHo de seguirlo con especial interés " actitud LentuciastaM..it Introducción al patrón Arquitectónico M ! #G%9 son las siglas de modeloM0istaMcontrolador )o en inglés9 modelFvieCFcontroller*9 que es uno de los tantos patrones de ar(uitectura de so1tKare.robablemente9 este cap4tulo sea el m%s complejo )" mucho más e8tenso en relaci(n al %ap0tulo 6*.al fin y al cabo$ me . @a bibliogra'0a sobre el tema es tan e8tensa como la cantidad de de'iniciones que en ella se puede encontrar.i bien no puede decirse o mejor dicho9 no es mu" académico decirlo9 vo" a tomarme el atrevimiento de mencionar solo dos tendencias ar(uitectónicas9 claramente di'erenciadas entre s0: • • @a Ar(uitectura de =o1tKare Orientada a Objetos )como Lingenir0aM de sistemas* @a Ar(uitectura Estructurada )como LdesarrolloM de una aplicaci(n* %omo podemos ver9 en este libro9 es a la primera a la cual nos en'ocamos.o t9are .ero9 no debes tomar lo anterior como una de1inición 9 sino como la 1orma en la (ue en este libro/ se abarca la ar(uitectura de so1tKare. .or lo tanto trataré9 no de de'inir la arquitectura de so'tCare9 sino más bien9 de introducir a un concepto simple " sencillo que permita comprender el punto de vista desde el cual9 este libro abarca a la arquitectura de so'tCare pero9 sin ánimo de que ello represente Luna de'inici(n másM.. :endencias de la Arquitectura de . . .POO y MVC en PHP + E"!enia Ba.a" dado una definición más. Antes de abordar de lleno este patr(n9 vamos a intentar hacer una introducci(n a la arquitectura de so'tCare9 desmembrándola de lo general hacia lo particular9 para al 'in llegar al detalle9 procurando entender e8actamente de que se trata9 en el conte8to adecuado. .robablemente no pude contenerme de hacerlo Q no lo niego F. . $$ ..

Caracter#sticas de la Arquitectura de . basada en patrones " la A.ero esto9 es mera 1iloso14a propia9 con la cual9 no he encontrado demasiado consenso. Dener una estructura que 'acilite la 'eusabilidad de la misma en 'uturos sistemas 6.er 'ácilmente )antenible )mantenibilidad* #. . =eguridad interna siendo capaH de impedir ataques9 usos no autoriHados9 etc. %uando estos atributos son satis'echos9 puede decirse )aunque en 'orma objetable*9 que la calidad del so'tCare es satis'actoria. +on1iabilidad dada por la constancia operativa " permanente del sistema 6. .orque independientemente de cual te agrade más9 si la A.POO y MVC en PHP + E"!enia Ba.or qué . Atributos de calidad inherentes al proceso de desarrollo del so'tCare <. Integrabilidad de los m(dulos independientes del sistema .uncionalidad requerida #.ues no los aburriré con ello e iremos a lo práctico. estructural9 implican necesariamente dos corrientes que deben aplicarse de 'orma optativa )o utiliHas una o la otra pero no las dos simultáneamente*9 mientras que la A. Aacilidad de ser =ometido a Pruebas que aseguren que el sistema 'alla cuando es lo que se espera )testeabilidad* $# . %apacidad de Portabilidad9 es decir que pueda ser ejecutado en diversos ambientes tanto de so'tCare como de hardCare ". %apacidad de +on1igurabilidad que el sistema otorga al usuario a 'in de realiHar ciertos cambios @. =eguridad e7terna evitando la pérdida de in'ormaci(n debido a errores del sistema . +on1idencialidad9 puesto que se debe evitar el acceso no autoriHado al sistema B..it A 'in de satis'acer la inquietud de curiosos )" de paso9 no ocultar que e8isten*9 vo" a mencionar la e8istencia de otras dos corrientes: la ar(uitectura basada en patrones " la ar(uitectura basada en procesos C metodolog4as. %apacidad de Interoperar con otros sistemas )interoperabilidad* &. . %apacidad de permitir ser )odi1icable a 'uturo )modi'icabilidad* $. 8isponibilidad de uso &. #antener un diseEo arquitect(nico Escalable que permita su ampliaci(n )escalabilidad* . 8esempeIo del sistema con respecto a 'actores tales como la capacidad de respuesta ". orientada o objetos o la A. Integridad de la in'ormaci(n asociada .o t9are6 Atributos de calidad @a +alidad del =o1tKare puede de'inirse como los atributos impl4citamente re(ueridos en un sistema (ue deben ser satis1echos . basada en procesos9 pueden utiliHarse como complemento de las dos primeras.. .. Atributos de calidad que pueden observarse durante la ejecución del so'tCare .ersonalmente9 no las considero como cuatro corrientes ¿. %umplimiento de la . !stos atributos9 se gestan desde la arquitectura de so'tCare que se emplea9 "a sea cumpliendo con aquellos requeridos durante la ejecuci(n del so'tCare9 como con aquellos que 'orman parte del proceso de desarrollo de éste.

Tstos9 son los que en de'initiva9 aportarán LcalidadM al sistema resultante. • El Patrón Ar(uitectónico es el nivel en el cual la arquitectura de so'tCare: ◦ $e'ine la estructura básica de un sistema9 pudiendo estar relacionado con otros patrones ◦ Representa una plantilla de construcción que provee un conjunto de subsistemas aportando las normas para su organi"ación ◦ E!emplos4 +apas$ 56+$ 7uber8as y 9iltros$ &i"arra$ etc.POO y MVC en PHP + E"!enia Ba. Relaci$n y Di erencia !stilo Arquitect(nico9 . • El Patrón de 8iseIo es el tercer nivel de abstracci(n de la arquitectura de so'tCare9 cu"a 'inalidad es la de precisar en detalle los subsistemas y componentes de la aplicaci(n ◦ !jemplos: &roxy$ +ommand$ 9actory$ etc. N si lo que $" . Aclarciones previas Antes de caer inmersos en el conocimiento sobre el patr(n #G%9 quiero dejar en claro que en este libro9 no hará re'erencia a ning7n 'rameCorO. $e hecho9 no se trata de rein0entar la rueda/ sino de crear una/ adaptada a nuestras necesidades.atr(n Arquitect(nico " . !n lo sucesivo9 trataremos de establecer la di'erencia entre estos tres conceptos9 viendo como los mismos9 se relacionan entre s09 'ormando parte de un todo: la arquitectura de so'tCare. El "atr$n Arquitect$nico !odelo<vista<controlador %M=C& 2abiendo dejado en claro de qué hablamos e8actamente cuando nos re'erimos a Lpatr(n arquitect(nicoM9 estamos en condiciones de ahondar en los detalles del patr(n #G%. en (-( no es el de 1ormar a programadores en el uso de 1rameKorNs9 sino que el mismo9 parte de una clara pregunta ¿a caso los 'rameCorOs no han sido desarrollados por programadores Denemos la alternativa de utiliHar 'rameCorOs para ahorrar tiempo de programaci(n o9 si realmente nos apasiona programar/ ad(uirimos los conocimientos necesarios/ tenemos la capacidad C nos animamos/ podemos crear nuestros propios 1rameKorNs.o !8iste una di'erencia entre Estilo Ar(uitectónico/ Patrón Ar(uitectónico C Patrón de 8iseIo9 que debe marcarse a 'in de evitar las grandes con'usiones que inevitablemente9 conclu"en en el mal entendimiento " en los resultados poco satis'actorios..it De lo general a lo particular6 del estilo arquitect$nico al patr$n de dise. !l objeti0o de ()) y *+.atr(n de $iseEo9 representan9 de lo general a lo particular9 los niveles de abstracci(n que componen la Arquitectura de . !n este sentido9 puede decirse que: • El Estilo Ar(uitectónico es el encargado de: ◦ $escribir la estructura general de un sistema9 independientemente de otros estilos ◦ $e'inir los componentes del sistema9 su relaci(n e interactividad ◦ !jemplos: flu!o de datos$ llamada y retorno$ etc.o'tCare.

i quieres reparar un mueble te llevará más tiempo repararlo que ir a comprar uno nuevo. • • ¿C$!o unciona el patr$n M=C? !l 1uncionamiento b%sico del patrón )*+9 puede resumirse en: • • • !l usuario realiza una petición !l controlador captura el e0ento )puede hacerlo mediante un manejador de eventos Q . !l tiempo9 es discutible.POO y MVC en PHP + E"!enia Ba. N si eres ebanista9 seguramente te llevará menos tiempo hacer un nuevo mueble que ir a comprarlo. ¿)ué es el patr$n M=C? !l patr(n #G% es un patrón de ar(uitectura de so1tKare encargado de separar la lógica de negocio de la inter1az del usuario " es el más utiliHado en aplicaciones Keb9 "a que 'acilita la 'uncionalidad9 mantenibilidad " escalabilidad del sistema9 de 'orma simple " sencilla9 a la veH que permite “no me"clar lengua!es de programación en el mismo código”. !s quien controla las interacciones del usuario solicitando los datos al modelo " entregándolos a la vista para que ésta9 lo presente al usuario9 de 'orma Lhumanamente legibleM. *istaF es la encargada de mostrar la in'ormaci(n al usuario de 'orma grá'ica " Lhumanamente legibleM.it necesitamos es una rueda para acoplar a un mueble que acabamos de crear ¿cuál ser0a el sentido de intentar modi'icar una rueda de cami(n si tenemos todas las herramientas necesarias para ser LcreadoresM " no Lmodi'icadoresM %laro que esto9 depende de la pasi(n9 gusto9 capacidad " por qué no9 de la ambici(n de cada uno. !s el encargado de accesar de 'orma directa a los datos actuando como LintermediarioM con la base de datos.. . al igual que también tienes la de crear. #G% divide las aplicaciones en tres niveles de abstracci(n: • )odeloF representa la l(gica de negocios. +ontroladorF es el intermediario entre la vista " el modelo.. $e todas 'ormas9 la alternativa de modi'icar9 siempre la tienes. @o que en nuestro ejemplo de programaci(n orientada a objetos9 ser0an las clases $>Abstract#odel " ?suario. . .ervice9 etc.* e'ectuando las modi'icaciones pertinentes sobre el modelo !l modelo ser% el encargado de interactuar con la base de datos9 "a sea en 'orma directa9 con una capa de abstracci(n para ello9 un Keb .ues puede demandarte más tiempo modi'icar algo que "a e8iste9 que crearlo.ues sabes e8actamente lo que necesitas " como hacerlo " eso9 hará que ahorres el tiempo de recorrer todas las muebler0as " termines comprando Lel mueble que más se asemeje al que quieresM.andler F9 por ejemplo* 2ace la llamada al modelo/modelos correspondientes )por ejemplo9 mediante una llamada de retorno Q callbac: . Dodo dependerá del criterio de elecci(n que apliques " sea cual sea9 tu elecci(n será la correcta9 justamente porque habrás LelegidoM " eso9 es lo más importante. " retornará esta in'ormaci(n al controlador $6 • . !l mueble9 será similar9 pero no e8actamente igual al que tu imaginaste.

.uncionamiento del patrón modelo/vista/controlador $. .POO y MVC en PHP + E"!enia Ba. 3a lógica de la 0ista/ una 0ez procesados los datos/ los 5acomodar%6 en base al diseIo de la OLI M layout P C los entregar% al usuario de 'orma Lhumanamente legibleM.it • • !l controlador recibe la in1ormación C la en04a a la 0ista @a vista9 procesa esta in'ormaci(n pudiendo hacerlo desde el en'oque que veremos en este libro9 creando una capa de abstracci(n para la l(gica )quien se encargará de procesar los datos* " otra para el diseEo de la inter'aH grá'ica o I?6.

andler para manejar los eventos del usuario.POO y MVC en PHP + E"!enia Ba. . $< .racticidad para evolucionar .it 2asta qu09 hemos hablado de estilos arquitect(nicos9 nos hemos introducido en uno de los patrones arquitect(nicos )#G%* pero9 en todo esto Gen (uB momento inter0ienen los patrones de diseIoH !s aqu0 donde debemos notar que éstos9 intervienen en la 'orma en la que cada capa )modelo9 vista " controlador*9 LdiseEaM su estructura.encilleH " simplicidad Aácil mantenibilidad . .i se tienen en cuenta estas tres premisas9 el resultado de un c(digo limpio9 legible " 'ácil de interpretar para cualquier programador9 estará -:Y asegurado.i para llamar al modelo9 utiliHa un callbac:9 estar0a utiliHando otro9 " as0 en lo sucesivo.ersonalmente9 sugiero que9 a no ser que se trate de sistemas realmente robustos " complejos9 no se compliquen demasiado P por ahora M en LaplicarM todos " cada uno de los patrones de diseEo que encuentren en el camino. !n ese caso9 estar0a optando por un patrón de diseIo. !l controlador decidirá )aunque en realidad9 nosotros lo haremos* si utiliHará un . @a 'orma de hacerlo bien9 es: • • • .

POO y MVC en PHP + E"!enia Ba.it CAP-3ULO IV El patrón MVC en PHP $@ .

7odos los m%todos declarados en una interfa" deben ser public$ ya ue %sta es la naturale"a de una interfa".” <[. Al 'inal de este cap0tulo9 vamos a encontrar ejercicios prácticos de autoevaluaci(n " luego9 continuaremos trans'ormando " ampliando nuestro primer ejemplo del %ap0tulo 669 siguiendo el patr(n arquitect(nico #G%9 con sus correspondientes comentarios " aclaraciones.2.redientes() { $this->in.uente de la cita2 !ttp233p!p)net3manual3es3language)oop5)interfaces)p!p #.it "l Patrón M ! en PHP . *nter aces en "'"6 un nuevo concepto para crear !odelos !n esta etapa9 podemos ampliar las re'erencias de . !l )anual O1icial de P!P describe las inter'aces de la siguiente 'orma: “Las interfaces de ob!etos permiten crear código con el cual especificar u% m%todos deben ser implementados por una clase$ sin tener ue definir cómo estos m%todos son manipulados.2. .ara que el concepto de modeloFvistaFcontrolador nos queda más claro9 vamos a ir analiHándolo con ejemplos concretos9 en el lenguaje que impulsa este libro: ..POO y MVC en PHP + E"!enia Ba. public function set_in.] ?na inter'ace se de'ine utiliHando la palabra clave interface " se la implementa utiliHando la palabra clave implements. Oeneramos la inter1aceF interface Postre { public function set_in. Las interfaces son definidas utili"ando la palabra clave interface$ de la misma forma ue con clases estándar$ pero sin m%todos ue tengan su contenido definido. !l modelo9 no es más que el conjunto de clases con las que hemos trabajado hasta ahora9 inclu"endo entre ellas9 la capa de abstracci(n de la base de datos.redientes = arra:(). El !odelo %on respecto al modelo9 no tenemos demasiada novedad..redientes().9 incorporando un nuevo concepto: las inter1aces. !n varias ocasiones9 las inter'aces nos servirán para ampliar los modelos. } Implementamos la inter1aceF class CiBcochue"o implements Postre { var $in.redientes = arra:('harina'=>'2 taBas'$ '"eche'=>'# taBa'$ ? ..

!sta di'erencia9 radica en que las clases abstractas" no de&an de ser “clases”" las cuales representan la “abstracción de un ob&eto” si uiendo un orden de “relación &erarqu$ca” entre ellas0 %lase > hereda de %lase A " %lase % hereda de %lase >9 pero no puede tener herencias m7ltiples9 es decir no puede heredar de más de una clase9 "a que ellas9 guardan una relaci(n de orden jerárquico entre s0.redientesE'escencia de /aini""a'F = 'a .POO y MVC en PHP + E"!enia Ba.redientes().or implements Postre { public function set_in.redientes().it 'aBucar'=>'# taBa'$ 'hue/o'=># ). class * { } class C extends class * { } #correcto class ) extends class C { } #correcto class ' { } #correcto class 6 extends class *$ class ' { } # incorrecto!!! no se puede hacer!!! # lo correcto ser2a3 class ' extends class * { } class 6 extends class ' { } # . } function __construct() { parent11set_in.redientes(). sopera'$ 'coco ra""ado'=>'# cdta. } } E7tendemos una clase ((ue por de1ecto/ implementar% la inter1ace)F class CiBcochue"oLaini""a extends CiBcochue"o { public function set_in.robablemente te preguntes Gcu%l es la di1erencia entre una inter1ace C una clase abstractaH %réeme: todos nos lo hemos preguntado alguna veH :* !n principio9 e8iste una di1erencia conceptual que a niveles LprácticosM tal veH no es del todo clari'icadora. } } $i'erencia entre 6nter'aces " %lases abstractas . } } 2ambiBn podemos crear otra clase (ue implemente la inter1aceF class *">a. $this->set_in.redientes = arra:('5apas de maiBena' => 2$ 'du"ce de "eche'=>'# cda. } function __construct() { $this->set_in.redientes() { $this->in. de te').usto'.redientes() { $this->in.

• • • @o que <O deben hacer las inster'aces 3as inter1aces no puedenF • 2ener el mismo nombre (ue una clase ). @as clases abstractas9 pueden tener métodos abstractos tanto p7blicos como protegidos )aquellos que deberán ser obligatoriamente rede'enidos por las clases que la hereden* " métodos privados que solo ella utilice.POO y MVC en PHP + E"!enia Ba. A tal 'in9 divideremos la vista en dos subFcapas: la I?6 propiamente dicha " su l(gica. $e hecho9 una misma clase9 puede implementar m7ltiples inter'aces: interface * { interface C { interface ) { class (i)"ase } } } implements *$ C$ ) { } <o obstante la di'erencia conceptual9 podemos establecer claras di1erencias pr%cticas 9 que nos a"udarán a asimilar mejor estos conceptos: • 3as inter1aces no pueden de1inir propiedades )de hecho9 no poseen propiedades porque a di'erencia de las clases abstractas no tienen relaci(n con un objeto9 " solo los objetos tienen propiedades* 3as inter1aces no pueden tener mBtodos de1inidos con su algoritmo correspondiente )solo pueden declarar los métodos pero no pueden indicar el LquéM ni el Lc(moM hacerlo9 mientras que las clases abstractas9 s0 pueden* 3as inter1aces no pueden instanciarse por(ue no tienen re1erencias asociadas a objetos9 mientras que las clases abstractas no pueden instanciarse9 porque sus objetos son Lentes abstractosM que necesitan de una clase no abstracta para de'inirse con e8actitud " poder ser instanciados. 2odos los mBtodos declarados en una inter1ace deben ser pAblicos 9 puesto que la 'inalidad de una inter'ace9 es brindar un Lámbito p7blico de un modeloM.2.2. como una LreFdeclaraci(n de claseM* $i'erentes inter'aces no pueden tener nombres de mBtodos idBnticos si serán implementadas por la misma clase • 7a vista %omo hemos visto anteriormente9 la vista representa la inter'aH grá'ica del usuario )I?6*9 es decir9 es la encargada de mostrar la in'ormaci(n al usuario de manera Lhumanamente legibleM. #& . %rear una inter'ace con el mismo nombre que una clase9 ser0a interpretado por . las interpreta como una clase más.it A di'erencia de las clases abstractas9 conceptualmente9 las interfaces son solo un con&unto de métodos caracter$sticos de diversas clases 9 independientemente de la relaci(n que dichas clases mantengan entre s0.

$e esta 'orma9 obtenemos varias ventajas de trabajar con el patr(n #G%: • 3os archi0os est%ticos )2D#@9 %.@# 5ransitiona"TT6&H Hhttp1TT888. . %omo LarquitectosM9 debemos tener preparada la estructura de nuestra aplicaci(n9 para que diseEadores puedan trabajar libremente en la I?69 sin tener que acceder al c(digo .2..dtdH> <html "an.upongamos que tenemos una plantilla 2D#@9 donde lo que necesitamos reemplaHar de manera dinámica9 es: t4tulo de la p%gina/ NeCKords C descripción .. !n este libro9 0eremos además9 como e0itar por completo (ue los diseIadores tengan (ue implementar código P!P en sus OLI " que programadores9 tengamos que implementar c(digo 2D#@ en nuestras l(gicas.9 imágenes e incluso Pava.cript* pueden almacenarse en un ser0idor independiente con todos los bene'icios que esto conlleva )al igual que sucede con las bases de datos9 los archivos estáticos también pueden independiHarse* -os aseguramos de (ue el código est%tico )aquel desarrollado por diseEadores*9 no 5rompa6 el nAcleo de la aplicación Permitimos a los diseIadores trabajar cómodamente en la libertad de aplicar todos los conocimientos " herramientas inherentes a su área de conocimiento9 sin la presi(n de tener que implementar un lenguaje de programaci(n que desconocen9 les es poco 'amiliar o simplemente9 la herramienta que utiliHan para diseEar9 suele daEarles el c(digo noFestático • • !n segundo lugar9 cada plantilla Q template F o archivo 2D#@9 deber% hacer re1erencia 5est%tica6 a los datos (ue se (uieran reemplazar din%micamente .9 etc.=HesH> <head> <meta http-eDui/=H)ontent-5:peH content=Hte?tThtm". @a mejor manera de re'erenciar a estos datos9 'acilitando la tarea a un diseEador9 es haciendo una re'erencia te8tual a éstos. charset=ut>-UH> <tit"e> T!tulo de la "á#ina$<Ttit"e> #$ . .8R..T5JThtm"QT"oose. .it =ista6 la inter a> grá ica Ieneralmente9 en la práctica9 no somos los programadores quienes nos hemos de encargar de la I?6. !n principio9 la parte gr%1ica de las vistas )archivos 2D#@9 imágenes9 %. Geremos aqu0 como hacer re'erencia a estos datos9 " más adelante9 veremos como la l(gica de la vista se encargará de renderiHarlos.POO y MVC en PHP + E"!enia Ba.*9 deber% tener un directorio reser0ado solo para ella.ara que a la veH9 los programadores logremos di'erenciar que all0 se inclu"en datos dinámicos9 una buena práctica9 es encerrar esa re'erencia te8tual entre llaves.or. !s tarea que corresponde a diseEadores Keb o grá'icos9 seg7n aplique. Geamos un ejemplo: <G'3)5SP6 HTML PUCI2) H-TTKR)TT'5' +5(I Q.ara esto9 no será necesario implementar c(digo que no sea 2D#@.

htm"').o. .2.eH> <div id=HcabH> <im# a"t=Hhome pa.ramaciWn orientada a ob. =egundo pasoF obtener la plantilla 2D#@ .ara un diseEador9 será una tarea sencilla. 7a 7$gica de la =ista Denemos la plantilla que cre( nuestro diseEador. para recorrer el diccionario9 " la 'unci(n str_replace)* de .2.9 para reemplaHar los ## .T"o. 2ercer pasoF reemplaHar el contenido !n el ante7ltimo paso9 reemplaHaremos los datos9 utiliHando el bucle foreach de .ma de "a pro.it <meta name=Htit"eH content=H T!tulo de la "á#ina$H> <meta name=H9e:8ordsH content=H %e&words$H> <meta name=HdescriptionH content=H descripci'n$H> <"in9 t:pe=Hte?tTcssH re"=Hst:"esheetH hre>=HcssTtemp"ate.ina'=>'P33 : (L) en P+P'$ '9e:8ords'=>'poo$ m/c$ php$ arDuitectura de so>t8are'$ 'description'=>'6" paradi. $diccionario = arra:( '5Vtu"o de "a P7..eH src=Him. 2aremos esto9 paso a paso9 como si de una receta de cocina se tratara.9 " almacenar el contenido de ella9 en una variable. Primer pasoF crear un diccionario de datos !l diccionario de datos es el que contendrá9 literalmente hablando9 un diccionario9 indicando cuales re'erencias deben ser reemplaHadas por cuáles datos9 en 'orma dinámica.POO y MVC en PHP + E"!enia Ba. !s hora de reemplaHar dinámicamente los datos re'erenciados.et_contents('TcarpetaTtemp"ate.i>H><Ta> <Tdiv> <div id=HcontenidoH> <h(> T!tulo de la "á#ina$<Th(> <Tdiv> <Tdiv> <Tbod&> <Thtml> %omo podemos ver9 en la plantilla 2D#@ solo ha" c(digo 2D#@. Geremos en el siguiente paso9 como la l(gica de la vista9 se encargará de reemplaHar estos datos.2.etos con e" patrWn arDuitectWnico (L) en P+P' ).cssH> <Thead> <bod&> <div id=Hpa. $temp"ate = >i"e_.ara traer la plantilla 2D#@9 vamos a utiliHar la 'unci(n file_#et_contents)* de .

>oreach ($diccionario as $c"a/e=>$/a"or) { $temp"ate = str_rep"ace('{'.T"o.cssH> <Thead> <bod&> <div id=Hpa..=HesH> <head> <meta http-eDui/=H)ontent-5:peH content=Hte?tThtm". print $temp"ate.T5JThtm"QT"oose. .i>H><Ta> <Tdiv> <div id=HcontenidoH> <h(>P33 : (L) en P+P<Th(> <Tdiv> <Tdiv> <Tbod&> <Thtml> El controlador !l controlador9 aunque muchos de ustedes no lo crean9 es quien tal veH9 lleva Lla peor parteM. } +uarto pasoF mostrar el contenido 'inal al usuario . !n muchas ocasiones9 es complicado programar el controlador de manera previsible para que pueda evolucionar9 " generalmente9 es sometido a re'actoriHaciones constantes9 incluso ma"ores que las que puede su'rir el modelo.8R.POO y MVC en PHP + E"!enia Ba.$c"a/e.or 7ltimo9 imprimiremos el resultado obtenido en pantalla.'}'$ $/a"or$ $temp"ate). 5ué " cuáles propiedades o atributos del modelo/modelos modi'icar o parámetros #" .eH> <div id=HcabH> <im# a"t=Hhome pa. charset=ut>-UH> <tit"e>P33 : (L) en P+P<Ttit"e> <meta name=Htit"eH content=HP33 : (L) en P+PH> <meta name=H9e:8ordsH content=Hpoo$ m/c$ php$ arDuitectura de so>t8areH> <meta name=HdescriptionH content=H6" paradi.ramaciWn orientada a ob.ma de "a pro.dtdH> <html "an.etos con e" patrWn arDuitectWnico (L) en P+PH> <"in9 t:pe=Hte?tTcssH re"=Hst:"esheetH hre>=HcssTtemp"ate.it mismos.o. Recordemos que el controlador9 es quien debe interactuar con el modelo " con la vista.ara hacerlo9 deberá previamente reconocer " manejar los distintos eventos del usuario9 para saber: /.or. N con esto9 habremos concluido la l(gica de la vista9 obteniendo en el navegador del usuario9 la siguiente salida )vista de c(digo 'uente*: <G'3)5SP6 HTML PUCI2) H-TTKR)TT'5' +5(I Q.@# 5ransitiona"TT6&H Hhttp1TT888. A qué modelo / modelos invocar 1.eH src=Him.

8R.or. } } class (ode"o'os { var $propiedad_#.eH> <p>6" /a"or de "a <b>propiedad<Tb> es <b>{propiedad}<Tb><Tp> <Tdiv> <Tbod&> <Thtml> 7emplate vista13'html <G'3)5SP6 HTML PUCI2) H-TTKR)TT'5' +5(I Q.or.=HesH> <head> <meta http-eDui/=H)ontent-5:peH content=Hte?tThtm". Geamos paso a paso9 como a"udar a este pobre LcontrollerFmanM en su tarea.T5JThtm"QT"oose.POO y MVC en PHP + E"!enia Ba. function b($param#$ $param2) { $this->propiedad_# = $param#. var $propiedad_2.@# 5ransitiona"TT6&H Hhttp1TT888. A qué vista entregar la in'ormaci(n W.it deberá entregar a sus métodos B. function a($parametro) { $this->propiedad = $parametro.dtdH> <html "an.8R.dtdH> #6 . $this->propiedad_2 = $param2. .obre hombreX @e toca una tarea e8tenuante.ivo models'php class (ode"oUno { var $propiedad. charset=ut>-UH> <tit"e>Lista (ode"o #<Ttit"e> <Thead> <bod&> <div id=Hpa. } } N a la veH9 tenemos dos vistas: 7emplate vista12'html <G'3)5SP6 HTML PUCI2) H-TTKR)TT'5' +5(I Q.T5JThtm"QT"oose.@# 5ransitiona"TT6&H Hhttp1TT888.upongamos entonces9 que tenemos dos modelos: 3rc.

} function render_data($/ista$ $data) { $htm" = ''. } return $identi>icadores. charset=ut>-UH> <tit"e>Lista (ode"o 2<Ttit"e> <Thead> <bod&> <div id=Hpa.$c"a/e. brea9. i>($diccionario) { $htm" = >i"e_.et_contents('htm"T'.POO y MVC en PHP + E"!enia Ba. i>(($/ista)XX($data)) { $diccionario = armar_diccionario($/ista$ $data).'}'$ $/a"or$ $htm"). i>($/ista) { s8itch ($/ista) { case '/ista_#'1 $identi>icadores = arra:('propiedad'). $identi>icadores = set_identi>icadores($/ista).ivo view'php function set_identi>icadores($/ista) { $identi>icadores = arra:().it <html "an. >oreach ($diccionario as $c"a/e=>$/a"or) { $htm" = str_rep"ace('{'.$/ista. case '/ista_2'1 $identi>icadores = arra:('propiedad_#'$ 'propiedad_2').=HesH> <head> <meta http-eDui/=H)ontent-5:peH content=Hte?tThtm".htm"'). . } } #. brea9.'. i>($identi>icadores) { >oreach ($identi>icadores as $identi>icador) { i>(arra:_9e:_e?ists($identi>icador$ $data)) { $diccionarioE$identi>icadorF = $dataE$identi>icadorF.eH> <p>6" /a"or de <b>propiedad_#<Tb> es <b>{propiedad_#}<Tb> mientras Due e" de <b>propiedad_2<Tb> es <b>{propiedad_2}<Tb><Tp> <Tdiv> <Tbod&> <Thtml> N la l(gica de éstas9 es la siguiente: 3rc. } } function armar_diccionario($/ista$ $data) { $diccionario = arra:(). } } } return $diccionario.

%on el evento Len la manoM9 se ocupará ahora de identi'icar el modelo: function identi>icar_mode"o($/ista) { i>($/ista) { s8itch ($/ista) { case '/ista_#'1 $mode"o = '(ode"oUno'. . .I!DM .rimero9 identi'icará el evento respondiendo a las siguientes preguntas: • • ¿e8iste el evento de llamada mediante LZ. case '/ista_2'1 $mode"o = '(ode"o'os'. i>($_N65) { i>(arra:_9e:_e?ists('/ista'$ $_N65)) { $/ista = $_N65E'/ista'F. brea9.i e8iste ¿a qué evento9 el usuario9 quiere que responda . } !ntonces9 nuestro controlador procederá de la siguiente 'orma: Primer pasoF identi'icar el modelo .ara esto9 utiliHará la siguiente 'unci(n: function capturar_e/ento() { $/ista = ''.ara ello9 la 'orma de pensarlo Lin'ormáticamenteM ser0a: si usuario Qe0entoR entonces Qrealizar acciónR !n nuestro caso9 los eventos admitidos9 serán llamdas por ?R@ mediante el método Z. default1 e?it(). brea9. } } return $/ista. } #< .it } print $htm".I!D. } } return $mode"o. } $evolviendo as09 el evento capturado a través de la variable LZvistaM.ara esto9 el controlador previamente9 tendrá que reconocer el evento que ejecuta el usuario " saber como manejarlo.POO y MVC en PHP + E"!enia Ba.

return $data.i el usuario ingresara en la ?R@ http://servidor/controller. sett:pe($data$ 'arra:'). Ahora9 solo resta invocarlo " modi'icarlo si es necesario: function in/ocar_mode"o($mode"o) { i>($mode"o) { reDuire_once('mode"s.data)* " la vista automáticamente9 estará en condiciones de mostrar los resultados en pantalla al usuario: en/iar_data(). i>($/ista) { $mode"o = identi>icar_mode"o($/ista). } } } } !l controlador9 solo deberá llamar a su propia 'unci(n enviar.php vista[vista. . render_data($/ista$ $data).i ingresara en http://servidor/controller.php'). $data = new $mode"o().php no verá nada en pantalla. #@ . i>($mode"o) { $data = in/ocar_mode"o($mode"o). .POO y MVC en PHP + E"!enia Ba.ara hacerlo9 utiliHará una 'unci(n donde preparará esta in'ormaci(n para al 'in enviarla: function en/iar_data() { $/ista = capturar_e/ento(). } #las modi%icaciones al modelo se har2an aqu2 } 2ercer pasoF enviar la in'ormaci(n a la vista Ainalmente9 nuestro controlador9 enviará la in'ormaci(n obtenida del modelo9 a la vista.1 verá lo siguiente: Ahora9 es momento de autoFevaluar lo que hemos aprendido " luego9 completar nuestro primer ejemplo para 'inaliHar nuestro aprendiHaje. i>($data) { reDuire_once('/ie8.php'). .it =egundo pasoF invocar al modelo e'ectuando los cambios adecuados <uestro controlador9 "a sabe a que modelo recurrir.

el modelo es un intermediario entre la $ista " el controlador ".POO y MVC en PHP + E"!enia Ba.erencia. funcionalidad.it Ejercicios Prácticos Geamos cuanto aprendimos sobre los cap0tulos 666 " 6G.1) ¿Qu es 56$" a) Un patrón de diseño b) Un patrón arquitectónico c) Un paradigma de programación d) Un estilo arquitectónico (. encapsulamiento " disponibilidad b) Herencia. abstracción. . seguridad " aislamiento c) 3isponibilidad.() 9ndica 6 :. seguridad.erdadero) o ) :'also) seg<n corresponda a) 5 6 Un patrón arquitectónico es el encargado de describir la arquitectura general de un sistema b) 5 6 Un patrón arquitectónico representa una plantilla de construcción que pro$ee un con unto de subsistemas " su forma de organi2ación c) 5 6 (stilo arquitectónico " patrón arquitectónico son dos ni$eles de abstracción diferentes de la arquitectura de software d) 5 6 (n %&C. interoperabilidad " portabilidad d) 4odas las anteriores (. Ejercicio Nº(: $onceptos de *r&uitectura% 56$ 7 P-P (.citos en la ar&uitectura de so't8are" a) Polimorfismo. .#) ¿$uál de las siguientes opciones% corresponde a atributos de calidad impl.

+uego% en.1) ¿$uál de las siguientes a'irmaciones es . no deben estar codificados ) 5 6 Las propiedades declaradas en las interfaces deben tener $isibilidad pública (.=) En captura 56$% el el usuario reali>a una el petición 7 el 4444444444444 al &ue debe e. " .ocar 7 al cual reali>ar las modi'icaciones.it e) 5 6 (n %&C el controlador es el encargado de capturar los e$entos del usuario f) 5 6 (n %&C es recomendable me2clar código PHP " H4%L g) 5 6 Una interface en PHP es lo mismo que una clase abstracta .a esta in'ormación a 4444444444444.POO y MVC en PHP + E"!enia Ba.erdadera" a) Las interfaces no pueden definir propiedades b) 4odos los m!todos declarados en una interface deben ser públicos c) Las interfaces no pueden instanciarse porque no tienen referencias asociadas a ob etos d) Las interfaces no pueden tener m!todos definidos con su algoritmo correspondiente e) 4odas las opciones son correctas (..ento% identi'icando 4444444444444 in.) 5 6 Las clases abstractas en PHP cuplen la misma función que las interfaces i) 5 6 Una interface solo debe declarar los m!todos pero !stos.

POO y MVC en PHP + E"!enia Ba.a" errores "& .it Ejercicio Nº1: ?e.1) ¿$uál de las siguientes declaraciones es incorrectas" a) class Naseosa extends Cebida implements Producto$ Cebida4in*"coho" b) class Naseosa extends Cebida4in*"coho"$ CebidaNasi>icada implements Cebida$ Producto d) class Naseosa implements Cebida 1.() ¿$uál es el error en el siguiente código" interface Producto { } class Cebida extends Producto { } a) Ni la clase ni la interface tienen código b) 3onde utili2a 7e8tends7 deber'a utili2ar 7implements7 c) No .isando código 1.a" errores 1.#) ¿$uál es el error del siguiente código" interface Producto { } class Producto implements Producto { } a) La clase no puede tener el mismo nombre que la interface b) Ni la clase ni la interface tienen código c) No .

POO y MVC en PHP + E"!enia Ba. @uego9 env0a esta in'ormaci(n a la vista.it .&F respuesta c Pregunta $.oluciones a los ejercicios ? y @ Ejercicio 12? Pregunta $. Ejercicio 12@ Pregunta #."F !n #G%9 el usuario realiHa una petici(n " el controlador captura el evento9 identi'icando el modelo al que debe invocar " al cual realiHar las modi'icaciones.&F respuesta a Pregunta #. F respuesta b Pregunta #.$F A *erdadera . O ! I J J S Pregunta $. F respuesta b Pregunta $.$F respuesta c "$ .#F respuesta e Pregunta $.alse J B J + J J 8 E J J J J .

Es necesario (ue tengamos en cuenta/ (ue -O =IE)P'E la estructura C organización de directorios C archi0os puede predecirse. 1e e!emplifica todo a uello ue es relevante en la &22 ba!o el el patrón ar uitectónico 56+. %omenHaremos entonces9 por crear la siguiente estructura de directorios: "# . Piensa en cuando 0as al supermercado.it Programación Real !on el patrón M ! Gamos a retormar ahora9 nuestro ejemplo del AB) de usuarios que comenHamos a programar en el cap0tulo 66. .POO y MVC en PHP + E"!enia Ba.or eso9 no se debe tener miedo de comenHar programando con grandes estructuras de c(digo " hasta incluso9 por qué no9 VdesprolijasV. 'ealizas las compras de todo lo (ue necesitas C las lle0as a tu casa en bolsas C generalmente/ con la mercader4a desorganizada. Ouardar%s los alimentos (ue re(uieran re1rigeración/ en la heladeraT los congelados en el 1reezerT los art4culos de tocador en tu 9+T etc. Nótese ue los m%todos respectivos .an sido resumidos no encontrándose en %stos$ extensos algoritmos de validación de datos. . Lna 0ez (ue lo tienes/ comienzas a organizarlo.rocederemos a ampliarlo " adaptarlo9 seguiendo la estructura del patr(n #G%. Por el contrario/ a medida (ue una aplicación a0anza/ =IE)P'E es recomendable re1actorizar el código al mismo ritmo (ue el sistema e0oluciona. Estructura de directorios Na estamos en una etapa más avanHada9 donde no basta con crear archivos. Pero tienes todo lo (ue necesitas. @a siguiente estructura de directorios que propondré para adaptar nuestro ejemplo9 puede servir de punto de partida para la arquitectura de una aplicaci(n compleja de gran robusteH. N aqu09 es donde debemos considerar9 la metodolog0a que utiliHaremos para gestionar nuestro pro"ecto. <uestro primer ejemplo de Vprogramaci(n realV del cap0tulo 669 será ampliadoR agregaremos más archivos " se hace necesario organiHarlos de 'orma tal9 que pueda respetarse la sencilleH " los bene'icios que el patr(n #G% nos brinda. <o se debe tener miedo de agilizar la ar(uitectura de so1tKare " pensarla adaptati0amente. ?na de las prácticas técnicas propuesta por E7treme Programming9 nos induce a realiHar una re'actoriHaci(n constante del c(digo9 algo que9 desde mi punto de vista9 nos dará mejores resultados a la hora de pensar una arquitectura adecuada.

"e_Duer:() incorporará una validaci(n que solo permitirá proceder con sus 'unciones9 si recibe sus parámetros a través variables $_P345. !n él9 almacenaremos los archivos correspondientes al modelo9 la l(gica de la vista " el controlador9 e8clusivos del m(dulo de usuarios. Agregaremos la propiedad $mensa. private $conn. private static $db_pass = 'contrase!a'.it coreF el prop(sito de este directorio9 será almacenar todas aquellas clases9 . # métodos abstractos para )*M de clases que hereden abstract protected function . protected $db_name = 'm:db'. 1.e9 a 'in de que el objeto9 pueda comunicarse a través de mensajes con el resto de la aplicaci(n. abstract protected function de"ete().POO y MVC en PHP + E"!enia Ba. >ajo el supuesto de que los modelos $>Abstract#odel " ?suario se conservan "9 simplemente a modo de ejercicio Gen (uB directorio crees (ue se deber4a almacenar cada uno de estos dos modelosH Arc3ivos del Modelo @os archivos de nuestro VmodeloV9 serán ahora nuestros viejos db1abstract1model'php " usuarios1model'php a los cuales9 haremos algunas modi'icaciones.TcoreTdb_abstract_mode".e = '+echo'.elpers9 utils9 decorators9 etc9 que puedan ser reutiliHados en otros m(dulos de la aplicaci(n )aqu0 solo crearemos el de usuarios*9 es decir9 todo aquello que pueda ser considerado Ln7cleoM del sistema. abstract protected function edit(). protected $ro8s = arra:(). usuariosF éste9 será el directorio de nuestro m(dulo de usuarios. # los siguientes métodos pueden de%inirse con e+actitud y # no son abstractos "" .et(). %(digo 'uente del archivo <=php abstract class 'C*bstract(ode" { private static $db_host = '"oca"host'.php #odi'icaciones incorporadas /. private static $db_user = 'usuario'. protected $Duer:. !l método e?ecute_sin. !n él9 organiHadmente9 nuestros diseEadores podrán trabajar libremente9 creando los archivos estáticos que la aplicaci(n requiera. public $mensa. Arc3ivo . siteEmediaF será el directorio e8clusivo para nuestros diseEadores. abstract protected function set().

$this->c"ose_connection(). .php #odi'icaciones incorporadas /. !l nombre del archivo cambia a model.in in'luencia práctica9 el método constructor aparece debajo de los métodos propios de la clase )una simple cuesti(n organiHativa* %(digo 'uente del archivo <=php # . $resu"t->c"ose(). } e"se { $this->mensa. public $emai". 8hi"e ($this->ro8sEF = $resu"t->>etch_assoc()).TcoreTdb_abstract_mode"."e_Duer:() { i>($_P345) { $this->open_connection(). $this->c"ose_connection(). "6 . } } => Arc3ivo . } } # /raer resultados de una consulta en un )rray protected function . $this->conn->Duer:($this->Duer:).################################ public $nombre. } # Ejecutar un query simple del tipo .5P. arra:_pop($this->ro8s).php').E!)!E. public $ape""ido.et_resu"ts_>rom_Duer:() { $this->open_connection().it # "onectar a la base de datos private function open_connection() { $this->conn = new m:sD"i(self11$db_host$ self11$db_user$ self11$db_pass$ $this->db_name). !E0E/E./.e agrega una emisi(n de mensaje por cada acci(n conclu"ente de cada uno de los métodos B. } # !esconectar la base de datos private function c"ose_connection() { $this->conn->c"ose(). 1P!)/E protected function e?ecute_sin.mportar modelo de abstracci4n de base de datos reDuire_once('. .POO y MVC en PHP + E"!enia Ba. -E.php. 1. $resu"t = $this->conn->Duer:($this->Duer:). protected $id.. class Usuario extends 'C*bstract(ode" { ############################### P.e = '(etodo no permitido'. private $c"a/e.TusuariosTmode".

e = '6" usuario :a e?iste'.e = 'Usuario a. $this->e?ecute_sin. } $this->Duer: = H UP'*56 usuarios 465 nombre='$nombre'$ ape""ido='$ape""ido' K+6J6 emai" = '$emai"' H."e_Duer:(). $this->e?ecute_sin.ado a" usuario'.################################## # /raer datos de un usuario public function . } } e"se { $this->mensa. $this->mensa. } i>(count($this->ro8s) == #) { >oreach ($this->ro8sE@F as $propiedad=>$/a"or) { $this->$propiedad = $/a"or.e = '&o se ha a. } e"se { $this->mensa.it ################################# M6/5!5. } $this->mensa. } $this->Duer: = H 2&46J5 2&53 usuarios (nombre$ ape""ido$ emai"$ c"a/e) L*IU64 ('$nombre'$ '$ape""ido'$ '$emai"'$ '$c"a/e') H.e = 'Usuario encontrado'.re.et($user_emai"='') { i>($user_emai" G= '') { $this->Duer: = H 46I6)5 id$ nombre$ ape""ido$ emai"$ c"a/e -J3( usuarios K+6J6 emai" = '$user_emai"' H. $this->.e = 'Usuario no encontrado'."e_Duer:(). } } # "rear un nue$o usuario public function set($user_data=arra:()) { i>(arra:_9e:_e?ists('emai"'$ $user_data)) { $this->. $this->mensa.et_resu"ts_>rom_Duer:().ado e?itosamente'. } ". } } # Modi%icar un usuario public function edit($user_data=arra:()) { >oreach ($user_data as $campo=>$/a"or) { $$campo = $/a"or.re.POO y MVC en PHP + E"!enia Ba. } e"se { $this->mensa. . i>($user_dataE'emai"'F G= $this->emai") { >oreach ($user_data as $campo=>$/a"or) { $$campo = $/a"or.e = 'Usuario modi>icado'.et($user_dataE'emai"'F).

!so lo dejo a vuestra libre elecci(n*."e_Duer:(). } # Método constructor function __construct() { $this->db_name = 'boo9_e?amp"e'.Tsite_mediaThtm"T con el pre'ijo usuario_ que identi'icará el m(dulo )también podr0an almacenarse en un subdirectorio llamado usuario. "< .9 que se e8pondrán a modo práctico9 sin ánimo de servir de ejemplo como inter'aces grá'icas*.e = 'Usuario e"iminado'. @a l(gica de la vista9 estará en nuestras manos. } } => Arc3ivos de la =ista !n esta etapa9 crearemos los archivos correspondientes a la I?6 " su l(gica. +omencemos. %rearemos una plantilla 2D#@ general9 cuatro plantillas de 'ormularios " un archivo %.. @os 3 primeros se almacenarán en . @os primeros9 serán los archivos que crearán nuestros diseEadores )3 archivos 2D#@ " / archivo %.it # Eliminar un usuario public function de"ete($user_emai"='') { $this->Duer: = H '6I656 -J3( usuarios K+6J6 emai" = '$user_emai"' H.POO y MVC en PHP + E"!enia Ba.. $this->e?ecute_sin. Arc3ivos de la A5* Recordemos que se trataba de un A># de ?suarios9 donde ten0amos la posibilidad de: • • • • #ostrar los datos de un usuario Agregar un nuevo usuario #odi'icar un usuario e8istente !liminar un usuario de la base de datos Dodos estos archivos9 se almacenarán en nuestro directorio estático site_media. !l archivo %.9 l(gicamente se almacenará en .. } # Método destructor del objeto function __destruct() { unset($this). $this->mensa..Tsite_mediaTcssT.

charset=ut>-UH> <"in9 re"=Hst:"esheetH t:pe=Hte?tTcssH hre>=HTm/cTsite_mediaTcssTbase_temp"ate.htm" )plantilla 2D#@ general* <G'3)5SP6 HTML PUCI2) H-TTKR)TT'5' +5(I Q.Tsite_mediaThtm"Tusuario_temp"ate.re.e} <Tdiv> <div id=H>ormu"arioH> {>ormu"ario} <Tdiv> <Tbod&> <Thtml> .re.ar.cssH> <tit"e>*C( de Usuarios1 {subtitu"o}<Ttit"e> <Thead> <bod&> <div id=HcabeceraH> <h(>*dministrador de usuarios<Th(> <h+>{subtitu"o}<Th+> <Tdiv> <div id=HmenuH> <a hre>=HTm/cT{L26K_465_U46J}H tit"e=H&ue/o usuarioH>*.eH> {mensa.Tsite_mediaThtm"Tusuario_a.it Archivo .dtdH> <html "an.POO y MVC en PHP + E"!enia Ba.ar usuario<Ta> <a hre>=HTm/cT{L26K_N65_U46J}H tit"e=HCuscar usuarioH>CuscarTeditar usuario<Ta> <a hre>=HTm/cT{L26K_'6I656_U46J}H tit"e=HCorrar usuarioH>Corrar usuario<Ta> <Tdiv> <div id=Hmensa.re.T5JThtm"QT"oose.htm" )'ormulario para agregar un nuevo usuario* <form id=Ha"ta_usuarioH action=H{465}H method=HP345H> <div c"ass=Hitem_reDueridH>6-mai"<Tdiv> <div c"ass=H>orm_reDueridH><input t:pe=Hte?tH name=Hemai"H id=Hemai"H><Tdiv> <div c"ass=Hitem_reDueridH>)"a/e<Tdiv> <div c"ass=H>orm_reDueridH><input t:pe=Hpass8ordH name=Hc"a/eH id=Hc"a/eH><Tdiv> <div c"ass=Hitem_reDueridH>&ombre<Tdiv> <div c"ass=H>orm_reDueridH><input t:pe=Hte?tH name=HnombreH id=HnombreH><Tdiv> <div c"ass=Hitem_reDueridH>*pe""ido<Tdiv> <div c"ass=H>orm_reDueridH><input t:pe=Hte?tH name=Hape""idoH id=Hape""idoH><Tdiv> <div c"ass=H>orm_buttonH><input t:pe=HsubmitH name=Hen/iarH id=Hen/iarH /a"ue=H*.arH><Tdiv> <Tform> <(tese que este archivo no posee datos dinámicos que deban ser reemplaHados.or 'avor9 obsérvese que en este archivo9 se deberán reemplaHar dinámicamente: el subt0tulo del m(dulo )método*9 las ?R@ de los enlaces de las vistas9 el mensaje emitido por el sistema " el 'ormulario correspondiente al método/vista solicitado por el usuario.=HesH> <head> <meta http-eDui/=H)ontent-5:peH content=Hte?tThtm". Archivo . "@ .8R.@# 5ransitiona"TT6&H Hhttp1TT888.or.

css )hoja de estilos en cascada* bod: { mar#in1 @p? @p? @p? @p?. . Obsérvese que el campo LemailM es de solo lectura.Tsite_mediaThtm"Tusuario_borrar.it Archivo . 6. color1 YOOOOOO.si-e1 #2p?.Tsite_mediaTcssTbase_temp"ate. bac%#round.or 'avor9 n(tese que en este archivo deberán reemplaHarse dinámicamente los datos del usuario en los campos de 'ormulario correspondientes.htm" )'ormulario para eliminar un usuario identi'icado por su eFmail* <form id=Ha"ta_usuarioH action=H{'6I656}H method=HP345H> <div c"ass=Hitem_reDueridH>6-mai"<Tdiv> <div c"ass=H>orm_reDueridH><input t:pe=Hte?tH name=Hemai"H id=Hemai"H><Tdiv> <div c"ass=H>orm_buttonH><input t:pe=HsubmitH name=Hen/iarH id=Hen/iarH /a"ue=H6"iminarH><Tdiv> <Tform> <(tese que al igual que el archivo anterior9 éste9 tampoco contiene datos dinámicos que deban ser reemplaHados.htm" )archivo que permite buscar un usuario por su eFmail para luego mostrarlo en el 'ormulario de edici(n9 "a sea para editarlo o solo para ver sus datos* <form id=Ha"ta_usuarioH action=H{N65}H method=HN65H> <div c"ass=Hitem_reDueridH>6-mai"<Tdiv> <div c"ass=H>orm_reDueridH><input t:pe=Hte?tH name=Hemai"H id=Hemai"H><Tdiv> <div c"ass=H>orm_buttonH><input t:pe=HsubmitH id=Hen/iarH /a"ue=HCuscarH><Tdiv> <Tform> <(tese que al igual que los dos archivos anteriores9 éste9 tampoco contiene datos dinámicos que deban ser reemplaHados. Archivo . Archivo . font. Archivo .famil&1 sans-seri>.color1 Y>>>>>>.Tsite_mediaThtm"Tusuario_buscar. font.POO y MVC en PHP + E"!enia Ba.Tsite_mediaThtm"Tusuario_modi>icar.htm" )archivo para visualiHar los datos de un usuario " modi'icarlos* <form id=Ha"ta_usuarioH action=H{6'25}H method=HP345H> <div c"ass=Hitem_reDueridH>6-mai"<Tdiv> <div c"ass=H>orm_reDueridH><input t:pe=Hte?tH name=Hemai"H id=Hemai"H /a"ue=H{emai"}H readon":><Tdiv> <div c"ass=Hitem_reDueridH>&ombre<Tdiv> <div c"ass=H>orm_reDueridH><input t:pe=Hte?tH name=HnombreH id=HnombreH /a"ue=H{nombre}H><Tdiv> <div c"ass=Hitem_reDueridH>*pe""ido<Tdiv> <div c"ass=H>orm_reDueridH><input t:pe=Hte?tH name=Hape""idoH id=Hape""idoH /a"ue=H{ape""ido}H><Tdiv> <div c"ass=H>orm_buttonH><input t:pe=HsubmitH name=Hen/iarH id=Hen/iarH /a"ue=HNuardarH><Tdiv> <Tform> .

hei#ht1 22p?. clear1 left.color1 Y>Q>Q>Q. float1 left.si-e1 # p?. border1 #p? so"id Yc@c@c@. color1 Y>Q>Q>Q.wei#ht1 bo"d.it } Ycabecera { paddin#1 Op? Op? Up? Op?. paddin#1 Qp? Up? Qp? Up?.color1 Y@@@@@@. paddin#1 Qp? @p? Qp? @p?. } Ycabecera h#$ h2 { mar#in1 @p? @p? @p? @p?. paddin#1 Up?. } Ymensa.color1 Y@@@@@@.ali#n1 ri#ht. } Ymenu { bac%#round.color1 Y>P>P>P. color1 YPP@@RR. bac%#round. font.wei#ht1 bo"d. text. } .ri#ht1 Qp?.color1 YOOPP--. bac%#round. text.ali#n1 .POO y MVC en PHP + E"!enia Ba. } Y>ormu"ario { mar#in1 @p? 2@p? #@p? 2@p?.ali#n1 left. font. font. } Ymenu a1ho/er { bac%#round. paddin#1 Up?. color1 Y>>>>>>.wei#ht1 bo"d. border1 #p? so"id YPP@@RR. color1 Y>>>>>>. } 6 . paddin#. font.decoration1 none. bac%#round.usti>:. color1 Y>>>>>>. bac%#round.item_reDuerid { width1 # @p?. font.si-e1 #Rp?.color1 YOOPP--. text.e { mar#in1 2@p?. } Ymenu a { width1 #@@p?. text.

.POO y MVC en PHP + E"!enia Ba.'.6'25_U46J. clear1 both.(3'UI3. } Yen/iar { paddin#1 p? #@p? p? #@p?.'T'$ 'L26K_N65_U46J'=>(3'UI3.left1 # Qp?.php @(gica de la vista <=php $diccionario = arra:( 'subtit"e'=>arra:(L26K_465_U46J=>')rear un nue/o usuario'$ L26K_N65_U46J=>'Cuscar usuario'$ L26K_'6I656_U46J=>'6"iminar un usuario'$ L26K_6'25_U46J=>'(odi>icar usuario' )$ '"in9s_menu'=>arra:( 'L26K_465_U46J'=>(3'UI3.'T'$ '6'25'=>'Tm/cT'. } Arc3ivo .htm"'.L26K_465_U46J. float1 left. font.Tsite_mediaThtm"Tusuario_'. font. color1 Y>>>>>>.'T'$ 'N65'=>'Tm/cT'.et') { $>i"e = '. } . mar#in.top1 # p?.L26K_N65_U46J. function .(3'UI3. $temp"ate = >i"e_.465_U46J. bac%#round. } 6& .L26K_'6I656_U46J.'T'$ 'L26K_'6I656_U46J'=>(3'UI3.N65_U46J.L26K_6'25_U46J.TusuariosT/ie8.$>orm.'T'$ ''6I656'=>'Tm/cT'.color1 YOOPP--.(3'UI3.famil&1 sans-seri>.'T'$ 'L26K_6'25_U46J'=>(3'UI3. } Yen/iar1ho/er { bac%#round.'T' ) ). border1 2p? so"id Y>>>>>>.si-e1 #Qp?.'T' )$ '>orm_actions'=>arra:( '465'=>'Tm/cT'. } input { border1 #p? so"id Yc@c@c@.'6I656_U46J.(3'UI3.>orm_button { paddin#. cursor1 pointer.wei#ht1 bo"d. font.>orm_reDuerid { hei#ht1 22p?.et_contents($>i"e).et_temp"ate($>orm='. return $temp"ate. clear1 ri#ht.color1 Y@@@@@@.it .

php <=php reDuire_once('constants. } => .or 'avor9 n(tese que este archivo9 utiliHa constantes.$peticion.e = $dataE'mensa.php'). $htm" = render_dinamic_data($htm"$ $data).' '.$c"a/e.e = '6ditar usuario '. } e"se { $mensa. print $htm".'T'.TusuariosT9 llamado constants.e'$ $data)) { $mensa.'}'$ $/a"or$ $htm"). $htm" = str_rep"ace('{>ormu"ario}'$ .e = ''atos de" usuario1'. $peticiones = arra:(465_U46J$ N65_U46J$ '6I656_U46J$ 6'25_U46J$ L26K_465_U46J$ L26K_N65_U46J$ L26K_'6I656_U46J$ L26K_6'25_U46J).it function render_dinamic_data($htm"$ $data) { >oreach ($data as $c"a/e=>$/a"or) { $htm" = str_rep"ace('{'.TusuariosTcontro""er.php que será e8puesto más adelante. } } $htm" = str_rep"ace('{mensa.php'). // render 7mensaje8 i>(arra:_9e:_e?ists('nombre'$ $data)XX arra:_9e:_e?ists('ape""ido'$ $data)XX $/ista==L26K_6'25_U46J) { $mensa.e$ $htm")."oba" $diccionario. i>( strpos($uri$ $uri_peticion) == true ) { 6$ . $htm" = str_rep"ace('{subtitu"o}'$ $diccionarioE'subtit"e'FE$/istaF$ $htm").e'F. reDuire_once('mode".POO y MVC en PHP + E"!enia Ba. } return $htm". El controlador Arc3ivo . >oreach ($peticiones as $peticion) { $uri_peticion = (3'UI3. $htm" = . } e"se { i>(arra:_9e:_e?ists('mensa. } function retornar_/ista($/ista$ $data=arra:()) { . $htm" = render_dinamic_data($htm"$ $diccionarioE'"in9s_menu'F). function hand"er() { $e/ent = L26K_N65_U46J.$dataE'nombre'F. @as mismas9 " a 'in de otorgar ma"or legibilidad " organiHaci(n al c(digo9 serán de'inidas en un archivo independiente almacenado en .$dataE'ape""ido'F.et_temp"ate($/ista)$ $htm"). $uri = $_46JL6JE'J6ZU645_UJ2'F.et_temp"ate('temp"ate'). reDuire_once('/ie8.e}'$ $mensa. $htm" = render_dinamic_data($htm"$ $diccionarioE'>orm_actions'F).php').

$usuario = set_ob. } 6# . return $ob. } i>(arra:_9e:_e?ists('c"a/e'$ $_P345)) { $user_dataE'c"a/e'F = $_P345E'c"a/e'F. case '6I656_U46J1 $usuario->de"ete($user_dataE'emai"'F). case N65_U46J1 $usuario->. case 6'25_U46J1 $usuario->edit($user_data). s8itch ($e/ent) { case 465_U46J1 $usuario->set($user_data). default1 retornar_/ista($e/ent).e'=>$usuario->mensa. } i>(arra:_9e:_e?ists('emai"'$ $_P345)) { $user_dataE'emai"'F = $_P345E'emai"'F.e). brea9. brea9. brea9..() { $ob. retornar_/ista(L26K_'6I656_U46J$ $data).e'=>$usuario->mensa. } i>(arra:_9e:_e?ists('ape""ido'$ $_P345)) { $user_dataE'ape""ido'F = $_P345E'ape""ido'F. } } function set_ob. brea9. } } $user_data = he"per_user_data().it $e/ent = $peticion. $data = arra:('mensa.e). $data = arra:('mensa.e'=>$usuario->mensa. } function he"per_user_data() { $user_data = arra:().(). retornar_/ista(L26K_N65_U46J$ $data). retornar_/ista(L26K_6'25_U46J$ $data).POO y MVC en PHP + E"!enia Ba.e).et($user_data). retornar_/ista(L26K_465_U46J$ $data). = new Usuario(). } } e"se i>($_N65) { i>(arra:_9e:_e?ists('emai"'$ $_N65)) { $user_data = $_N65E'emai"'F. $data = arra:( 'nombre'=>$usuario->nombre$ 'ape""ido'=>$usuario->ape""ido$ 'emai"'=>$usuario->emai" ). $data = arra:('mensa. i>($_P345) { i>(arra:_9e:_e?ists('nombre'$ $_P345)) { $user_dataE'nombre'F = $_P345E'nombre'F.

.POO y MVC en PHP + E"!enia Ba.php 6" . const N65_U46J = '.ine on Je8riteJu"e [usuariosT usuariosTcontro""er.htaccess de la aplicaci(n.re. => Arc3ivo .TusuariosTconstants.or 'avor9 obsérvese que el controlador importa el archivo constants. const L26K_'6I656_U46J = 'borrar'. !ste ejemplo9 maneja L?R@ amigablesM ) friendly url*9 que serán tratadas más adelante9 con'igurando las mismas en el archivo . Arc3ivos de con iguraci$n co!ple!entarios Arc3ivo .ar'.or otro lado9 el . const L26K_N65_U46J = 'buscar'.php !ste archivo contiene todas las constantes del m(dulo " no se le deber0a agregar ning7n dato que no 'uese una constante. => . const 6'25_U46J = 'edit'.et'.htaccess Agregar al archivo . <=php const (3'UI3 = 'usuariosT'. const L26K_6'25_U46J = 'modi>icar'. # controladores const 465_U46J = 'set'.php " utiliHa constantes que serán de'inidas en dicho archivo )veremos éste más adelante*.andler del controlador9 maneja las peticiones del usuario sobre la base de la ?R6 detectada. # $istas const L26K_465_U46J = 'a. } hand"er().php <(tese que dependiendo del directorio ra0H de la aplicaci(n9 probablemente se deba modi'icar la l0nea Je8riteJu"e [usuariosT usuariosTcontro""er.it } return $user_data.htaccess de la aplicaci(n9 las siguientes l0neas: Je8rite6n. const '6I656_U46J = 'de"ete'.

it #ota $inal 2emos llegado al 'inal de este libro.html >Oracias por el tiempo (ue han dedicado? >U7itos en tu carrera? 66 .blogspot.com/1:///:&/pooF"FmvcFenFphp.POO y MVC en PHP + E"!enia Ba. !spero que todo lo aqu0 e8puesto9 les ha"a sido de utilidad " los invito a hacerme llegar sus dudas9 sugerencias " comentarios através de mi eFmail o visitando la p%gina del libro: http://eugeniabahit.

Sign up to vote on this title
UsefulNot useful