Descargar

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

Enviado por Eugenia Bahit


Partes: 1, 2

  1. Antes de comenzar con el libro
  2. Introducción a la programación orientada a objetos (POO)
  3. Programación orientada a objetos en PHP 5
  4. Introducción al patrón arquitectónico MVC
  5. El patrón MVC en PHP

edu.red

edu.red

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 introducción general a conceptos básicos de la programación como lo son, el paradigma de la programación orientada a objetos y el patrón arquitectónico MVC (modelo, vista, controlador), a la vez de intentar introducir estos conceptos, en la programación específica del lenguaje PHP.

Requisitos previos

Para poder entender este libro, los requisitos previos que debe tener el lector, no son muchos. Recomiendo que se tengan conocimientos básicos del lenguaje PHP así como la facilidad para entender código HTML básico (se utilizará HTML Transitional 4.0 en algunos ejemplos, evitando el uso de XHTML, a fin de que programadores sin experiencia en el diseño y maquetado de sitios Web, puedan comprender más fácilmente los ejemplos utilizados).

¿A quiénes está dirigido este libro?

Este libro está dirigido principalmente, a programadores PHP que quieran salir de la programación estructurada para insertarse en la programación orientada a objetos y, a programadores de otros lenguajes que quieran comenzar a insertarse en la POO en PHP y que cuenten con mínimos 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 difícil explicar un "por qué". Solo puedo decir "cómo" fue que se me ocurrió escribirlo.

Perdí la cuenta de la cantidad de programadores con los que he trabajado. Han sido muchísimos en los últimos 15 años 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 atención, es que:

  • Se usan elementos de la programación 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 arquitectónico", "patrón arquitectónico" y "patrón de diseño", provocando en consecuencia, el desaprovechamiento o mal uso, de patrones arquitectónicos como MVC desencadenando así, en una arquitectura de software deficiente

Las alternativas que me quedaban eran dos:

  • No hacer nada

  • Transmitir a otros programadores, todo lo que había aprendido, para que pudiesen implementarlo si ese fuese su deseo

Por lógica y sin dudarlo ni tener que pensarlo demasiado, elegí la segunda opción. Porque estoy segura que el conocimiento debe ser transmitido y no se debe escatimar en su difusión. 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.com[1]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: tunait[2]gran colaboradora del foro JavaScript de FDW

  • y al madrileño Miguel Ángel Álvarez, fundador y director del portal de programación, DesarrolloWeb.com[3]

Contenido del libro

A fin de lograr cumplir con los objetivos propuestos, este libro ha sido diseñado con una estructura esquemática y seguiendo normas de estilo a fin de diferenciar su contenido.

Estructura del libro

Este libro se encuentra dividido en 4 capítulos donde dos de ellos, introducen a conceptos básicos de la POO y el patrón MVC (en general) y los otros dos, colocan a la POO y al patrón MVC en el contexto del lenguaje PHP.

Entender el contenido diferenciado

Este libro no pretende ser un compendio de conceptos meramente teóricos. A fin de alcanzar un abordaje más preciso y fácilmente entendible, se ha divido el libro en 7 tipificaciones de contenido diferenciadas:

  • marco teórico (contenido propio y citas de terceros)

  • ejemplo práctico (código fuente de ejemplo)

  • metáforas (comparación con ejemplos de la vida real – tomando esta técnica de un principio básico de Extreme Programming)

  • sugerencias de estilo (reglas de estilo sugeridas para la programación en PHP)

  • ejercicios de autoevaluación

  • programación real (ejemplos con códigos fuente reales)

  • preguntas a respuestas frecuentes

Texto general del libro.

  • Marco teórico (cita de terceros)

Las citas presentan el siguiente formato:

"Esto es una cita textual de terceros. La fuente se encuentra al pie de página."

  • Ejemplo práctico (código fuente)

El código fuente se encuentra con una tipografía monoespaciada y con la sintaxis del lenguaje coloreada[4]

class Usuario {

# Propiedades

public $nombre;

# Métodos

public function set_usuario() {

$this->nombre = 'Juan';

}

}

  • Metáforas (comparación con la vida real)

A fin de ejemplificar con facilidad un concepto netamente teórico, se darán ejemplos utilizando hechos de la vida cotideana, que puedan asemejarse al concepto que se esté explicando. Estas metáforas, se presentarán con un diseño como el siguiente:

Esto es una metáfora.

Si no tengo el ícono, soy un ejemplo de la vida real, pero no soy una metáfora.

  • Sugerencias de estilo

A diferencia de otros lenguajes de programación como Python, por ejemplo, PHP no tiene una guía de prácticas recomendadas o sugerencias de estilo. Esto, hace que muchas veces, cada programador le de al código fuente un "toque" característico. Si bien es un rasgo de personalidad tal vez admirable, en la práctica, provoca que sea difícil modificar el código fuente escrito previamente por otro programador.

A fin de proponer una alternativa para solucionar este inconveniente y basándome en el principio de "propiedad colectiva" de Extreme Programming así como en la técnica de establecimiento de pautas de estilo que hagan un código homogéneo, a lo largo del libro iré sugiriendo algunas reglas de estilo según surjan, cuyo finalidad tiende a:

  • hacer los códigos fuente más intuitivos;

  • escribir códigos fuente fácilmente legibles.

Las Sugerencias de Estilo presenta un formato similar al siguiente:

Reglas de estilo sugeridas

Esto es una regla de estilo sugerida en referencia al tema que se está tratando.

  • Ejercicios de autoevaluación

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

  • Programación real

Tras los ejercicios presentados al finalizar los capítulos II y IV, se podrá encontrar código fuente de casos reales. Dichos códigos, pretenden dar al lector, una noción más práctica de los temas que se han tratado, aplicándola a la vida cotideana de un desarrollador. Los encontrarás fácilmente identificando el ícono de PHP como el que se muestra a la izquierda de este párrafo.

edu.red

  • Respuestas a preguntas frecuentes

Aquí encontrarás todas las preguntas sobre los códigos fuente que se encuentren en la sección "programación real". Dicha sección, se encuentra identificada con el icono que se muestra a la derecha de este párrafo.

edu.red

Hecha estas aclaraciones, ahora…

¡A programar!

CAPÍTULO I

Introducción a la programación orientada a objetos (POO)

La POO es un paradigma de programación (o técnica de programación) que utiliza objetos e interacciones en el diseño de un sistema.

Elementos de la POO

La POO está compuesta por una serie de elementos que se detallan a continuación.

Clase

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

Metáfora

Persona es la metáfora de una clase (la abstracción de Juan, Pedro, Ana y María), cuyo comportamiento puede ser caminar, correr, estudiar, leer, etc. Puede estar en estado despierto, dormido, etc. Sus características (propiedades) pueden ser el color de ojos, color de pelo, su estado civil, etc.

class Persona {

# Propiedades

# Métodos

}

Objeto

Es una entidad provista de métodos 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

*/

Método

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

function caminar() {

#…

}

Evento y Mensaje

Un evento es un suceso en el sistema mientras que un mensaje es la comunicación del suceso dirigida al objeto.

Propiedades y atributos

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

$nombre = 'Juan';

$edad = '25 años';

$altura = '1,75 mts';

Características conceptuales de la POO

La POO debe guardar ciertas características que la identifican y diferencian de otros paradigmas de programación. Dichas características se describen a continuación.

Abstracción

Aislación de un elemento de su contexto. Define las características esenciales de un objeto.

Encapsulamiento

Reúne al mismo nivel de abstracción, a todos los elementos que puedan considerarse pertenecientes a una misma entidad.

Modularidad

Característica que permite dividir una aplicación en varias partes más pequeñas (denominadas módulos), independientes unas de otras.

Ocultación (aislamiento)

Los objetos están aislados del exterior, protegiendo a sus propiedades para no ser modificadas por aquellos que no tengan derecho a acceder a las mismas.

Polimorfismo

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

Herencia

Es la relación existente entre dos o más 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 características de los objetos de los cuales heredan.

Recolección de basura

Es la técnica que consiste en destruir aquellos objetos cuando ya no son necesarios, liberándolos de la memoria.

CAPÍTULO II

Programación Orientada a Objetos en PHP 5

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

Clases y Objetos en PHP 5

Definición de Clases

Según el Manual Oficial de PHP, una Clase es:

[…] "una colección 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, continúa diciendo:

[…] "La definición básica 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 métodos pertenecientes a la clase. El nombre de clase puede ser cualquier etiqueta válida que no sea una palabra reservada de PHP. Un nombre válido de clase comienza con una letra o un guión bajo, seguido de la cantidad de letras, números o guiones bajos que sea." […][6]

Veamos un ejemplo de definición de clase:

class NombreDeMiClase {

#…

}

Reglas de Estilo sugeridas

Utilizar CamelCase para el nombre de las clases.

La llave de apertura en la misma línea que el nombre de la clase, permite una mejor legibilidad del código.

Declaración de Clases abstractas

Las clases abstractas son aquellas que no necesitan ser instanciadas pero sin embargo, serán heredadas en algún momento. Se definen anteponiendo la palabra clave abstract a class:

abstract class NombreDeMiClaseAbstracta {

#…

}

Este tipo de clases, será la que contenga métodos abstractos (que veremos más adelante) y generalmente, su finalidad, es la de declarar clases "genéricas" que necesitan ser declaradas pero a las cuales, no se puede otorgar una definición precisa (de eso, se encargarán las clases que la hereden).

Herencia de Clases

Los objetos pueden heredar propiedades y métodos de otros objetos. Para ello, PHP permite la "extensión" (herencia) de clases, cuya característica representa la relación existente entre diferentes objetos. Para definir una clase como extención de una clase "madre" se utiliza la palabra clave extends.

class NombreDeMiClaseMadre {

#…

}

class NombreDeMiClaseHija extends NombreDeMiClaseMadre {

/* esta clase hereda todos los métodos y propiedades de

la clase madre NombreDeMiClaseMadre

*/

}

Declaración de Clases finales En PHP

PHP 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. ¿Cómo saber qué tipo de clase declarar? Todo dependerá, de lo que necesitemos hacer. Este cuadro, puede servirnos como guía básica:

Necesito…

Instanciable

Abstracta

Heredada

Final

Crear una clase que pueda ser instanciada y/o heredada

X

Crear una clase cuyo objeto guarda relación con los métodos 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 clase

Para 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). Lógicamente, la clase debe haber sido declarada antes de ser instanciada, como se muestra a continuación:

# declaro la clase

class Persona {

#…

}

# creo el objeto instanciando la clase

$persona = new Persona();

Reglas de Estilo sugeridas

Utilizar nombres de variables (objetos) descriptivos, siempre en letra minúscula, 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 código.

Propiedades en PHP 5

Las propiedades representan ciertas características 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 características, como por ejemplo, la visibilidad: pueden ser públicas, privadas o protegidas. Como veremos más adelante, la visiblidad de las propiedades, es aplicable también a la visibilidad de los métodos.

Propiedades públicas

Las propiedades públicas se definen anteponiendo la palabra clave public al nombre de la variable. Éstas, pueden ser accedidas desde cualquier parte de la aplicación, sin restricción.

class Persona {

public $nombre;

public $genero;

}

Propiedades privadas

Las 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 protegidas

Las 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 aplicación. Éstas, se definen anteponiendo la palabra clave protected al nombre de la variable:

class Persona {

public $nombre;

public $genero;

private $edad;

protected $pasaporte;

}

Propiedades estáticas

Las propiedades estáticas representan una característica de "variabilidad" de sus datos, de gran importancia en PHP 5. Una propiedad declarada como estática, puede ser accedida sin necesidad de instanciar un objeto. y su valor es estático (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, dependerán del ámbito desde el cual se las invoque así como de su condición y visibilidad.

Acceso a variables desde el ámbito de la clase

Se accede a una propiedad no estática 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 estática, se accede a ella mediante el operador de resolución de ámbito, doble dos-puntos :: anteponiendo la palabra clave self o parent según 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 clase

Se accede a una propiedad no estática con la siguiente sintáxis: $objeto->variable

Nótese además, que este acceso dependerá de la visibilidad de la variable. Por lo tanto, solo variables públicas 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 estática

print $persona_a_positivo->nombre;

Para acceder a una propiedad pública y estática el objeto no necesita ser instanciado, permitiendo así, el acceso a dicha variable mediante la siguiente sintáxis:

Clase::$variable_estática

# accedo a la variable estática

print 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 estáticas, las constantes solo pueden tener una visibilidad pública.

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 sugeridas

Utilizar NOMBRE_DE_CONSTANTE en letra MAYÚSCULA, ayuda a diferenciar rápidamente constantes de variables, haciendo más legible el código.

const MI_CONSTANTE = 'Este es el valor estático de mi constante';

Métodos en PHP 5

Cabe recordar, para quienes vienen de la programación estructurada, que el método de una clase, es un algoritmo igual al de una función. La única diferencia entre método y función, es que llamamos método a las funciones de una clase (en la POO), mientras que llamamos funciones, a los algoritmos de la programación estructurada.

Reglas de Estilo sugeridas

Utilizar nombres_de_funciones_descriptivos, en letra minúscula, separando palabras por guiones bajos, ayuda a comprender mejor el código fuente haciéndolo más intuitivo y legible.

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

# declaro la clase

class Persona {

#propiedades

#métodos

function donar_sangre() {

#…

}

}

Al igual que cualquier otra función en PHP, los métodos recibirán los parámetros necesarios indicando aquellos requeridos, dentro de los paréntisis:

# declaro la clase

class Persona {

#propiedades

#métodos

function donar_sangre($destinatario) {

#…

}

}

Métodos públicos, privados, protegidos y estáticos

Los métodos, al igual que las propiedades, pueden ser públicos, privados, protegidos o estáticos. La forma de declarar su visibilidad tanto como las características de ésta, es exactamente la misma que para las propiedades.

static function a() { }

protected function b() { }

private function c() { }

# etc…

Métodos abstractos

A diferencia de las propiedades, los métodos, pueden ser abstractos como sucede con las clases.

El Manual Oficial de PHP, se refiere a los métodos abstractos, describiéndolos de la siguiente forma:

[…] "Los métodos definidos como abstractos simplemente declaran la estructura del método, pero no pueden definir la implementación. Cuando se hereda 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 child; adicionalmente, estos métodos deben ser definidos con la misma visibilidad (o con una menos restrictiva). Por ejemplo, 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." […][7]

Para entender mejor los métodos abstractos, podríamos decir que a grandes rasgos, los métodos abstractos son aquellos que se declaran inicialmente en una clase abstracta, sin especificar el algoritmo que implementarán, es decir, que solo son declarados pero no contienen un "código" que específique qué harán y cómo lo harán.

Tal vez, te preguntes ¿Cuál es la utilidad de definir métodos 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 gestión informática, para las farmacias de los Hospitales del Gobierno de la Ciudad de Buenos Aires. Un punto fundamental, era pensar en los insumos farmacéuticos como "un todo abstracto". ¿Por qué? Fundamentalmente, porque si bien existen insumos farmacéuticos de todo tipo y especie, cada uno de ellos, comparte características comunes, que por sí solas no pueden definirse con precisión. Por ejemplo, todos los insumos farmacéuticos requieren de un tipo de conservación especial. Algunos requieren refrigeración a determinada temperatura que solo puede ser satisfecha conservándolos en una heladera; otros requieren conservarse en un ambiente seco; otros, no pueden tomar contacto con el exterior, a fin de conservar su capacidad estéril; etc. ¿Podía definirse con exactitud una clase Insumo? La respuesta a esa pregunta, es justamente su pregunta retórica ¿irías a la farmacia a pedirle al farmacéutico "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 presición pero aseguramos allí, todas aquellas características que dichos objetos, guardarán entre sí. Declarar un método conservar_insumo() como abstracto, serviría para luego definir con exactitud, en una clase heredada, el algoritmo exacto que determinado insumo necesitaría para procesar su conservación. Es así entonces, que una clase InsumoRefrigerado heredaría de Insumo, y redefiniría el método conservar_insumo() indicando un algoritmo que solicitara la temperatura a la cual debía conservarse en heladera, etc.

Métodos mágicos en PHP 5

PHP 5, nos trae una gran cantidad de auto-denominados "métodos mágicos". Estos métodos, otorgan una funcionalidad pre-definida por PHP, que pueden aportar valor a nuestras clases y ahorrarnos grandes cantidades de código. Lo que muchos programadores consideramos, ayuda a convertir a PHP en un lenguaje orientado a objetos, cada vez más robusto.

Entre los métodos mágicos, podemos encontrar los siguientes:

  • El Método Mágico __construct()

El método __construct() es aquel que será invocado de manera automática, al instanciar un objeto. Su función es la de ejecutar cualquier inicialización que el objeto necesite antes de ser utilizado.

# declaro la clase

class Producto {

#defino algunas propiedades

public $nombre;

public $precio;

protected $estado;

#defino el método 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 métodos, éstos, podrán hacer referencia al estado del producto, para determinar si ejecutar o no determinada función. Por ejemplo, no podría mostrarse a la venta un producto "en uso por el sistema", ya que a éste, se le podría estar modificando el precio.

  • El método mágico __destruct()

El método __destruct() es el encargado de liberar de la memoria, al objeto cuando ya no es referenciado. Se puede aprovechar este método, para realizar otras tareas que se estimen necesarias al momento de destruir un objeto.

# declaro la clase

class Producto {

#defino algunas propiedades

public $nombre;

public $precio;

protected $estado;

#defino el método 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 métodos mágicos

PHP nos ofrece otros métodos mágicos tales como __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __set_state y __clone.

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

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

Ejercicios Prácticos

Para practicar lo que hemos visto hasta ahora, les propongo hacer algunos ejercicios, a fin de asimilar los conocimientos de los capítulos I y II.

Ejercicio Nº1: Sobre la programación orientada a objetos

1.1) ¿Qué es la Programación Orientada a Objetos?

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.2) ¿Cuál de las siguientes opciones, responde mejor a los elementos que forman parte de la POO?

a) Clases, objetos, métodos, atributos y propiedades

b) Atributos, eventos y funciones

c) Métodos, inmutabilidad, abstracción, funciones y prototipos

e) Variables, constantes y funciones

1.3) ¿Cuál de las siguientes afirmaciones es FALSA con respecto a las características de la POO?

a) La abstracción y el polimorfismo son característica esenciales de la programación orientada a objetos

b) Encapsulamiento es sinónimo de aislamiento

c) En la POO, la modularidad, es la característica que permite dividir una aplicación, en partes más pequeñas, con independencia unas de las otras

Ejercicio Nº2: Sobre la POO en PHP

2.1) Dado el siguiente código:

¿Qué crees que fallaría al intentar ejecutarlo?

a) ItemProducto fallará ya que está heredando de otra clase

b) No fallaría nada

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

2.2) ¿Cuál crees que será la salida del siguiente código?

a) Cliente desconocido 1001

b) Cliente desconocido

c) Se imprimiría Cliente desconocido pero fallaría luego el acceso a $id ya que es una propiedad protegida

2.3) ¿Cuál crees que será la salida del siguiente código?

a) Cliente desconocido

b) Juan Pérez

Explica porqué has elegido esa respuesta:

2.4) Teniendo en cuenta el siguiente código:

¿Cuál de las siguientes opciones, estimas que sería 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;

Soluciones a los ejercicios 1 y 2

Ejercicio Nº1

Pregunta 1.1: respuesta b

Pregunta 1.2: respuesta a

Pregunta 1.3: respuesta b

Ejercicio Nº2

Pregunta 2.1: respuesta c

Pregunta 2.2: respuesta c

Pregunta 2.3: respuesta a

porque a las propiedades estáticas no se les puede modificar su valor

Pregunta 2.4: respuesta b

Programación 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.

Nótese que los métodos respectivos han sido resumidos no encontrándose en éstos, algoritmos de validación de datos. Se ejemplifica todo aquello que es relevante en la POO.

edu.red

Archivos fuente del ABM de Usuarios

Archivo db_abstract_model.php

Archivo usuarios_model.php

Archivo abm_example.php

Explicando el código en el contexto de la POO: La mejor forma de aprender y comprender

edu.red

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 código

  • 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 métodos, como insertar datos, editar datos, eliminar datos o simplemente consultar datos. El algoritmo de cada uno de esos métodos 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 mañana, este requisito puede ampliarse y, debo dejar todo preparado para que el sistema pueda ser escalable y modular (otros módulos pueden ser requeridos en el futuro).

Si solo contemplara los métodos de inserción, edición, consulta y eliminación de usuarios en esta clase, estaría cometiendo dos errores imperdonable:

  • No estaría respetando el principio de modularidad de la POO

  • Los métodos mencionados ¿no son a caso métodos de un nuevo objeto llamado Usuario?

Partes: 1, 2
Página siguiente