bahit eugenia - poo y mvc en php

Upload: jlmansilla

Post on 18-Oct-2015

63 views

Category:

Documents


0 download

DESCRIPTION

POO

TRANSCRIPT

  • POO y MVC en PHPEl paradigma de la Programacin Orientada a Objetos en

    PHP y el patrn de arquitectura de Software MVC

    porEugenia Bahit

    http://eugeniabahit.blogspot.com

  • AVISO LEGAL

    POO y MVC en PHP de Eugenia Bahit se distribuye bajo una Licencia

    Creative Commons Atribucin-NoComercial-SinDerivadas 3.0

    Unported.

    Usted es libre de: Compartir, copiar, distribuir, ejecutar y comunicar pblicamente la obra.

    Bajo las condiciones siguientes: Atribucin. Debe reconocer los crditos 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 hace de su obra). No Comercial. No puede utilizar esta obra para fines comerciales. Sin Obras Derivadas. No se puede alterar, transformar o generar una obra derivada a partir de esta obra.

    Ms informacin de esta licencia en:http://creativecommons.org/licenses/by-nc-nd/2.5/ar/

  • POO y MVC en PHP Eugenia Bahit

    ndice de contenidos

    Antes de comenzar con el libro............................................................................................................................................... 6Objetivo del libro....................................................................................................................................................................6

    Requisitos previos.............................................................................................................................................................6

    A quines est dirigido este libro?...............................................................................................................................6El por qu? de este libro y Mi Dedicatoria........................................................................................................................6

    Contenido del libro.................................................................................................................................................................7Estructura del libro...........................................................................................................................................................7

    Entender el contenido diferenciado ............................................................................................................................7Marco terico (contenido propio)............................................................................................................................8

    Marco terico (cita de terceros)...............................................................................................................................8Ejemplo prctico (cdigo fuente).............................................................................................................................8

    Metforas (comparacin con la vida real)..............................................................................................................8Sugerencias de estilo..................................................................................................................................................8

    Ejercicios de autoevaluacin.....................................................................................................................................9Programacin real.......................................................................................................................................................9

    Respuestas a preguntas frecuentes........................................................................................................................9

    Introduccin a la programacin orientada a objetos (POO).........................................................................................11Elementos de la POO...........................................................................................................................................................11

    Clase..................................................................................................................................................................................11Objeto...............................................................................................................................................................................11

    Mtodo.............................................................................................................................................................................11Evento y Mensaje............................................................................................................................................................11

    Propiedades y atributos................................................................................................................................................11Caractersticas conceptuales de la POO..........................................................................................................................12

    Abstraccin......................................................................................................................................................................12Encapsulamiento............................................................................................................................................................12

    Modularidad.....................................................................................................................................................................12Ocultacin (aislamiento)...............................................................................................................................................12

    Polimorfismo...................................................................................................................................................................12Herencia............................................................................................................................................................................12

    Recoleccin de basura...................................................................................................................................................12

    Programacin Orientada a Objetos en PHP 5................................................................................................................... 14Clases y Objetos en PHP 5..................................................................................................................................................14

    Definicin de Clases.......................................................................................................................................................14Declaracin de Clases abstractas................................................................................................................................14

    Herencia de Clases.........................................................................................................................................................15Declaracin de Clases finales En PHP.........................................................................................................................15

    Qu tipo de clase declarar?...............................................................................................................................................15Objetos en PHP 5.................................................................................................................................................................15

    Instanciar una clase........................................................................................................................................................15Propiedades en PHP 5.........................................................................................................................................................16

    Propiedades pblicas.....................................................................................................................................................16Propiedades privadas.....................................................................................................................................................16

    3

  • POO y MVC en PHP Eugenia Bahit

    Propiedades protegidas................................................................................................................................................16

    Propiedades estticas....................................................................................................................................................17Accediendo a las propiedad de un objeto.......................................................................................................................17

    Acceso a variables desde el mbito de la clase.........................................................................................................17Acceso a variables desde el exterior de la clase.......................................................................................................17

    Constantes de Clase.............................................................................................................................................................18Mtodos en PHP 5................................................................................................................................................................18

    Mtodos pblicos, privados, protegidos y estticos...............................................................................................19Mtodos abstractos.......................................................................................................................................................19

    Mtodos mgicos en PHP 5..........................................................................................................................................20El Mtodo Mgico __construct()............................................................................................................................20

    El mtodo mgico __destruct()..............................................................................................................................20Otros mtodos mgicos...........................................................................................................................................21

    Ejercicios Prcticos.................................................................................................................................................................. 22Soluciones a los ejercicios 1 y 2.........................................................................................................................................25

    Ejercicio N1....................................................................................................................................................................25

    Ejercicio N2....................................................................................................................................................................25

    Programacin Real Orientada a Objetos en PHP............................................................................................................. 26Archivos fuente del ABM de Usuarios..............................................................................................................................26

    Archivo db_abstract_model.php..................................................................................................................................26Archivo usuarios_model.php........................................................................................................................................27

    Archivo abm_example.php...........................................................................................................................................28Explicando el cdigo en el contexto de la POO: La mejor forma de aprender y comprender..............................29

    Respuestas a Preguntas Frecuentes sobre el cdigo..............................................................................................291. Respuestas a preguntas frecuentes de la clase DBAbstractModel............................................................29

    2. Respuestas a preguntas sobre la clase Usuario..............................................................................................303. Respuestas a preguntas sobre el archivo de instancias................................................................................31

    Introduccin al patrn Arquitectnico MVC..................................................................................................................... 33Introduccin a la Arquitectura de Software....................................................................................................................33

    Qu es la arquitectura de software?.........................................................................................................................33

    Tendencias de la Arquitectura de Software..............................................................................................................33Caractersticas de la Arquitectura de Software: Atributos de calidad.................................................................34

    Atributos de calidad que pueden observarse durante la ejecucin del software........................................34Atributos de calidad inherentes al proceso de desarrollo del software........................................................34

    De lo general a lo particular: del estilo arquitectnico al patrn de diseo.............................................................35Relacin y Diferencia.....................................................................................................................................................35

    El Patrn Arquitectnico modelo-vista-controlador (MVC) ........................................................................................35Aclarciones previas.........................................................................................................................................................35

    Qu es el patrn MVC?.................................................................................................................................................36Cmo funciona el patrn MVC?..................................................................................................................................36

    El Patrn MVC en PHP............................................................................................................................................................. 40El modelo...............................................................................................................................................................................40

    Interfaces en PHP: un nuevo concepto para crear modelos..................................................................................40

    Diferencia entre Interfaces y Clases abstractas..................................................................................................41

    4

  • POO y MVC en PHP Eugenia Bahit

    Lo que NO deben hacer las insterfaces................................................................................................................42

    La vista....................................................................................................................................................................................42Vista: la interfaz grfica.................................................................................................................................................43

    La Lgica de la Vista.......................................................................................................................................................44Primer paso: crear un diccionario de datos..........................................................................................................44

    Segundo paso: obtener la plantilla HTML............................................................................................................44Tercer paso: reemplazar el contenido ..................................................................................................................44

    Cuarto paso: mostrar el contenido final al usuario............................................................................................45El controlador.......................................................................................................................................................................45

    Primer paso: identificar el modelo........................................................................................................................48Segundo paso: invocar al modelo efectuando los cambios adecuados..........................................................49

    Tercer paso: enviar la informacin a la vista........................................................................................................49

    Ejercicios Prcticos.................................................................................................................................................................. 50Soluciones a los ejercicios 3 y 4.........................................................................................................................................53

    Ejercicio N3....................................................................................................................................................................53Ejercicio N4....................................................................................................................................................................53

    Programacin Real Con el patrn MVC............................................................................................................................... 54Estructura de directorios....................................................................................................................................................54Archivos del Modelo ...........................................................................................................................................................55

    Archivo ./core/db_abstract_model.php......................................................................................................................55Modificaciones incorporadas..................................................................................................................................55

    Cdigo fuente del archivo.......................................................................................................................................55Archivo ./usuarios/model.php......................................................................................................................................56

    Modificaciones incorporadas..................................................................................................................................56Cdigo fuente del archivo.......................................................................................................................................56

    Archivos de la Vista..............................................................................................................................................................58Archivos de la GUI...........................................................................................................................................................58

    Archivo ./site_media/html/usuario_template.html............................................................................................59Archivo ./site_media/html/usuario_agregar.html..............................................................................................59

    Archivo ./site_media/html/usuario_borrar.html.................................................................................................60Archivo ./site_media/html/usuario_buscar.html.................................................................................................60

    Archivo ./site_media/html/usuario_modificar.html...........................................................................................60Archivo ./site_media/css/base_template.css.......................................................................................................60

    Archivo ./usuarios/view.php.........................................................................................................................................62El controlador.......................................................................................................................................................................63

    Archivo ./usuarios/controller.php................................................................................................................................63Archivos de configuracin complementarios.................................................................................................................65

    Archivo ./usuarios/constants.php................................................................................................................................65Archivo .htaccess............................................................................................................................................................65

    Nota Final................................................................................................................................................................................... 66

    5

  • POO y MVC en PHP Eugenia Bahit

    Antes de comenzar con el libro

    Antes de comenzar con la lectura puntual sobre POO y MVC en PHP, hago meritorio notar ciertas cuestiones que considero deben contemplarse a fin de lograr un mejor entendimiento de lo expuesto.

    Objetivo del libro

    El objetivo de este libro, es dar una introduccin general a conceptos bsicos de la programacin como lo son, el paradigma de la programacin orientada a objetos y el patrn arquitectnico MVC (modelo, vista, controlador), a la vez de intentar introducir estos conceptos, en la programacin especfica del lenguaje PHP.

    Requisitos previosPara poder entender este libro, los requisitos previos que debe tener el lector, no son muchos. Recomiendo que se tengan conocimientos bsicos del lenguaje PHP as como la facilidad para entender cdigo HTML bsico (se utilizar HTML Transitional 4.0 en algunos ejemplos, evitando el uso de XHTML, a fin de que programadores sin experiencia en el diseo y maquetado de sitios Web, puedan comprender ms fcilmente los ejemplos utilizados).

    A quines est dirigido este libro?Este libro est dirigido principalmente, a programadores PHP que quieran salir de la programacin estructurada para insertarse en la programacin orientada a objetos y, a programadores de otros lenguajes que quieran comenzar a insertarse en la POO en PHP y que cuenten con mnimos conocimientos de este lenguaje.

    El por qu? de este libro y Mi Dedicatoria

    Mi frase de cabecera es el por qu de las cosas es relativo ya que no tiene forma de ser comprobado. As que se me hace muy difcil explicar un por qu. Solo puedo decir cmo fue que se me ocurri escribirlo.

    Perd la cuenta de la cantidad de programadores con los que he trabajado. Han sido muchsimos en los ltimos 15 aos de mi vida. Me ha tocado trabajar con excelentes programadores y con unos pocos no tan buenos. Pero hay algo, que he notado en una gran parte de progrmadores, con los que tal vez, no me ha tocado trabajar en forma directa, pero s, tener que continuar desarrollando algo ya empezado por ellos o modificarlo. Y sto que he notado y me ha llamado mucho la atencin, es que:

    Se usan elementos de la programacin orientada a objetos, con la falsa creencia de que escribiendo una clase ya se est programando orientado a objetos

    Se desconoce por completo o no se logra entender del todo, la diferencia entre estilo arquitectnico, patrn arquitectnico y patrn de diseo, provocando en consecuencia, el desaprovechamiento o mal uso, de patrones arquitectnicos

    6

  • POO y MVC en PHP Eugenia Bahit

    como MVC desencadenando as, en una arquitectura de software deficiente

    Las alternativas que me quedaban eran dos:

    1. No hacer nada

    2. Transmitir a otros programadores, todo lo que haba aprendido, para que pudiesen implementarlo si ese fuese su deseo

    Por lgica y sin dudarlo ni tener que pensarlo demasiado, eleg la segunda opcin. Porque estoy segura que el conocimiento debe ser transmitido y no se debe escatimar en su difusin. Pues no me interesa hacerme eco de la competitividad que invade varios mbitos de la vida. Por el contrario, prefiero seguir el ejemplo de aquellos, mis colegas, que lo han brindado todo al saber general. Y es por ello, que este libro, lo dedico a todos ellos, a los creadores de MastrosDelWeb.com1 y ForosDelWeb.com y en especial, a mis dos grandes colegas, de quienes he aprendido gran parte de lo que hoy se:

    a la barcelonesa Helena Heidenreich (aka: tunait2), gran colaboradora del foro JavaScript de FDW

    y al madrileo Miguel ngel lvarez, fundador y director del portal de programacin, DesarrolloWeb.com3.

    Contenido del libro

    A fin de lograr cumplir con los objetivos propuestos, este libro ha sido diseado con una estructura esquemtica y seguiendo normas de estilo a fin de diferenciar su contenido.

    Estructura del libroEste libro se encuentra dividido en 4 captulos donde dos de ellos, introducen a conceptos bsicos de la POO y el patrn MVC (en general) y los otros dos, colocan a la POO y al patrn MVC en el contexto del lenguaje PHP.

    Entender el contenido diferenciado Este libro no pretende ser un compendio de conceptos meramente tericos. A fin de alcanzar un abordaje ms preciso y fcilmente entendible, se ha divido el libro en 7 tipificaciones de contenido diferenciadas:

    1. marco terico (contenido propio y citas de terceros)2. ejemplo prctico (cdigo fuente de ejemplo)3. metforas (comparacin con ejemplos de la vida real tomando esta tcnica de

    un principio bsico de Extreme Programming)

    4. sugerencias de estilo (reglas de estilo sugeridas para la programacin en PHP)

    1 http://www.maestrosdelweb.com/ 2 tunait nos ofrece una de las mejores colecciones de cdigos JavaScript, en su sitio Web http://tunait.com/javascript/3 http://www.desarrolloweb.com Portal de desarrollo Web y programacin, de la comunidad hispanoparlante

    7

  • POO y MVC en PHP Eugenia Bahit

    5. ejercicios de autoevaluacin6. programacin real (ejemplos con cdigos fuente reales)7. preguntas a respuestas frecuentes

    Marco terico (contenido propio)Texto general del libro.

    Marco terico (cita de terceros)Las citas presentan el siguiente formato:

    Esto es una cita textual de terceros. La fuente se encuentra al pie de pgina.

    Ejemplo prctico (cdigo fuente)El cdigo fuente se encuentra con una tipografa monoespaciada y con la sintaxis del lenguaje coloreada4.

    class Usuario { # Propiedades public $nombre;

    # Mtodos public function set_usuario() { $this->nombre = 'Juan'; }}

    Metforas (comparacin con la vida real)A fin de ejemplificar con facilidad un concepto netamente terico, se darn ejemplos utilizando hechos de la vida cotideana, que puedan asemejarse al concepto que se est explicando. Estas metforas, se presentarn con un diseo como el siguiente:

    Esto es una metfora.

    Si no tengo el cono, soy un ejemplo de la vida real, pero no soy una metfora.

    Sugerencias de estiloA diferencia de otros lenguajes de programacin como Python, por ejemplo, PHP no tiene una gua de prcticas recomendadas o sugerencias de estilo. Esto, hace que muchas veces, cada programador le de al cdigo fuente un toque caracterstico. Si bien es un rasgo de personalidad tal vez admirable, en la prctica, provoca que sea difcil modificar el cdigo fuente escrito previamente por otro programador.

    A fin de proponer una alternativa para solucionar este inconveniente y basndome en el principio de propiedad colectiva de Extreme Programming as como en la tcnica de

    4 Este libro ha sido editado utilizando OpenOffice Writer 3.2 con el plug-in COOoder para el coloreado de sintaxis

    8

  • POO y MVC en PHP Eugenia Bahit

    establecimiento de pautas de estilo que hagan un cdigo homogneo, a lo largo del libro ir sugiriendo algunas reglas de estilo segn surjan, cuyo finalidad tiende a:

    1. hacer los cdigos fuente ms intuitivos;

    2. escribir cdigos fuente fcilmente legibles.

    Las Sugerencias de Estilo presenta un formato similar al siguiente:

    Reglas de estilo sugeridasEsto es una regla de estilo sugerida en referencia al tema que se est tratando.

    Ejercicios de autoevaluacinAl final de los captulos II y IV, hay una breve serie de ejercicios, cuya finalidad, es la de asimilar los conocimientos adquiridos en los captulos anteriores. Las soluciones a dichos ejercicios, se encuentran al final de cada uno de ellos.

    Programacin realTras los ejercicios presentados al finalizar los captulos II y IV, se podr encontrar cdigo fuente de casos reales. Dichos cdigos, pretenden dar al lector, una nocin ms prctica de los temas que se han tratado, aplicndola a la vida cotideana de un desarrollador. Los encontrars fcilmente identificando el cono de PHP como el que se muestra a la izquierda de este prrafo.

    Respuestas a preguntas frecuentesAqu encontrars todas las preguntas sobre los cdigos fuente que se encuentren en la seccin programacin real. Dicha seccin, se encuentra identificada con el icono que se muestra a la derecha de este prrafo.

    Hecha estas aclaraciones, ahora...

    A programar!

    9

  • POO y MVC en PHP Eugenia Bahit

    CAPTULO IIntroduccin a la Programacin Orientada a Objetos (POO)

    10

  • POO y MVC en PHP Eugenia Bahit

    Introduccin a la programacin orientada a objetos (POO)

    La POO es un paradigma de programacin (o tcnica de programacin) que utiliza objetos e interacciones en el diseo de un sistema.

    Elementos de la POO

    La POO est compuesta por una serie de elementos que se detallan a continuacin.

    ClaseUna clase es un modelo que se utiliza para crear objetos que comparten un mismo comportamiento, estado e identidad.

    MetforaPersona es la metfora de una clase (la abstraccin de Juan, Pedro, Ana y Mara), cuyo comportamiento puede ser caminar, correr, estudiar, leer, etc. Puede estar en estado despierto, dormido, etc. Sus caractersticas (propiedades) pueden ser el color de ojos, color de pelo, su estado civil, etc.

    class Persona { # Propiedades # Mtodos}

    ObjetoEs una entidad provista de mtodos o mensajes a los cuales responde (comportamiento); atributos con valores concretos (estado); y propiedades (identidad).

    $persona = new Persona();/* El objeto, ahora, es $persona, que se ha creado siguiendo el modelo de la clase Persona */

    MtodoEs el algoritmo asociado a un objeto que indica la capacidad de lo que ste puede hacer.

    function caminar() { #...}

    Evento y MensajeUn evento es un suceso en el sistema mientras que un mensaje es la comunicacin del suceso dirigida al objeto.

    Propiedades y atributosLas propiedades y atributos, son variables que contienen datos asociados a un objeto.

    $nombre = 'Juan'; $edad = '25 aos'; $altura = '1,75 mts';

    11

  • POO y MVC en PHP Eugenia Bahit

    Caractersticas conceptuales de la POO

    La POO debe guardar ciertas caractersticas que la identifican y diferencian de otros paradigmas de programacin. Dichas caractersticas se describen a continuacin.

    AbstraccinAislacin de un elemento de su contexto. Define las caractersticas esenciales de un objeto.

    EncapsulamientoRene al mismo nivel de abstraccin, a todos los elementos que puedan considerarse pertenecientes a una misma entidad.

    ModularidadCaracterstica que permite dividir una aplicacin en varias partes ms pequeas (denominadas mdulos), independientes unas de otras.

    Ocultacin (aislamiento)Los objetos estn aislados del exterior, protegiendo a sus propiedades para no ser modificadas por aquellos que no tengan derecho a acceder a las mismas.

    PolimorfismoEs la capacidad que da a diferentes objetos, la posibilidad de contar con mtodos, propiedades y atributos de igual nombre, sin que los de un objeto interfieran con el de otro.

    HerenciaEs la relacin existente entre dos o ms clases, donde una es la principal (madre) y otras son secundarias y dependen (heredan) de ellas (clases hijas), donde a la vez, los objetos heredan las caractersticas de los objetos de los cuales heredan.

    Recoleccin de basuraEs la tcnica que consiste en destruir aquellos objetos cuando ya no son necesarios, liberndolos de la memoria.

    12

  • POO y MVC en PHP Eugenia Bahit

    CAPTULO IIProgramacin Orientada a Objetos en PHP 5

    13

  • POO y MVC en PHP Eugenia Bahit

    Programacin Orientada a Objetos en PHP 5

    En este captulo veremos como aplicar los conceptos de la POO en el entorno del lenguaje PHP 5+.

    Clases y Objetos en PHP 5

    Definicin de ClasesSegn el Manual Oficial de PHP, una Clase es:

    [] una coleccin de variables y funciones que trabajan con estas variables. Las variables se definen utilizando var y las funciones utilizando function [...]5

    Para definir una clase, el Manual Oficial de PHP, contina diciendo:

    [] La definicin bsica de clases comienza con la palabra clave class, seguido por un nombre de clase, continuado por un par de llaves que encierran las definiciones de las propiedades y mtodos pertenecientes a la clase. El nombre de clase puede ser cualquier etiqueta vlida que no sea una palabra reservada de PHP. Un nombre vlido de clase comienza con una letra o un guin bajo, seguido de la cantidad de letras, nmeros o guiones bajos que sea. []6

    Veamos un ejemplo de definicin de clase:

    class NombreDeMiClase { #... }

    Reglas de Estilo sugeridasUtilizar CamelCase para el nombre de las clases.

    La llave de apertura en la misma lnea que el nombre de la clase, permite una mejor legibilidad del cdigo.

    Declaracin de Clases abstractasLas clases abstractas son aquellas que no necesitan ser instanciadas pero sin embargo, sern heredadas en algn momento. Se definen anteponiendo la palabra clave abstract a class:

    abstract class NombreDeMiClaseAbstracta { #... }

    Este tipo de clases, ser la que contenga mtodos abstractos (que veremos ms adelante) y generalmente, su finalidad, es la de declarar clases genricas que necesitan ser declaradas pero a las cuales, no se puede otorgar una definicin precisa (de eso, se encargarn las clases que la hereden).

    5 Fuente de la cita: http://php.net/manual/es/keyword.class.php6 Fuente de la cita: http://www.php.net/manual/es/language.oop5.basic.php

    14

  • POO y MVC en PHP Eugenia Bahit

    Herencia de ClasesLos objetos pueden heredar propiedades y mtodos de otros objetos. Para ello, PHP permite la extensin (herencia) de clases, cuya caracterstica representa la relacin existente entre diferentes objetos. Para definir una clase como extencin de una clase madre se utiliza la palabra clave extends.

    class NombreDeMiClaseMadre { #... }

    class NombreDeMiClaseHija extends NombreDeMiClaseMadre { /* esta clase hereda todos los mtodos y propiedades de la clase madre NombreDeMiClaseMadre */ }

    Declaracin de Clases finales En PHPPHP 5 incorpora clases finales que no pueden ser heredadas por otra. Se definen anteponiendo la palabra clave final.

    final class NombreDeMiClaseFinal { #esta clase no podr ser heredada }

    Qu tipo de clase declarar?

    Hasta aqu, han quedado en claro, cuatro tipos de clases diferentes: Instanciables, astractas, heredadas y finales. Cmo saber qu tipo de clase declarar? Todo depender, de lo que necesitemos hacer. Este cuadro, puede servirnos como gua bsica:

    Necesito... Instanciable Abstracta Heredada Final

    Crear una clase que pueda ser instanciada y/o heredada X

    Crear una clase cuyo objeto guarda relacin con los mtodos y propiedades de otra clase

    X

    Crear una clase que solo sirva de modelo para otra clase, sin que pueda ser instanciada

    X

    Crear una clase que pueda instanciarse pero que no pueda ser heredada por ninguna otra clase

    X

    Objetos en PHP 5

    Una vez que las clases han sido declaradas, ser necesario crear los objetos y utilizarlos, aunque hemos visto que algunas clases, como las clases abstractas son solo modelos para otras, y por lo tanto no necesitan instanciar al objeto.

    Instanciar una clasePara instanciar una clase, solo es necesario utilizar la palabra clave new. El objeto ser creado, asignando esta instancia a una variable (la cual, adoptar la forma de objeto). Lgicamente, la clase debe haber sido declarada antes de ser instanciada, como se muestra a continuacin:

    15

  • POO y MVC en PHP Eugenia Bahit

    # declaro la claseclass Persona { #...}

    # creo el objeto instanciando la clase$persona = new Persona();

    Reglas de Estilo sugeridasUtilizar nombres de variables (objetos) descriptivos, siempre en letra minscula, separando palabras por guiones bajos. Por ejemplo si el nombre de la clase es NombreDeMiClase como variable utilizar $nombre_de_mi_clase. Esto permitir una mayor legibilidad del cdigo.

    Propiedades en PHP 5

    Las propiedades representan ciertas caractersticas del objeto en s mismo. Se definen anteponiendo la palabra clave var al nombre de la variable (propiedad):

    class Persona { var $nombre; var $edad; var $genero;}

    Las propiedades pueden gozar de diferentes caractersticas, como por ejemplo, la visibilidad: pueden ser pblicas, privadas o protegidas. Como veremos ms adelante, la visiblidad de las propiedades, es aplicable tambin a la visibilidad de los mtodos.

    Propiedades pblicasLas propiedades pblicas se definen anteponiendo la palabra clave public al nombre de la variable. stas, pueden ser accedidas desde cualquier parte de la aplicacin, sin restriccin.

    class Persona { public $nombre; public $genero;}

    Propiedades privadasLas propiedades privadas se definen anteponiendo la palabra clave private al nombre de la variable. stas solo pueden ser accedidas por la clase que las defini.

    class Persona { public $nombre; public $genero; private $edad;}

    Propiedades protegidasLas propiedades protegidas pueden ser accedidas por la propia clase que la defini, as como por las clases que la heredan, pero no, desde otras partes de la aplicacin. stas, se definen anteponiendo la palabra clave protected al nombre de la variable:

    16

  • POO y MVC en PHP Eugenia Bahit

    class Persona { public $nombre; public $genero; private $edad; protected $pasaporte;}

    Propiedades estticasLas propiedades estticas representan una caracterstica de variabilidad de sus datos, de gran importancia en PHP 5. Una propiedad declarada como esttica, puede ser accedida sin necesidad de instanciar un objeto. y su valor es esttico (es decir, no puede variar ni ser modificado). sta, se define anteponiendo la palabra clave static al nombre de la variable:

    class PersonaAPositivo extends Persona { public static $tipo_sangre = 'A+';}

    Accediendo a las propiedad de un objeto

    Para acceder a las propiedad de un objeto, existen varias maneras de hacerlo. Todas ellas, dependern del mbito desde el cual se las invoque as como de su condicin y visibilidad.

    Acceso a variables desde el mbito de la claseSe accede a una propiedad no esttica dentro de la clase, utilizando la pseudo-variable $this siendo esta pseudo-variable una referencia al objeto mismo:

    return $this->nombre;

    Cuando la variable es esttica, se accede a ella mediante el operador de resolucin de mbito, doble dos-puntos :: anteponiendo la palabra clave self o parent segn si trata de una variable de la misma clase o de otra de la cual se ha heredado, respectivamente:

    print self::$variable_estatica_de_esta_clase;print parent::$variable_estatica_de_clase_madre;

    Acceso a variables desde el exterior de la claseSe accede a una propiedad no esttica con la siguiente sintxis: $objeto->variableNtese adems, que este acceso depender de la visibilidad de la variable. Por lo tanto, solo variables pblicas pueden ser accedidas desde cualquier mbito fuera de la clase o clases heredadas.

    # creo el objeto instanciando la clase$persona_a_positivo = new PersonaAPositivo();

    # accedo a la variable NO estticaprint $persona_a_positivo->nombre;

    17

  • POO y MVC en PHP Eugenia Bahit

    Para acceder a una propiedad pblica y esttica el objeto no necesita ser instanciado, permitiendo as, el acceso a dicha variable mediante la siguiente sintxis:Clase::$variable_esttica

    # accedo a la variable estticaprint PersonaAPositivo::$tipo_sangre;

    Constantes de Clase

    Otro tipo de propiedad de una clase, son las constantes, aquellas que mantienen su valor de forma permanente y sin cambios. A diferencia de las propiedades estticas, las constantes solo pueden tener una visibilidad pblica.Puede declararse una constante de clase como cualquier constante normal en PHP 5. El acceso a constantes es exactamente igual que al de otras propiedades.

    Reglas de Estilo sugeridasUtilizar NOMBRE_DE_CONSTANTE en letra MAYSCULA, ayuda a diferenciar rpidamente constantes de variables, haciendo ms legible el cdigo.

    const MI_CONSTANTE = 'Este es el valor esttico de mi constante';

    Mtodos en PHP 5

    Cabe recordar, para quienes vienen de la programacin estructurada, que el mtodo de una clase, es un algoritmo igual al de una funcin. La nica diferencia entre mtodo y funcin, es que llamamos mtodo a las funciones de una clase (en la POO), mientras que llamamos funciones, a los algoritmos de la programacin estructurada.

    Reglas de Estilo sugeridasUtilizar nombres_de_funciones_descriptivos, en letra minscula, separando palabras por guiones bajos, ayuda a comprender mejor el cdigo fuente hacindolo ms intuitivo y legible.

    La forma de declarar un mtodo es anteponiendo la palabra clave function al nombre del mtodo, seguido por un par parntesis de apertura y cierre y llaves que encierren el algoritmo:

    # declaro la claseclass Persona { #propiedades

    #mtodos function donar_sangre() { #... }}

    Al igual que cualquier otra funcin en PHP, los mtodos recibirn los parmetros necesarios indicando aquellos requeridos, dentro de los parntisis:

    18

  • POO y MVC en PHP Eugenia Bahit

    # declaro la claseclass Persona { #propiedades

    #mtodos function donar_sangre($destinatario) { #... }}

    Mtodos pblicos, privados, protegidos y estticosLos mtodos, al igual que las propiedades, pueden ser pblicos, privados, protegidos o estticos. La forma de declarar su visibilidad tanto como las caractersticas de sta, es exactamente la misma que para las propiedades.

    static function a() { }protected function b() { }private function c() { }# etc...

    Mtodos abstractosA diferencia de las propiedades, los mtodos, pueden ser abstractos como sucede con las clases.

    El Manual Oficial de PHP, se refiere a los mtodos abstractos, describindolos de la siguiente forma:

    [] Los mtodos definidos como abstractos simplemente declaran la estructura del mtodo, pero no pueden definir la implementacin. Cuando se hereda de una clase abstracta, todos los mtodos definidos como abstract en la definicin de la clase parent deben ser redefinidos en la clase child; adicionalmente, estos mtodos deben ser definidos con la misma visibilidad (o con una menos restrictiva). Por ejemplo, si el mtodo abstracto est definido como protected, la implementacin de la funcin puede ser redefinida como protected o public, pero nunca como private. []7

    Para entender mejor los mtodos abstractos, podramos decir que a grandes rasgos, los mtodos abstractos son aquellos que se declaran inicialmente en una clase abstracta, sin especificar el algoritmo que implementarn, es decir, que solo son declarados pero no contienen un cdigo que especfique qu harn y cmo lo harn.

    Tal vez, te preguntes Cul es la utilidad de definir mtodos abstractos y clases abstractas? Para responder a esta pregunta, voy enfocarme en un caso de la vida real, en el cual estuve trabajando hace poco tiempo.

    Ejemplo

    Se trataba de hacer un sistema de gestin informtica, para las farmacias de los Hospitales del Gobierno de la Ciudad de Buenos Aires. Un punto fundamental, era pensar en los insumos farmacuticos como un todo abstracto. Por

    qu? Fundamentalmente, porque si bien existen insumos farmacuticos de todo tipo y especie, cada uno de ellos, comparte caractersticas comunes, que por s solas no pueden definirse con precisin. Por ejemplo, todos los insumos

    7 Fuente de la cita: http://www.php.net/manual/es/language.oop5.abstract.php

    19

  • POO y MVC en PHP Eugenia Bahit

    farmacuticos requieren de un tipo de conservacin especial. Algunos requieren refrigeracin a determinada temperatura que solo puede ser satisfecha conservndolos en una heladera; otros requieren conservarse en un ambiente seco; otros, no pueden tomar contacto con el exterior, a fin de conservar su capacidad estril; etc. Poda definirse con exactitud una clase Insumo? La respuesta a esa pregunta, es justamente su pregunta retrica iras a la farmacia a pedirle al farmacutico deme un insumo de 500 mg? Insumo, representa la entidad abstracta y para eso, sirven las clases abstractas. Con ellas declaramos aquellos

    objetos que no pueden ser definidos con presicin pero aseguramos all, todas aquellas caractersticas que dichos objetos, guardarn entre s. Declarar un mtodo conservar_insumo() como abstracto, servira para luego definir con exactitud, en una clase heredada, el algoritmo exacto que determinado insumo necesitara para procesar su conservacin. Es as entonces, que una clase InsumoRefrigerado heredara de Insumo, y redefinira el mtodo conservar_insumo() indicando un algoritmo que solicitara la temperatura a la cual deba conservarse en heladera, etc.

    Mtodos mgicos en PHP 5PHP 5, nos trae una gran cantidad de auto-denominados mtodos mgicos. Estos mtodos, otorgan una funcionalidad pre-definida por PHP, que pueden aportar valor a nuestras clases y ahorrarnos grandes cantidades de cdigo. Lo que muchos programadores consideramos, ayuda a convertir a PHP en un lenguaje orientado a objetos, cada vez ms robusto.

    Entre los mtodos mgicos, podemos encontrar los siguientes:

    El Mtodo Mgico __construct()El mtodo __construct() es aquel que ser invocado de manera automtica, al instanciar un objeto. Su funcin es la de ejecutar cualquier inicializacin que el objeto necesite antes de ser utilizado.

    # declaro la claseclass Producto { #defino algunas propiedades public $nombre; public $precio; protected $estado;

    #defino el mtodo set_estado_producto() protected function set_estado_producto($estado) { $this->estado = $estado; }

    # constructor de la clase function __construct() { $this->set_estado_producto('en uso'); }}

    En el ejemplo anterior, el constructor de la clase se encarga de definir el estado del producto como en uso, antes de que el objeto (Producto) comience a utilizarse. Si se agregaran otros mtodos, stos, podrn hacer referencia al estado del producto, para determinar si ejecutar o no determinada funcin. Por ejemplo, no podra mostrarse a la venta un producto en uso por el sistema, ya que a ste, se le podra estar modificando el precio.

    El mtodo mgico __destruct()El mtodo __destruct() es el encargado de liberar de la memoria, al objeto cuando ya no es referenciado. Se puede aprovechar este mtodo, para realizar otras tareas que se

    20

  • POO y MVC en PHP Eugenia Bahit

    estimen necesarias al momento de destruir un objeto.

    # declaro la claseclass Producto { #defino algunas propiedades public $nombre; public $precio; protected $estado;

    #defino el mtodo set_estado_producto() protected function set_estado_producto($estado) { $this->estado = $estado; }

    # constructor de la clase function __construct() { $this->set_estado_producto('en uso'); }

    # destructor de la clase function __destruct() { $this->set_estado_producto('liberado'); print 'El objeto ha sido destruido'; }}

    Otros mtodos mgicosPHP nos ofrece otros mtodos mgicos tales como __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __set_state y __clone.

    Puede verse una descripcin y ejemplo de su uso, en el sitio Web oficial de PHP:

    http://www.php.net/manual/es/language.oop5.magic.php

    21

  • POO y MVC en PHP Eugenia Bahit

    Ejercicios PrcticosPara practicar lo que hemos visto hasta ahora, les propongo hacer algunos ejercicios, a fin de asimilar los conocimientos de los captulos I y II.

    Ejercicio N1: Sobre la programacin orientada a objetos

    1.1) Qu es la Programacin Orientada a Objetos?a) Un patrn de diseo de software

    b) Un paradigma de programacin

    c) La nica forma en la que se puede programar en PHP

    d) Ninguna de las anteriores

    1.2) Cul de las siguientes opciones, responde mejor a los elementos que forman parte de la POO?

    a) Clases, objetos, mtodos, atributos y propiedades

    b) Atributos, eventos y funciones

    c) Mtodos, inmutabilidad, abstraccin, funciones y prototipos

    e) Variables, constantes y funciones

    1.3) Cul de las siguientes afirmaciones es FALSA con respecto a las caractersticas de la POO?

    a) La abstraccin y el polimorfismo son caracterstica esenciales de la programacin orientada a objetos

    b) Encapsulamiento es sinnimo de aislamiento

    c) En la POO, la modularidad, es la caracterstica que permite dividir una aplicacin, en partes ms pequeas, con independencia unas de las otras

    22

  • POO y MVC en PHP Eugenia Bahit

    Ejercicio N2: Sobre la POO en PHP

    2.1) Dado el siguiente cdigo:

    Qu crees que fallara al intentar ejecutarlo?a) ItemProducto fallar ya que est heredando de otra clase

    b) No fallara nada

    c) Producto no puede heredar de ItemProducto ya que esta clase ha sido declarada como clase final

    2.2) Cul crees que ser la salida del siguiente cdigo?

    a) Cliente desconocido 1001

    b) Cliente desconocido

    c) Se imprimira Cliente desconocido pero fallara luego el acceso a $id ya que es una propiedad protegida

    2.3) Cul crees que ser la salida del siguiente cdigo?

  • POO y MVC en PHP Eugenia Bahit

    protected $id = 1001;

    function __construct() { self::$nombre = 'Juan Prez'; }}

    print Cliente::$nombre_completo;

    ?>

    a) Cliente desconocido

    b) Juan Prez

    Explica porqu has elegido esa respuesta:

    2.4) Teniendo en cuenta el siguiente cdigo:

    Cul de las siguientes opciones, estimas que sera la apropiada para imprimir en pantalla, la propiedad "nombre_completo"a) print Cliente::nombre_completo;

    b) print Cliente::$nombre_completo;

    c) $cliente = new Cliente();print $cliente->nombre_completo;

    d) $cliente = new Cliente();print $cliente->$nombre_completo;

    24

  • POO y MVC en PHP Eugenia Bahit

    Soluciones a los ejercicios 1 y 2

    Ejercicio N1Pregunta 1.1: respuesta bPregunta 1.2: respuesta aPregunta 1.3: respuesta b

    Ejercicio N2Pregunta 2.1: respuesta cPregunta 2.2: respuesta cPregunta 2.3: respuesta a

    porque a las propiedades estticas no se les puede modificar su valor

    Pregunta 2.4: respuesta b

    25

  • POO y MVC en PHP Eugenia Bahit

    Programacin Real Orientada a Objetos en PHP

    Veremos ahora, un ejemplo basado en la realidad de un programador.

    En este caso, se trata de un ABM de usuarios.Ntese que los mtodos respectivos han sido resumidos no encontrndose en stos, algoritmos de validacin de datos. Se ejemplifica todo aquello que es relevante en la POO.

    Archivos fuente del ABM de Usuarios

    Archivo db_abstract_model.php

  • POO y MVC en PHP Eugenia Bahit

    array_pop($this->rows); }

    } ?>

    Archivo usuarios_model.php

  • POO y MVC en PHP Eugenia Bahit

    endforeach; $this->query = " UPDATE usuarios SET nombre='$nombre', apellido='$apellido', clave='$clave' WHERE email = '$email' "; $this->execute_single_query(); }

    public function delete($user_email='') { $this->query = " DELETE FROM usuarios WHERE email = '$user_email' "; $this->execute_single_query(); }

    function __destruct() { unset($this); }

    } ?>

    Archivo abm_example.php

  • POO y MVC en PHP Eugenia Bahit

    $usuario4 = new Usuario(); $usuario4->get('[email protected]'); $usuario4->delete('[email protected]'); print $usuario4->nombre . ' ' . $usuario4->apellido . ' ha sido eliminado'; ?>

    Explicando el cdigo en el contexto de la POO: La mejor forma de aprender y comprender

    En principio tenemos 3 archivos:

    2 archivos son "clases" de dos modelos de objetos.

    1 archivo, es el que realiza las instancias creando la cantidad de objetos necesaria.

    Respuestas a Preguntas Frecuentes sobre el cdigo

    1. Respuestas a preguntas frecuentes de la clase DBAbstractModel

    1.1 Por qu la clase est definida como abstracta?Una base de datos, puede tener varios mtodos, como insertar datos, editar datos, eliminar datos o simplemente consultar datos. El algoritmo de cada uno de esos mtodos no puede definirse con exactitud por qu? Porque cada dato que se inserte, modificque, elimine o consulte, variar en infinidad de aspectos: desde los tipos de datos hasta las tablas y los campos a los que se deba acceder, etc.

    Basados en el principio de modularidad de la POO, es necesario tener en cuenta, que HOY, necesito un ABM de usuarios, pero maana, este requisito puede ampliarse y, debo dejar todo preparado para que el sistema pueda ser escalable y modular (otros mdulos pueden ser requeridos en el futuro).

    Si solo contemplara los mtodos de insercin, edicin, consulta y eliminacin de usuarios en esta clase, estara cometiendo dos errores imperdonable:

    1. No estara respetando el principio de modularidad de la POO

    2. Los mtodos mencionados no son a caso mtodos de un nuevo objeto llamado Usuario?

    Por otro lado, por cuestiones de seguridad, se haca necesario no permitir instanciar esta

    clase desde ningn lugar de la aplicacin y controlar con mucha precaucin, el acceso a sus mtodos y propiedades, ya que una base de datos, es el "alma" de toda aplicacin.

    1.2 Para qu declarar propiedades estticas?En principio, tanto el host como el usuario y contrasea de la base de datos, en esta aplicacin, son nicos. No varan. De all, que como caracterstica se les asign ser estticos, a fin de, por cuestiones de seguridad, no puedan ser modificados dinmicamente (tengamos en cuenta que una clase abstracta debe ser heredada s o s para ser utilizada).

    1.3 Por qu propiedades estticas y no constantes de clase?Porque a las constantes, aunque lgicamente guardan en s mismas la condicin de "estticas" en el sentido de que "no pueden ser modificadas", pueden ser accedidas desde cualquier clase que herede de la clase que las declare. Pues entonces, la pregunta es Para qu querra una clase "hija" conocer el host, usuario y contrasea de una base de datos? Es una cuestin ntamente de seguridad, ya que a una constante no se la puede definir como privada y si se la quiere ocultar a las clases "hijas", no quedar otra alternativa que declararlas como propiedades estticas.

    29

  • POO y MVC en PHP Eugenia Bahit

    1.4 Por qu propiedades estticas y a la vez privadas?(ver respuestas anteriores)

    1.5 Con qu sentido declarar las propiedades como protegidas?Es simple. Algunos mdulos pueden necesitar utilizar una base de datos diferente. Todos los mdulos, necesitarn queries personalizados para sus consultas. Y lgicamente, todos necesitarn acceder y conocer los resultados de los datos arrojados por una consulta. Es decir, que tanto la propiedad db_name como query y rows, deben tener permisos para ser ledas y modificadas, pero Ojo! Solo por las clases hijas de DBAbstractModel Qu sentido tendra permitir a un programador acceder a estas propiedades si puede ser la clase hija, quien las controle?

    1.6 Por qu los mtodos open y close_connection son privados?Pues porque la clase es la nica con permiso para abrir y cerrar conexiones a la base de datos. Es una cuestin de control y seguridad. Si necesitas insertar datos, consultarlos o hacer con ellos otras actividades, tienes mtodos protegidos pero no privados, que te permiten hacerlo.

    1.7 Por qu los mtodos de consulta y ejecucin son protegidos y no pblicos?Consultar una base de datos, modificar o eliminar sus datos, as como insertar nuevos, no puede ser una tarea que se deje librada al azar y al libre acceso de cualquiera. Es necesario "proteger" los datos a fin de resguardar su integridad y, la forma de hacerlo, es "proteger" los mtodos que se encuentran al servicio de dichos datos.

    1.8 Por qu hay mtodos declarados como abstractos y adems protegidos?Esta pregunta, en gran parte, la responde la respuesta de la pregunta 1.1. El hecho de que se definan como abstractos, es porque necesariamente DEBEN ser mtodos comunes a toda clase que los hereden. Pero solo la clase hija, podr definirlos (re-definirlos

    tcnicamente hablando) ya que tal cual se explic en la pregunta 1.1., solo ellas conocen los requerimientos especficos.

    Se declaran adems como protegidos, por una cuestin de seguridad ("por las dudas" para que solo puedan ser vistos por clases heredadas). Esto, da lugar a las clases hijas, a que modifiquen su visibilidad de acuerdo al criterio de cada una de ellas.

    2. Respuestas a preguntas sobre la clase Usuario

    2.1 Por qu la clase Usuario es una extensin de DBAbstractModel?La clase usuario TIENE necesariamente que heredar de DBAbstractModel ya que DEBE utilizar sus mtodos (propios y definidos para acceder a la base de datos) y redefinir obligadamente aquellos declarados como abstractos, a fin de continuar un modelo de administracin de los ABM (altas, bajas y modificaciones).

    2.2 Con qu fin nombre, apellido e e-mail son propiedades pblicas mientras que clave es privada y id, protegida?Pensemos esto como en la vida real: tu nombre, apellido e e-mail, puede ser necesario para cientos de "trmites" y acciones de tu vida diaria y no andas por la vida negndolos a todo quien te los pida. Podramos decir, que no tiene nada de malo que facilites pblicamente estos datos, a quien decidas.Ahora bien le das tu contrasea a cualquiera? Si lo haces, deja de hacerlo. La contrasea es un dato que debe ser privado. Nadie puede tener acceso a l. Es una cuestin de seguirdad.

    El nmero de ID, sera como tu nmero de documento o pasaporte. Es un dato que debes mantener protegido pero que en algunos casos, te ser requerido y necesitars darlo obligadamente. Por ejemplo, no podras negarte a mostrar tu pasaporte en migraciones. Sin embargo, DEBES negarte a decirle el PIN de tu tarjeta de crdito a cualquier persona.

    30

  • POO y MVC en PHP Eugenia Bahit

    2.3 Por qu se utiliza el mtodo __construct() para modificar el nombre de la base de datos? Por qu no se encarga la clase madre de modificar ese valor?El nombre de la base de datos, es algo que variar de acuerdo al mdulo que lo est trabajando. Seguramente, de existir en el futuro una clase llamada Producto, sta, sobreescribir el valor de db_name. Modificarlo automticamente utilizando un cosntructor, nos asegura instanciar el objeto con un valor de propiedad adecuado.

    2.4 Por qu se utiliza require_once y no include_once?La diferencia entre include y require es que require, si no puede incluir el archivo al que se est importando, frena la ejecucin del script, siendo que include, solo arroja un error, pero contina la ejecucin. Al tratarse de una

    clase que "requiere" s o s, de su clase madre, no tendra sentido permitir que se contine ejecutando, si no ha podido cargarse el archivo.

    3. Respuestas a preguntas sobre el archivo de instancias

    3.1 Por qu el archivo tiene cuatro instancias al mismo objeto?Es necesario hacer notar que si bien los objetos comparten propiedades y mtodos en comn, no todos son idnticos. Es decir, todos los seres humanos tenemos ciertas caractersticas en comn y realizamos acciones similares. Pero cada uno de nosotros, tiene una nica identidad. Por eso, no puede decirse que se instancia cuadro veces el mismo objeto, porque en realidad, son cuatro objetos diferentes donde cada uno de ellos, tiene una identidad propia.

    31

  • POO y MVC en PHP Eugenia Bahit

    CAPTULO IIIIntroduccin al patrn arquitectnico MVC

    32

  • POO y MVC en PHP Eugenia Bahit

    Introduccin al patrn Arquitectnico MVC

    MVC, son las siglas de modelo-vista-controlador (o en ingls, model-view-controller), que es uno de los tantos patrones de arquitectura de software.Antes de abordar de lleno este patrn, vamos a intentar hacer una introduccin a la arquitectura de software, desmembrndola de lo general hacia lo particular, para al fin llegar al detalle, procurando entender exactamente de que se trata, en el contexto adecuado.

    Probablemente, este captulo sea el ms complejo (y mucho ms extenso en relacin al Captulo I). Pero si quieres poder aplicar de forma decuada el patrn MVC, debes hacer el esfuerzo de seguirlo con especial inters y actitud entuciasta.

    Introduccin a la Arquitectura de Software

    Qu es la arquitectura de software?Es necesario aclarar, que no existe una definicin nica, exacta, abarcativa e inequvoca de arquitectura de software. La bibliografa sobre el tema es tan extensa como la cantidad de definiciones que en ella se puede encontrar. Por lo tanto tratar, no de definir la arquitectura de software, sino ms bien, de introducir a un concepto simple y sencillo que permita comprender el punto de vista desde el cual, este libro abarca a la arquitectura de software pero, sin nimo de que ello represente una definicin ms.

    A grandes rasgos, puede decirse que la Arquitectura de Software es la forma en la que se organizan los componentes de un sistema, interactan y se relacionan entre s y con el contexto, aplicando normas y principios de diseo y calidad, que fortalezcan y fomenten la usabilidad a la vez que dejan preparado el sistema, para su propia evolucin.

    Tal vez ests pensando ...al fin y al cabo, me haz dado una definicin ms.... La respuesta es s. Probablemente no pude contenerme de hacerlo no lo niego -. Pero, no debes tomar lo anterior como una definicin, sino como la forma en la que en este libro, se abarca la arquitectura de software.

    Tendencias de la Arquitectura de SoftwareSi bien no puede decirse o mejor dicho, no es muy acadmico decirlo, voy a tomarme el atrevimiento de mencionar solo dos tendencias arquitectnicas, claramente diferenciadas entre s:

    La Arquitectura de Software Orientada a Objetos (como ingenira de sistemas)

    La Arquitectura Estructurada (como desarrollo de una aplicacin)

    Como podemos ver, en este libro, es a la primera a la cual nos enfocamos.

    33

  • POO y MVC en PHP Eugenia Bahit

    A fin de satisfacer la inquietud de curiosos (y de paso, no ocultar que existen), voy a mencionar la existencia de otras dos corrientes: la arquitectura basada en patrones y la arquitectura basada en procesos y metodologas.

    Personalmente, no las considero como cuatro corrientes Por qu? Porque independientemente de cual te agrade ms, si la AS orientada o objetos o la AS estructural, implican necesariamente dos corrientes que deben aplicarse de forma optativa (o utilizas una o la otra pero no las dos simultneamente), mientras que la AS basada en patrones y la AS basada en procesos, pueden utilizarse como complemento de las dos primeras. Pero esto, es mera filosofa propia, con la cual, no he encontrado demasiado consenso. Pues no los aburrir con ello e iremos a lo prctico.

    Caractersticas de la Arquitectura de Software: Atributos de calidadLa Calidad del Software puede definirse como los atributos implcitamente requeridos en un sistema que deben ser satisfechos. Cuando estos atributos son satisfechos, puede decirse (aunque en forma objetable), que la calidad del software es satisfactoria.

    Estos atributos, se gestan desde la arquitectura de software que se emplea, ya sea cumpliendo con aquellos requeridos durante la ejecucin del software, como con aquellos que forman parte del proceso de desarrollo de ste.

    Atributos de calidad que pueden observarse durante la ejecucin del software

    1. Disponibilidad de uso2. Confidencialidad, puesto que se

    debe evitar el acceso no autorizado al sistema

    3. Cumplimiento de la Funcionalidad requerida

    4. Desempeo del sistema con respecto a factores tales como la capacidad de respuesta

    5. Confiabilidad dada por la constancia operativa y permanente del sistema

    6. Seguridad externa evitando la prdida de informacin debido a errores del sistema

    7. Seguridad interna siendo capaz de impedir ataques, usos no autorizados, etc.

    Atributos de calidad inherentes al proceso de desarrollo del software

    8. Capacidad de Configurabilidad que el sistema otorga al usuario a fin de realizar ciertos cambios

    9. Integrabilidad de los mdulos independientes del sistema

    10. Integridad de la informacin asociada

    11. Capacidad de Interoperar con otros sistemas (interoperabilidad)

    12. Capacidad de permitir ser Modificable a futuro (modificabilidad)

    13. Ser fcilmente Mantenible (mantenibilidad)

    14. Capacidad de Portabilidad, es decir que pueda ser ejecutado en diversos ambientes tanto de software como de hardware

    15. Tener una estructura que facilite la Reusabilidad de la misma en futuros sistemas

    16. Mantener un diseo arquitectnico Escalable que permita su ampliacin (escalabilidad)

    17. Facilidad de ser Sometido a Pruebas que aseguren que el sistema falla cuando es lo que se espera (testeabilidad)

    34

  • POO y MVC en PHP Eugenia Bahit

    De lo general a lo particular: del estilo arquitectnico al patrn de diseo

    Existe una diferencia entre Estilo Arquitectnico, Patrn Arquitectnico y Patrn de Diseo, que debe marcarse a fin de evitar las grandes confusiones que inevitablemente, concluyen en el mal entendimiento y en los resultados poco satisfactorios. stos, son los que en definitiva, aportarn calidad al sistema resultante. En lo sucesivo, trataremos de establecer la diferencia entre estos tres conceptos, viendo como los mismos, se relacionan entre s, formando parte de un todo: la arquitectura de software.

    Relacin y DiferenciaEstilo Arquitectnico, Patrn Arquitectnico y Patrn de Diseo, representan, de lo general a lo particular, los niveles de abstraccin que componen la Arquitectura de Software. En este sentido, puede decirse que:

    El Estilo Arquitectnico es el encargado de:

    Describir la estructura general de un sistema, independientemente de otros estilos

    Definir los componentes del sistema, su relacin e interactividad Ejemplos : flujo de datos, llamada y retorno, etc.

    El Patrn Arquitectnico es el nivel en el cual la arquitectura de software:

    Define la estructura bsica de un sistema, pudiendo estar relacionado con otros patrones

    Representa una plantilla de construccin que provee un conjunto de subsistemas aportando las normas para su organizacin

    Ejemplos : Capas, MVC, Tuberas y Filtros, Pizarra, etc.

    El Patrn de Diseo es el tercer nivel de abstraccin de la arquitectura de software, cuya finalidad es la de precisar en detalle los subsistemas y componentes de la aplicacin Ejemplos : Proxy, Command, Factory, etc..

    El Patrn Arquitectnico modelo-vista-controlador (MVC)

    Habiendo dejado en claro de qu hablamos exactamente cuando nos referimos a patrn arquitectnico, estamos en condiciones de ahondar en los detalles del patrn MVC.

    Aclarciones previasAntes de caer inmersos en el conocimiento sobre el patrn MVC, quiero dejar en claro que en este libro, no har referencia a ningn framework.

    El objetivo de POO y MVC en PHP no es el de formar a programadores en el uso de frameworks, sino que el mismo, parte de una clara pregunta a caso los frameworks no han

    sido desarrollados por programadores? Tenemos la alternativa de utilizar frameworks para ahorrar tiempo de programacin o, si realmente nos apasiona programar, adquirimos los conocimientos necesarios, tenemos la capacidad y nos animamos, podemos crear nuestros propios frameworks. De hecho, no se trata de reinventar la rueda, sino de crear una, adaptada a nuestras necesidades. Y si lo que

    35

  • POO y MVC en PHP Eugenia Bahit

    necesitamos es una rueda para acoplar a un mueble que acabamos de crear cul sera el sentido de intentar modificar una rueda de camin si tenemos todas las herramientas necesarias para ser creadores y no modificadores?

    Claro que esto, depende de la pasin, gusto, capacidad y por qu no, de la ambicin de cada uno. El tiempo, es discutible. Pues puede demandarte ms tiempo modificar algo que ya existe, que crearlo. Si quieres reparar un mueble te llevar ms tiempo repararlo que ir a comprar uno nuevo. Y si eres ebanista,

    seguramente te llevar menos tiempo hacer un nuevo mueble que ir a comprarlo. Pues sabes exactamente lo que necesitas y como hacerlo y eso, har que ahorres el tiempo de recorrer todas las muebleras y termines comprando el mueble que ms se asemeje al que quieres. El mueble, ser similar, pero no exactamente igual al que tu imaginaste. De todas formas, la alternativa de modificar, siempre la tienes... al igual que tambin tienes la de crear. Todo depender del criterio de eleccin que apliques y sea cual sea, tu eleccin ser la correcta, justamente porque habrs elegido y eso, es lo ms importante.

    Qu es el patrn MVC?El patrn MVC es un patrn de arquitectura de software encargado de separar la lgica de negocio de la interfaz del usuario y es el ms utilizado en aplicaciones Web, ya que facilita la funcionalidad, mantenibilidad y escalabilidad del sistema, de forma simple y sencilla, a la vez que permite no mezclar lenguajes de programacin en el mismo cdigo.

    MVC divide las aplicaciones en tres niveles de abstraccin:

    Modelo: representa la lgica de negocios. Es el encargado de accesar de forma directa a los datos actuando como intermediario con la base de datos. Lo que en nuestro ejemplo de programacin orientada a objetos, seran las clases DBAbstractModel y Usuario.

    Vista: es la encargada de mostrar la informacin al usuario de forma grfica y humanamente legible.

    Controlador: es el intermediario entre la vista y el modelo. Es quien controla las interacciones del usuario solicitando los datos al modelo y entregndolos a la vista para que sta, lo presente al usuario, de forma humanamente legible.

    Cmo funciona el patrn MVC?El funcionamiento bsico del patrn MVC, puede resumirse en:

    El usuario realiza una peticin

    El controlador captura el evento (puede hacerlo mediante un manejador de eventos handler -, por ejemplo)

    Hace la llamada al modelo/modelos correspondientes (por ejemplo, mediante una llamada de retorno callback -) efectuando las modificaciones pertinentes sobre el modelo

    El modelo ser el encargado de interactuar con la base de datos, ya sea en forma directa, con una capa de abstraccin para ello, un Web Service, etc. y retornar esta informacin al controlador

    36

  • POO y MVC en PHP Eugenia Bahit

    El controlador recibe la informacin y la enva a la vista

    La vista, procesa esta informacin pudiendo hacerlo desde el enfoque que veremos en este libro, creando una capa de abstraccin para la lgica (quien se encargar de procesar los datos) y otra para el diseo de la interfaz grfica o GUI. La lgica de la vista, una vez procesados los datos, los acomodar en base al diseo de la GUI - layout y los entregar al usuario de forma humanamente legible.

    Funcionamiento del patrn modelo-vista-controlador

    37

  • POO y MVC en PHP Eugenia Bahit

    Hasta qu, hemos hablado de estilos arquitectnicos, nos hemos introducido en uno de los patrones arquitectnicos (MVC) pero, en todo esto en qu momento intervienen los patrones de diseo?

    Es aqu donde debemos notar que stos, intervienen en la forma en la que cada capa (modelo, vista y controlador), disea su estructura. El controlador decidir (aunque en realidad, nosotros lo haremos) si utilizar un handler para manejar los eventos del usuario. En ese caso, estara optando por un patrn de diseo. Si para llamar al modelo, utiliza un callback, estara utilizando otro, y as en lo sucesivo.

    Personalmente, sugiero que, a no ser que se trate de sistemas realmente robustos y complejos, no se compliquen demasiado por ahora - en aplicar todos y cada uno de los patrones de diseo que encuentren en el camino. La forma de hacerlo bien, es:

    Sencillez y simplicidad

    Fcil mantenibilidad

    Practicidad para evolucionar

    Si se tienen en cuenta estas tres premisas, el resultado de un cdigo limpio, legible y fcil de interpretar para cualquier programador, estar 90% asegurado.

    38

  • POO y MVC en PHP Eugenia Bahit

    CAPTULO IVEl patrn MVC en PHP

    39

  • POO y MVC en PHP Eugenia Bahit

    El Patrn MVC en PHP

    Para que el concepto de modelo-vista-controlador nos queda ms claro, vamos a ir analizndolo con ejemplos concretos, en el lenguaje que impulsa este libro: PHP.

    Al final de este captulo, vamos a encontrar ejercicios prcticos de autoevaluacin y luego, continuaremos transformando y ampliando nuestro primer ejemplo del Captulo II, siguiendo el patrn arquitectnico MVC, con sus correspondientes comentarios y aclaraciones.

    El modelo

    Con respecto al modelo, no tenemos demasiada novedad. El modelo, no es ms que el conjunto de clases con las que hemos trabajado hasta ahora, incluyendo entre ellas, la capa de abstraccin de la base de datos.

    Interfaces en PHP: un nuevo concepto para crear modelosEn esta etapa, podemos ampliar las referencias de PHP, incorporando un nuevo concepto: las interfaces.

    El Manual Oficial de PHP describe las interfaces de la siguiente forma:

    Las interfaces de objetos permiten crear cdigo con el cual especificar qu mtodos deben ser implementados por una clase, sin tener que definir cmo estos mtodos son manipulados. Las interfaces son definidas utilizando la palabra clave interface, de la misma forma que con clases estndar, pero sin mtodos que tengan su contenido definido. Todos los mtodos declarados en una interfaz deben ser public, ya que sta es la naturaleza de una interfaz.8[...]

    Una interface se define utilizando la palabra clave interface y se la implementa utilizando la palabra clave implements.

    En varias ocasiones, las interfaces nos servirn para ampliar los modelos.

    Generamos la interface:

    interface Postre { public function set_ingredientes(); }

    Implementamos la interface:

    class Bizcochuelo implements Postre {

    var $ingredientes = array();

    public function set_ingredientes() { $this->ingredientes = array('harina'=>'2 tazas', 'leche'=>'1 taza',

    8 Fuente de la cita: http://php.net/manual/es/language.oop5.interfaces.php

    40

  • POO y MVC en PHP Eugenia Bahit

    'azucar'=>'1 taza', 'huevo'=>1 ); } }

    Extendemos una clase (que por defecto, implementar la interface):

    class BizcochueloVainilla extends Bizcochuelo {

    public function set_ingredientes() { $this->ingredientes['escencia de vainilla'] = 'a gusto'; }

    function __construct() { parent::set_ingredientes(); $this->set_ingredientes(); } }

    Tambin podemos crear otra clase que implemente la interface:

    class Alfajor implements Postre {

    public function set_ingredientes() { $this->ingredientes = array('Tapas de maizena' => 2, 'dulce de leche'=>'1 cda. sopera', 'coco rallado'=>'1 cdta. de te'); }

    function __construct() { $this->set_ingredientes(); } }

    Diferencia entre Interfaces y Clases abstractasProbablemente te preguntes cul es la diferencia entre una interface y una clase abstracta? Creme: todos nos lo hemos preguntado alguna vez :)

    En principio, existe una diferencia conceptual que a niveles prcticos tal vez no es del todo clarificadora. Esta diferencia, radica en que las clases abstractas, no dejan de ser clases, las cuales representan la abstraccin de un objeto siguiendo un orden de relacin jerarquca entre ellas: Clase B hereda de Clase A y Clase C hereda de Clase B, pero no puede tener herencias mltiples, es decir no puede heredar de ms de una clase, ya que ellas, guardan una relacin de orden jerrquico entre s.

    class A { }class B extends class A { } #correctoclass C extends class B { } #correctoclass D { } #correctoclass E extends class A, class D { } # incorrecto!!! no se puede hacer!!!# lo correcto sera:class D extends class A { }class E extends class D { }

    41

  • POO y MVC en PHP Eugenia Bahit

    A diferencia de las clases abstractas, conceptualmente, las interfaces son solo un conjunto de mtodos caractersticos de diversas clases, independientemente de la relacin que dichas clases mantengan entre s. De hecho, una misma clase, puede implementar mltiples interfaces:

    interface A { } interface B { } interface C { } class MiClase implements A, B, C { }

    No obstante la diferencia conceptual, podemos establecer claras diferencias prcticas, que nos ayudarn a asimilar mejor estos conceptos:

    Las interfaces no pueden definir propiedades (de hecho, no poseen propiedades porque a diferencia de las clases abstractas no tienen relacin con un objeto, y solo los objetos tienen propiedades)

    Las interfaces no pueden tener mtodos definidos con su algoritmo correspondiente (solo pueden declarar los mtodos pero no pueden indicar el qu ni el cmo hacerlo, mientras que las clases abstractas, s pueden)

    Las interfaces no pueden instanciarse porque no tienen referencias asociadas a objetos, mientras que las clases abstractas no pueden instanciarse, porque sus objetos son entes abstractos que necesitan de una clase no abstracta para definirse con exactitud y poder ser instanciados.

    Todos los mtodos declarados en una interface deben ser pblicos, puesto que la finalidad de una interface, es brindar un mbito pblico de un modelo. Las clases abstractas, pueden tener mtodos abstractos tanto pblicos como protegidos (aquellos que debern ser obligatoriamente redefenidos por las clases que la hereden) y mtodos privados que solo ella utilice.

    Lo que NO deben hacer las insterfacesLas interfaces no pueden:

    Tener el mismo nombre que una clase (PHP las interpreta como una clase ms. Crear una interface con el mismo nombre que una clase, sera interpretado por PHP como una re-declaracin de clase)

    Diferentes interfaces no pueden tener nombres de mtodos idnticos si sern implementadas por la misma clase

    La vista

    Como hemos visto anteriormente, la vista representa la interfaz grfica del usuario (GUI), es decir, es la encargada de mostrar la informacin al usuario de manera humanamente legible.

    A tal fin, divideremos la vista en dos sub-capas: la GUI propiamente dicha y su lgica.

    42

  • POO y MVC en PHP Eugenia Bahit

    Vista: la interfaz grficaGeneralmente, en la prctica, no somos los programadores quienes nos hemos de encargar de la GUI. Es tarea que corresponde a diseadores Web o grficos, segn aplique.

    Como arquitectos, debemos tener preparada la estructura de nuestra aplicacin, para que diseadores puedan trabajar libremente en la GUI, sin tener que acceder al cdigo PHP. En este libro, veremos adems, como evitar por completo que los diseadores tengan que implementar cdigo PHP en sus GUI y que programadores, tengamos que implementar cdigo HTML en nuestras lgicas.

    En principio, la parte grfica de las vistas (archivos HTML, imgenes, CSS, etc.), deber tener un directorio reservado solo para ella. De esta forma, obtenemos varias ventajas de trabajar con el patrn MVC:

    Los archivos estticos (HTML, CSS, imgenes e incluso JavaScript) pueden almacenarse en un servidor independiente con todos los beneficios que esto conlleva (al igual que sucede con las bases de datos, los archivos estticos tambin pueden independizarse)

    Nos aseguramos de que el cdigo esttico (aquel desarrollado por diseadores), no rompa el ncleo de la aplicacin

    Permitimos a los diseadores trabajar cmodamente en la libertad de aplicar todos los conocimientos y herramientas inherentes a su rea de conocimiento, sin la presin de tener que implementar un lenguaje de programacin que desconocen, les es poco familiar o simplemente, la herramienta que utilizan para disear, suele daarles el cdigo no-esttico

    En segundo lugar, cada plantilla template - o archivo HTML, deber hacer referencia esttica a los datos que se quieran reemplazar dinmicamente. Para esto, no ser necesario implementar cdigo que no sea HTML.

    Veremos aqu como hacer referencia a estos datos, y ms adelante, veremos como la lgica de la vista se encargar de renderizarlos.

    Supongamos que tenemos una plantilla HTML, donde lo que necesitamos reemplazar de manera dinmica, es: ttulo de la pgina, keywords y descripcin. La mejor manera de referenciar a estos datos, facilitando la tarea a un diseador, es haciendo una referencia textual a stos. Para que a la vez, los programadores logremos diferenciar que all se incluyen datos dinmicos, una buena prctica, es encerrar esa referencia textual entre llaves.

    Veamos un ejemplo:

    {Ttulo de la Pgina}

    43

  • POO y MVC en PHP Eugenia Bahit

    {Ttulo de la Pgina}

    Como podemos ver, en la plantilla HTML solo hay cdigo HTML. Para un diseador, ser una tarea sencilla.

    Veremos en el siguiente paso, como la lgica de la vista, se encargar de reemplazar estos datos.

    La Lgica de la VistaTenemos la plantilla que cre nuestro diseador. Es hora de reemplazar dinmicamente los datos referenciados. Haremos esto, paso a paso, como si de una receta de cocina se tratara.

    Primer paso: crear un diccionario de datosEl diccionario de datos es el que contendr, literalmente hablando, un diccionario, indicando cuales referencias deben ser reemplazadas por cules datos, en forma dinmica.

    $diccionario = array( 'Ttulo de la Pgina'=>'POO y MVC en PHP', 'keywords'=>'poo, mvc, php, arquitectura de software', 'description'=>'El paradigma de la programacin orientada a objetos con el patrn arquitectnico MVC en PHP' );

    Segundo paso: obtener la plantilla HTMLPara traer la plantilla HTML, vamos a utilizar la funcin file_get_contents() de PHP, y almacenar el contenido de ella, en una variable.

    $template = file_get_contents('/carpeta/template.html');

    Tercer paso: reemplazar el contenido En el anteltimo paso, reemplazaremos los datos, utilizando el bucle foreach de PHP para recorrer el diccionario, y la funcin str_replace() de PHP, para reemplazar los

    44

  • POO y MVC en PHP Eugenia Bahit

    mismos.

    foreach ($diccionario as $clave=>$valor) { $template = str_replace('{'.$clave.'}', $valor, $template); }

    Cuarto paso: mostrar el contenido final al usuarioPor ltimo, imprimiremos el resultado obtenido en pantalla.

    print $template;

    Y con esto, habremos concluido la lgica de la vista, obteniendo en el navegador del usuario, la siguiente salida (vista de cdigo fuente):

    POO y MVC en PHP

    POO y MVC en PHP

    El controlador

    El controlador, aunque muchos de ustedes no lo crean, es quien tal vez, lleva la peor parte. En muchas ocasiones, es complicado programar el controlador de manera previsible para que pueda evolucionar, y generalmente, es sometido a refactorizaciones constantes, incluso mayores que las que puede sufrir el modelo.

    Recordemos que el controlador, es quien debe interactuar con el modelo y con la vista. Para hacerlo, deber previamente reconocer y manejar los distintos eventos del usuario, para saber:

    1. A qu modelo / modelos invocar

    2. Qu y cules propiedades o atributos del modelo/modelos modificar o parmetros

    45

  • POO y MVC en PHP Eugenia Bahit

    deber entregar a sus mtodos

    3. A qu vista entregar la informacin

    Pobre hombre! Le toca una tarea extenuante. Veamos paso a paso, como ayudar a este pobre controller-man en su tarea.

    Supongamos entonces, que tenemos dos modelos:

    Archivo models.php

    class ModeloUno { var $propiedad;

    function a($parametro) { $this->propiedad = $parametro; } }

    class ModeloDos { var $propiedad_1; var $propiedad_2;

    function b($param1, $param2) { $this->propiedad_1 = $param1; $this->propiedad_2 = $param2; } }

    Y a la vez, tenemos dos vistas:

    Template vista_1.html

    Vista Modelo 1

    El valor de la propiedad es {propiedad}

    Template vista_2.html

    46

  • POO y MVC en PHP Eugenia Bahit

    Vista Modelo 2

    El valor de propiedad_1 es {propiedad_1} mientras que el de propiedad_2 es {propiedad_2}

    Y la lgica de stas, es la siguiente:

    Archivo view.php

    function set_identificadores($vista) { $identificadores = array(); if($vista) { switch ($vista) { case 'vista_1': $identificadores = array('propiedad'); break;

    case 'vista_2': $identificadores = array('propiedad_1', 'propiedad_2'); break; } return $identificadores; } }

    function armar_diccionario($vista, $data) { $diccionario = array(); $identifica