Archivado en: ‘php’ .

Métodos mágicos en PHP5

20 Diciembre, 2009

Desarrollar en PHP5 con orientación a objetos cada vez es más parecido a desarrollar con Java, los "javeros" siempre comentan que PHP no hace más que "copiar" y la verdad es que razón no les falta ^_^ pero una de las particularidades que tiene el desarrollar con POO en PHP5 son los métodos mágicos. Los usan cada vez con más frecuencia los frameworks de desarrollo en PHP5 y es por la flexibilidad que ofrecen en los desarrollos.

Quien no ha utilizado en algún momento en PHP5 el new stdClass(), al hacer una instancia de esta clase predefinida en el core de PHP5 estamos creando una clase estándar en donde las propiedades se generan de manera dinámica.

En el ejemplo del que mostraré a continuación se trata de una clase estándar donde encapsularemos el acceso a las propiedades de la clase. Utilizaremos el la encapsulación y el principio de la ocultación en la Programación Orientada a Objetos para el desarrollo de esta clase con métodos mágicos. No exponiendo el acceso a las propiedades en ámbito público.

La clase que vamos a crear no entiende de las posibles propiedades que puede tener el objeto, ni tampoco de los valores que almacenará y menos de acciones sobre propiedades. Simplemente almacenará N valores en diferentes propiedades de manera dinámica, simulando el comportamiento de "stdClass".

PHP:
  1. /**
  2. * Clase estándar con propiedades de ámbito privado, en donde
  3. * para acceder a las propiedades es necesario invocar métodos
  4. * set/get bien para inicializar la propiedad o recuperar.
  5. *
  6. * @author mariotux
  7. * @date 20/12/2009
  8. */
  9. class MyStdClass {
  10.  
  11. private $properties;
  12.  
  13. private function __get($name) {
  14.  
  15. $name = strtolower($name);
  16. if (array_key_exists ( $name, $this->properties)) {
  17. return $this->properties [$name];
  18. }else{
  19. throw new Exception('Unknown property  '. $name);
  20. }
  21. }
  22.  
  23. private function __set($name, $value) {
  24.  
  25. $name = strtolower($name);
  26. if(count($value) == 1){
  27. $this->properties [$name] = $value[0];
  28. }else{
  29. $this->properties [$name] = $value;
  30. }
  31.  
  32. }
  33.  
  34. public function __call($name, $arguments) {
  35.  
  36. $methodType = substr($name, 0, 3);
  37. $nameMethod = substr($name,3);
  38.  
  39. switch ($methodType){
  40. case 'get':{
  41. return $this->$nameMethod;
  42. break;
  43. }
  44. case 'set':{
  45. $this->$nameMethod = $arguments;
  46. break;
  47. }
  48. default:{
  49. throw new Exception('Unknown method  '. $name);
  50. }
  51. }
  52.  
  53. }
  54.  
  55. public function __construct() {
  56. $this->properties = array ();
  57. }
  58. }

Cómo podemos observar en la clase, en cuanto se intenta invocar a un método que no sea get o set generamos una excepción, al igual que también lo hacemos cuando se intenta acceder a una propiedad que no ha sido inicializada al invocar el método get de la propiedad. En el set no realizamos la comprobación ,ya que al estar asignando un valor a una propiedad siempre la trataremos como una propiedad nueva en caso de que no exista.

Este es un ejemplo de como utilizar métodos mágicos, en donde sólo estamos utilizando __construct, __call, __set, __get pero existen más métodos mágicos que podríamos utilizar para extender el comportamiento de la clase.

¿Por qué usar Symfony?

7 Diciembre, 2009

Empezaremos por 10 razones por las que una empresa debería utilziar Symfony Framework en sus desarrollos de PHP, citando:

  1. Escalable: Symfony es infinitamente escalable si se disponen de los recursos necesarios. Yahoo utiliza Symfony para programar aplicaciones con 20 millones de usuarios y 12 idiomas ¿de verdad necesitas más?
  2. Probado: Symfony ha sido probado con éxito durante varios años en aplicaciones muy diferentes. Desde sitios web con millones de usuarios (del.icio.us, Yahoo Bookmarks, Yahoo Answers) hasta otros miles de sitios pequeños y medianos.
  3. Soporte: Symfony sigue una política de tipo LTS (long term support). Las versiones estables se mantienen durante 3 años sin cambios pero con una continua corrección de los errores conocidos. Tus clientes estarán siempre contentos y a ti no te costará nada hacerlo.
  4. Licencia: Symfony utiliza una licencia MIT, con la que puedes hacer aplicaciones web comerciales, gratuitas y/o de software libre.
  5. Compromiso: la empresa que ha creado Symfony no vive del framework, sino de las aplicaciones que hace con él. Esto significa que a ellos les interesa tanto como a tí aspectos como el rendimiento, la buena documentación, el soporte muy largo, etc.
  6. Código: Desde su primera versión Symfony ha sido creado para PHP 5, desechando la versión PHP 4 (que ha sido declarada obsoleta recientemente). Echa un vistazo a su código fuente y verás lo bien que se puede llegar a programar con PHP.
  7. Seguro: Se puede controlar hasta el último acceso a la información e incluye por defecto protección contra ataques XSS y CSRF.
  8. Documentado: se trata del framework PHP mejor documentado: miles de páginas en el wiki oficial, tutoriales de hasta 250 páginas y un libro gratuito de casi 500 páginas. Además, el libro está completamente traducido al español.
  9. Calidad: su código fuente incluye más de 8.000 pruebas unitarias y funcionales. ¿Vas a jugártela utilizando otro framework con pocas pruebas unitarias o que ni siquiera las utilice?
  10. Internacionalización: Se pueden crear aplicaciones en varios idiomas. La internacionalización está integrada en el framework, funciona bien, sigue los estándares (XLIFF), es muy completa y está probada en aplicaciones reales.
¿No has terminado de convencerte? El aplicar una una hoja de estilo para desarrollo, no siempre es sencillo y si tienes un gran equipo es más complicado. Todo programador tiene sus manías, sean buenas o malas, pero todos sabemos identificar el código fuente de un compañero de trabajo tras haber colaborado en algún proyecto.
A la hora de codificar en Symfony inculca las buenas prácticas a la hora de desarrollar, donde no encontrarás deberías encontrarte una consulta a pelo, si no que tiene que pasar siempre por su ORM y en las acciones de los módulos sólo la lógica de los objetos. Si, parece muy sencillo decirlo pero cuando somos pocos y estamos todos de acuerdo no hay problema, pero y cuando no es así...
Es un Framework CRUDL, pensado para el desarrollo ágil y es divertido programar con él ya que no tienes que "preocuparte" por cosas básicas y repetitivas que podemos ir desarrollando en uno y otro y otro proyecto :-), sólo la lógica!
Vale, todavía no... que prefieres Zend porque el framework es el "Oficial". Convencete que lo oficial no siempre es lo mejor, tampoco es que sea malo pero compara:
- La documentación de Zend no es tan extensa como la de Symfony.
- Zend tenía su propio ORM, pero se ha dado por vencido y va a implantar Doctrine.
- El abandono del ORM própio de Zend fue por falta de "potencia de desarrollo", la comunidad de Symfony es más grande, más fuerte.
- Si, en internet todos andamos con el Inglés para arriba y abajo... pero la documentación de Symfony está en varios idiomas, y su comunidad es muy activa.

Todavía no estás convencido? bien, la mejor manera es que analices tus necesidades y te pongas con la documentación de Symfony, el libro está muy bien pero donde más rápido vas a ver su potencia es en su ejemplo práctico Jobeet. Cuéntame tu impresión cuando estés en el 5º capítulo :-D

Sintetizar texto a voz con Festival en Web

4 Diciembre, 2009

En este post doy por hecho que sabemos hacer la instalación del servicio de Festival en nuestro equipo linux, si no es así siempre podéis pasar por Festival, de texto a voz en linux.

Después de unos post "filosóficos" hoy pasamos nuevamente a la parte ténica, en donde con un par de ficheros podremos generar un fichero mp3 sintetizado con Festival mediante un texto de un formulario web.

El ejemplo que expongo a continuación es una página web sencilla que tras rellenar el texto en un textarea lo envía a si misma y retorna la descarga de un fichero mp3 con el texto sintetizado, siempre que tengamos el servicio de festival configurado.

El ejemplo de página web sería:

PHP:
  1. <?php
  2. if($_POST['texto']){
  3.    $filename = md5($_POST['texto']);
  4.    $txtFile=$filename;
  5.    $mp3File=$filename.".mp3";
  6.    $fp = fopen($txtFile, 'w');
  7.    fwrite($fp,$_POST['texto']);
  8.    fclose($fp);
  9.    exec("./lanza.sh $txtFile");
  10.    if(file_exists($mp3File)){
  11.       $fp = fopen($mp3File,'r');
  12.       if (filesize($mp3File)) {
  13.         $mp3 = fread($fp, filesize($mp3File));
  14.       }
  15.       fclose($fp);
  16.    }
  17.    if(isset($mp3)){
  18.       header('Content-Type: audio/x-mp3');
  19.       header('Content-Disposition: attachment; filename="'.$mp3File);
  20.       header('Content-Length: '. filesize($mp3File));
  21.       echo $mp3;
  22.       unlink($mp3File);
  23.       unlink($txtFile);
  24.    }
  25. }else{
  26. ?>
  27. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  28.  
  29. <html>
  30.  <head>
  31.    <title>Demo</title>
  32.  </head>
  33. <body>
  34.  <h1>Demo</h1>
  35.  <form action="" method="post">
  36.    <textarea name="texto" rows="10" cols="50"></textarea>
  37.    <br />
  38.    <input type="submit" name="enviar" value="enviar" />
  39.  </form>
  40. </body>
  41. </html>
  42. <?   
  43. }
  44.  
  45. ?>

Como podemos ver, lanzamos un script para generar el fichero mp3, que es la parte más importante ya que cualquier programador y más si hablamos de alguien experto en PHP puede observar que el código es realmente sencillo. Pero lo más divertido fue crear el script sh para generar el fichero mp3.

C:
  1. #!/bin/sh
  2. TEXT=`cat $1`
  3. PAR1="(Parameter.set 'Wavefiletype 'riff)\n"
  4. PAR2="(let ((utt (Utterance Text \"$TEXT\"))) (begin (utt.synth utt) (utt.save.wave utt \"$1.wav\"))) \n"
  5. echo Inicio festival!
  6. echo $PAR1$PAR2 | festival -b --pipe --language spanish
  7. lame -hf $1.wav $1.mp3
  8. rm $1.wav

Aquí en el script, lo que hacemos es indicarle a Festival que la salida la queremos en un fichero Wav. De todas formas no tenemos todo resuelto! tenemos que generar el mp3, y con lame lo hacemos de una manera sencilla :-)

Espero que os pueda ser de utilidad esta mini-receta, cualquier duda siempre podéis plasmarla en un comentario.

Desarrollo web orientado a servicios

2 Diciembre, 2009

Aunque no me considero de los "viejos" en Internet está claro que todo el que está envuelto en el desarrollo de aplicaciones web y/o usuario de los "últimos" servicios disponibles se estará dando cuenta.

Facebook, en su día fue una novedad y es cierto que ahora tiene muchos usuarios registrados y en donde puedes encontrar a mucha gente al igual que mantenerte en contacto. Pero entrar en Facebook es una locura, que si fulanito es tal pelicula... No obstante el post no va orientado hacia la funcionalidad de Facebok.

Tengo claro que el "futuro" de los desarrollos de aplicaciones web y/o servicios sociales tienen que tener una orientación a servicios web. El ejemplo claro lo podemos encontrar en Twitter. Una aplicación Web que tras publicar un API para desarrollar, la comunidad de desarrolladores y/o empresas de software le han sacado partido lanzando un sinfin de aplicaciones y widgets para el uso del servicio. No solo hace más cómodo en parte el utilizar este servicio, si no que deja a la mano del usuario final como quiere utilizarlo.

Estoy seguro que si para utilizar Twitter sólo se pudiera mediante su web, el éxito no sería tan rotundo!

No sólo de aplicaciones web sociales vive el hombre! también de productos, ya no tanto los desarrollos a medida que hasta hace un par de años era lo que se imponía en el desarrollo de aplicaciones o páginas web a nivel corporativo. Ahora se busca la estandarización y la creación de un producto que agilice la tarea. Aquí es donde viene el tema!

Si un producto web lo orientamos a servicios, teniendo "mini" productos Web descentralizamos el servicio y su mantenimiento. Todo esto no solo condiciona el desarrollo si no también la infraestructura que lo soporte.

Está muy al día el conceptualizar a la Web 3.0 como la Web Semantica, pero creo que antes de llegar hasta la Web Semantica tenemos que tener "un Internet" más usuable, más accesible sin depender de dispositivos/ordenadores en particular. Una revolución en la comunicación tiene que venir dada por la estrategia de los proyectos que verán la luz en Internet.

Symfony 1.4 estable

2 Diciembre, 2009

Ya tenemos disponible la versión estable de Symfony 1.4, como es de esperar también acompañada de una amplia documentación en varios idiomas en el lanzamiento de la versión estable. En la web de Symfony de habla hispana nos da información al respecto. Y cito de: http://www.symfony.es/2009/12/01/mas-con-symfony-el-libro-definitivo/

La gran novedad es que este libro es el primero que se ha escrito específicamente para los usuarios avanzados de Symfony, por lo que en este libro no te encontrarás la enésima explicación de cómo instalar Symfony o de cómo funciona la arquitectura MVC.

$GLOBALS vs Static method en PHP 5.2.1

11 Noviembre, 2009

Hoy en el trabajo ha surgido la conversación de si es más efectivo el utilizar clases con métodos estáticos para tener una colección de objetos o variables $GLOBAL. No he utilizado en ninguno de mis desarrollos variables globales por lo que en el trayecto a casa vine dándole vueltas a como poder realizar la prueba de rendimiento entre variables globales y método estático.

Lo que se me ocurrió fue crear dos clases idénticas, a diferencia de que una tiene método estático y la otra no. La no estática la instanciaré en una variable global y entonces comprobaré el uso de memoria.

Ambas clases con una propiedad que almacena el string y con sus métodos de GET y SET. Utilizando el string " Hola Mundo! "

Resultado:

Static

54.1 Kb
Hola Mundo!
Memoria usada: 54.5 KB de 256 KB
Memoria consumida:0.4 KB
0.000107 sec

Globals

54.1 Kb
Hola Mundo!
Memoria usada: 54.8 KB de 256 KB
Memoria consumida:0.7 KB
0.000126 sec

La conclusión es clara, Globals consume 0.3Kb más que un método estático y es algo más lento. Esta prueba se ha realizado con un simple string pero si la hiciéramos en una aplicación los datos de memoria y de tiempo tendrían una diferencia más notable.

Un buen framework PHP

2 Septiembre, 2009

Desde que tomé la decisión de utilizar symfony me sorprendo cada día que voy avanzando. Te encuentras todo aquello que querías tener hecho pero nunca tuviste tiempo de hacer.

Si todavía estás dándole vueltas a que framework php utilizar deja de buscar, symfony es el framework perfecto! Por que hago esta afirmación tan rotunda... pues porque en el aprendizaje de symfony recalcan las buenas prácticas, el uso de pruebas unitarias y funcionales y la refactorización de código. Tal vez estés pensando en utilizar Zend Framework porque tiene unos componentes que son realmente interesantes, no te preocupes! con symfony puedes hacerlo!

La filosofía de los creadores del framework es de "no reinventar la rueda" y si algo está bien hecho y funciona lo utilizan. Antes de embarcarse en el desarrollo de algo nuevo comprueban si existe. De hecho, el core de symfony está compuesto por otros proyectos open source como Creole, Prado, Spyc y Pake.

Tienes todavía dudas de si debes usarlo o no, el libro y la documentación es extensa (es una buena señal), entonces ponte a realizar la práctica de Jobeet! verás lo que se puede hacer y como! la potencia de symfony es importante!

Yahoo news y del.icio.us son proyectos construidos con symfony por lo que se puede garantizar el desarrollo de aplicaciones con carga extrema.