Ejercicios de Programación Orientada a Objetos II

Crea un proyecto sesion08 e introduce en él los diferentes ficheros que vayas creando

Modificar la clase Imagen

Coje el fichero "class.imagen.php" de la sesión de "Programación Orientada a Objetos 1" y lo copias en una nueva carpeta llamada "ejercicio1" dentro del proyecto sesion08.

Agregar métodos mágicos __set y __get

Hay que añadir los métodos mágicos \__get y \__set que sustituyan los métodos de acceso a src, border y ruta_images desde fuera de la clase (copia la carpeta images de la sesión de 'Programación Orientada a Objetos 1' dentro de la sesión actual). Tanto en el \__get como en el __set debe haber un switch que compruebe el valor de $param. Para cada atributo hay que introducir el código que corresponda. En el default del switch mostrar el siguiente mensaje de error: "No existe la propiedad: " . $param terminando la ejecución del script.

Prueba con varios ejemplos:

  • Crea un objeto $img = new Imagen( ) y comprueba que imprime la imagen correctamente con dicho src y borde 0 haciendo un echo del objeto. Mira el código fuente de la página el cual tiene que coincidir con este: <img src='images/php.gif' border='0' />

  • Crea un objeto $img2 = new Imagen( "php.gif", 10) y comprueba que imprime la imagen correctamente con dicho src y borde 10 imprimiendo el objeto.

  • Comprueba que se pueden modificar los atributos src y border desde fuera de la clase del objeto $img2 aunque sean privados. Modifica sus valores e imprime el objeto.

  • Modifica el src del objeto $img2 por un fichero que no existe y comprueba que la imagen no se muestra (por ejemplo, "php.jpg")

  • Ejecuta este código: $img2->prueba = "hola mundo" y comprueba que nos muestra el mensaje de error "No existe la propiedad: prueba". ¿Que pasaría si no estuviera el switch de la función __set?

  • Ejecuta este código: echo $img2->$prueba y comprueba que nos muestra el mensaje de error "No existe la propiedad:".

  • Muestra en formato HTML preformateado (<pre></pre>) lo que devuelve la función var_dump() del objeto $img2.

  • Usa el API de Reflexión para interrogar la clase Imagen y mostrar su estructura en formato HTML preformateado.

  • Insertar el código de la función setSrc dentro del switch que comprueba si el parámetro es src. Actualiza dicho código para que funcione en la nueva clase.

  • Insertar el código de la función setBorder dentro del switch que comprueba si el parámetro es border. Actualiza dicho código para que funcione en la nueva clase.

  • Copiar el código del constructor de la clase y que ya no llame a setSrc y a setBorder sino a __set de cada atributo que nos pasan como parámetro en el constructor.

  • Modificar el valor de src y border desde fuera de la clase con valores correctos y los imprimes con un echo en dos líneas separadas sin pasar por el __toString().

  • Añadir un método público a dicha clase llamado IterarAtributos que imprima con un foreach todos los atributos de la clase Imagen. Ejecuta dicho método para el objeto $img2.

  • Usa el API de Reflexión para interrogar la clase Imagen pero con el método estático de ReflectionClass (busca en la ayuda de PHP) mostrando su estructura en formato HTML preformateado (<pre></pre>).

Ejercicio completo

Dentro de la carpeta que corresponde a este ejercicio, crea otra carpeta llamada **includes**. Dentro de dicha carpeta vamos a crear varias clases en ficheros separados.

La clase **Dimensiones ** (class.dimensiones.php):

  • Con los atributos privados alto, ancho y largo (doubles mayores que 1).
  • Con un constructor que reciba todos los atributos.
  • Con las propiedades alto, ancho y largo implementando sus accesores (getters) y sus mutadores (setteres).
  • Con la operación o método __toString() que compondrá una cadena con las dimensiones de la siguiente forma:
    alto=<valor>,ancho=<valor>,largo=<valor>
    

    El constructor deberá llamar a los setters que comprobarán quelos valores asignados sean de tipo double y mayores que uno. De no cumplirse en alguno de los casos mostraremos un error y terminaremos la ejecución.

La clase **Local**: (class.local.php)

  • Con los atributos privados ciudad y calle (cadenas), número de plantas (entero entre 1 y 10), area y dimensiones (instancia de la clase dimensiones).
  • Constructor que reciba todos los atributos. Antes de dar valor al atributo dimensiones, hay que usar la instrucción que comprueba que el objeto que nos pasan como parámetro es una instancia de la clase Dimensiones.
  • Implementar sólo los accesores (getters) de las propiedades dimensiones y area (ancho x largo)
  • Con la operación o método __toString() que compondrá una cadena con las dimensiones de la siguiente forma: *
    <p>Ciudad: <valor><br></p>
    <p>Calle: <valor><br></p>
    <p>Plantas: <valor><br></p>
    <p>Dimensiones: (<valor>)<br></p>
    
  • Añadir la operación o método __clone(), encargado de realizar una copia por defecto del objeto Dimensiones.
  • Comprobaremos en el constructor que los valores asignados estén dentro del rango y sean del tipo correspondiente. De no cumplirse en alguno de los casos mostraremos un error y terminaremos la ejecución

La clase **LocalComercial** que heredará de **Local**: (class.localcomercial.php)

  • Con los atributos privados razón social (cadena) y número licencia (cadena).
  • Con la operación o método __toString() que compondrá una cadena con las dimensiones de la siguiente forma:
    <p><datos del local></p>
    <p>Razón Social: <valor><br></p>
    <p>Número de Licencia: <valor><br></p>
    
  • Comprobaremos en el constructor que los valores asignados estén dentro del rango y sean del tipo correspondiente. De no cumplirse en alguno de los casos mostraremos un error y terminaremos la ejecución.

La clase **Cine** que heredará de **LocalComercial**: (class.cine.php)

  • Con el atributo privado aforoSala (entero mayor que 0).
  • Con la operación o método __toString() que compondrá una cadena con las dimensiones de la siguiente forma:
    <p><datos del local comercial></p>
    <p>Aforo: <valor><br></p>
    
  • Comprobaremos en el constructor que el valor del aforo sea un entero mayor que cero. De no cumplirse en alguno de los casos mostraremos un error y terminaremos la ejecución.

Crea un fichero llamado cinecito.php y añade al principio del fichero la función que se encarga de incluir la definición de la clase que no ha sido declarada (__autoload)

Dentro de dicho fichero introduce el siguiente código para probar las clases creadas:

<?php
   $cines[0] = new Cine('Alicante', 'Calle 1', 1, new Dimensiones(10., 10., 10.),
      'Razon 1', 'C0001A', 10);
   $cines[1] = new Cine('Alicante', 'Calle 2', 2, new Dimensiones(20., 20., 20.),
      'Razon 2', 'C0002B', 20);
   $cines[2] = new Cine('Alicante', 'Calle 3', 3, new Dimensiones(30., 30., 30.),
      'Razon 3', 'C0001C', 30);
   $copia = clone $cines[1];
   $copia->Dimensiones->alto = 40.;
   $copia->Dimensiones->ancho = 50.;
   $copia->Dimensiones->largo = 60.;
   foreach ($cines as $cine)
      echo $cine.'<br>';
   echo $copia;
   echo '&Aacute;rea: ' . $copia->area . ' m2';
?>

El resultado debe ser el siguiente:

Ciudad: Alicante
Calle: Calle 1
Plantas: 1
Dimensiones: (alto=10, ancho=10, largo=10) Razón Social: Razon 1
Número de Licencia: C0001A Aforo: 10
Ciudad: Alicante
Calle: Calle 2
Plantas: 2
Dimensiones: (alto=20, ancho=20, largo=20) Razón Social: Razon 2
Número de Licencia: C0002B
Aforo: 20
Ciudad: Alicante
Calle: Calle 3
Plantas: 3
Dimensiones: (alto=30, ancho=30, largo=30) Razón Social: Razon 3
Número de Licencia: C0001C
Aforo: 30
Ciudad: Alicante
Calle: Calle 2
Plantas: 2
Dimensiones: (alto=40, ancho=50, largo=60) Razón Social: Razon 2
Número de Licencia: C0002B
Aforo: 20

(OPTATIVO)Clase Validator

Para realizar este ejercicio es necesario realizar el ejercicio "Formulario de registro" de la sesión "Funciones de cadena y expresiones regulares". Crea una clase abstracta llamada "Validator" en un fichero llamado "class.validator.php". Dentro de dicha clase, insertar:

  • Tantos atributos constantes como campos a validar, por ejemplo, patron_email = "...", patron_cp = "..", etc.
  • Un método llamado validar que reciba dos parámetros: $tipo_validacion y $valor. La función tendrá un switch que según el tipo de validación ("nombre", "email", etc..) devolverá un booleano con la comprobación del patrón correspondiente y el valor que nos pasan como parámetro.

Copia los ficheros "registroForm.html" y "registroUsuario.php" de esa sesión y dentro del fichero registroUsuario.php inserta el código necesario para usar el método validar() de la clase Validator. Contesta en un comentario multilínea dentro del fichero registroUsuario.php a estas preguntas. ¿Se puede crear una instancia de la clase Validator? ¿Porqué?

(OPTATIVO) Método __call()

Crea un nuevo fichero "ejercicio_call.php" que contenga el código de ejemplo de la sobrecarga de métodos (definición de la clase **ejemploCall**) y comprueba que funciona correctamente.

Añadir:

  • Función "res" que realice la resta de los parámetros pasados a la función.
  • Función "prod" que realice el producto de los parámetros pasados a la función
  • Función "fact" que compruebe que sólo nos pasan un sólo parámetro, que sea mayor o igual que 0 y que calcule el factorial del mismo.

Prueba con estos ejemplos:

<?php
   echo '$obj->sum(4) = ' . $obj->sum(4) . "<br>"; //4
   echo '$obj->sum(4, 5) = ' . $obj->sum(4, 5) . "<br>"; //9
   echo '$obj->res(5, 4) = ' . $obj->res(5,4) . "<br>"; //1
   echo '$obj->res(5, 7) = ' . $obj->res(5,7) . "<br>"; //-2
   echo '$obj->res(1) = ' . $obj->res(1) . "<br>"; //1
   echo '$obj->prod(5, 4) = ' . $obj->prod(5,4) . "<br>"; //20
   echo '$obj->prod(3) = ' . $obj->prod(3) . "<br>"; //3
   echo '$obj->fact(5) = ' . $obj->fact(5) . "<br>"; //120
   echo '$obj->fact(1) = ' . $obj->fact(1) . "<br>"; //1
?>

Resultado

$obj->sum(4) = 4
$obj->sum(4, 5) = 9
$obj->res(5, 4) = 1
$obj->res(5, 7) = -2
$obj->res(1) = 1
$obj->prod(5, 4) = 20
$obj->prod(3) = 3
$obj->fact(5) = 120
$obj->fact(1) = 1

¿Cómo se podría hacer una llamada explícita al método __call de esta forma: $obj->__call(..) para que sume 4 + 5?

results matching ""

    No results matching ""