PHP Php Es un lenguaje dde programción integrado sdiseñado originalmente para la creación de páginas web dinámicas. Php es unacrónimo recursivo que significa Php Hipertext Pre-processor (inicialmente PHP Tools, o, Personal Home Page Tools). Fue creado originalmente por Rasmus Lerdorf en 1994; sin embargo la implementación principal de PHP es producida ahora por The PHP Group y sirve como el estándar de facto para PHP al no haber una especificación formal. Publicado bajo la PHP License, la Free Software Foundation considera esta licencia como software libre. La baza para implantarse en le mercado es el gran parecido con otros lenguajes como C o Perl que permiten a los progrmadores crear aplicaciones rápidamente con una curva de aprendizaje muy baja. El funcionamiento de php es el siguiente: Cuando el cliente hace una petición al servidor para que le envíe una página web, el servidor ejecuta el intérprete de PHP. Éste procesa el script solicitado que generará el contenido de manera dinámica (por ejemplo obteniendo información de una base de datos). El resultado es enviado por el intérprete al servidor, quien a su vez se lo envía al cliente. Mediante extensiones es también posible la generación de archivos PDF, Flash, así como imágenes en diferentes formatos. Php es una alternativa a Java fácil de aprender. El motor que permite el funcionamiento de php es Zend Engine. Actualmente php se encuentra en su versión php5 y el motor que lo implementa es Zend Engine 2.0. Las ventajas de php son las siguientes: Es un lenguaje multiplataforma. Completamente orientado al desarrollo de aplicaciones web dinámicas con acceso a información almacenada en una Base de Datos. El código fuente escrito en PHP es invisible al navegador y al cliente ya que es el servidor el que se encarga de ejecutar el código y enviar su resultado HTML al navegador. Esto hace que la programación en PHP sea segura y confiable. Capacidad de conexión con la mayoría de los motores de base de datos que se utilizan en la actualidad, destaca su conectividad con MySQL y PostgreSQL. Capacidad de expandir su potencial utilizando la enorme cantidad de módulos (llamados ext's o extensiones). Posee una amplia documentación en su página oficial, entre la cual se destaca que todas las funciones del sistema están explicadas y ejemplificadas en un único archivo de ayuda. Es libre, por lo que se presenta como una alternativa de fácil acceso para todos. Permite aplicar técnicas de programación orientada a objetos. Biblioteca nativa de funciones sumamente amplia e incluida. No requiere definición de tipos de variables aunque sus variables se pueden evaluar también por el tipo que estén manejando en tiempo de ejecución. Tiene manejo de excepciones (desde PHP5). php tiene soporte para la mayoría de los servidores. Una de sus mayores características es el soporte que da a numerosas bases de datos: Adabas D, dBase, Empress, FilePro (read-only) Hyperwave, IBM DB2, Informix, Ingres, InterBase, FrontBase, mSQL, Direct MS-SQL, MySQL, ODBC, Oracle (OCI7 and OCI8), Ovrimos, PostgreSQL, SQLite, Solid, Sybase, Velocis, Unix dbm. Actualmente php tiene tres áreas de acción: Script cliente-servidor: Es el uso principal y tradicional. Hacen falta 3 cosas para hacer una aplicación de este tipo: el PHP parser (En el módulo del servidor), un servidor web y un navegador web capaz de reconocer php. La salida que genera un programa php puede verse en el navegador. Escribir script para linea de comandos: Se puede hacer un script php para que ande sin un servidor o un navegador. Solo hace falta el php parse para ello. Estos scripts son muy ideales para ejecutarlos regularmente en consolas (unix o windows) Escribir aplicaciones de escritorio: Quizás no sea el mejor lenguaje para escribir aplicaciones de escritorio con una interfaz gráfica pero aquellos programadores expertos en php pueden usar algunas de sus características para crear aplicaciones escritorio usando hpgtk. No hemos encontrado documentación alguna sobre los posibles módulos que forman php ni en la documentación oficial ni en la informal sin embargo nos parece interesante dedicar un pequeño espacio al motor Zend Engine “Cerebro y alma de php” (Según sus propios creadores) Zend engine 2.0 es el motor que se encuentra detás de las versiones php 4 y php 5. Este motor provee las características y servicios de los módulos de funciones además de iplementar la sintaxis del lenguaje. Zend Engine comenzó en su versión 1.0 siendo el motor de php 3.0 (una versión mas antigua Zend engine 0.5) era el motor en versiones aún mas anteriores. En un principio Zend Engine 1.0 el diseño del modelado eran onstancias de objetos con valores. Esto significaba que cuando los programadores querían desarrollar aplicaciones tales como asignación de variables y paso de parámetros a funciones los objetos se manipulaban de la misma forma que otros tipos primitivos como String e Integer. Semánticamente eso significa que todo el objeto se tiene que copiar. Un aproximamiento a Java obligaba a comenzar a usar referencias en vez del objeto entero. Sin embargo, este aproximamiento era imposible con la tecnología actual de Zend Engine 1.0 en su implementación del modelado de objetos. Uno de los principales problemas es que esa instanciación y duplicación es muy complicada de controlar. Cambiar ese modelado de objetos hacía necesario una nueva reimplementación de Zend Engine (Su versión 2.0). El modelo propuesto en la nueva versión es mucho mas perecido al modelo de java. En genreal, cuando se crea un objeto el programador obtiene un manipulador que controla el propio objeto y su instancia. Cuando este manipulador se envía en una función solo el manipulador se envía o se copia. Nunca el objeto en sí. El resultado es que todos los manipuladores de un mismo objeto apuntan a ese objeto constituyendo esta una solución consistente y evitando duplicaciones innecesarias. Cambios relacionados con el muevo modelado de objetos: Los parones de diseño basados en objetos como el patrón Factory son cada vez mas y mas populares y para implementar esos patrones hace falta una buena API orientada a objetos que facilite interrelacionar unos objetos con otros. Esta mejora (poder pasar en funciones referencias a objetos) es una clara mejora del nuevo manipulador (handled) Que hace posible pasar un nuevo objeto como parámetro de una funcion sin muchas consideraciones. La funcionalidad que da este nuevo modelo es la posibilidad de devolver objetos en funciones de la misma forma que se devuelven lo tipos primitivos. El objeto devuelto siempre se referirá a un específico objeto que se ha instanciado sin ningún tipo de copia "detras de las camaras". Eliminación de referencias de objetos de apoyo: Muchos desarrolladores PHP se han mostrados interesados ante la posibilidad de poder devolver referencias a un objeto en las funciones. Con el anterior modelo se podía hacer pero pasando por varias variables intermedias mientras que ahora se puede hacer directamente: En Zend Engine 1.0 $tmp =& $object->method(); $tmp =& $tmp->method(); $tmp->method(); En Zend Engine 2.0 $object->method()->method()->method() El nuevo modelo permite llamar varios métodos en cadena pasándoles simplemente una referencia este metodo devuelve un manipulador que a su veza es la entrada de otra función,. En java se permite hacer lo mismo. Clonado de objetos: Sin embargo, aunque se puede clonar objetos, a veces es necesario duplicar un objeto aunque no queremos duplicar todos sus atributos y carácterísticas. Pr ejemplo si tenemos un objeto GTK windows y un objeto que cuelga de él si creamos un duplicado del objeto tu puedes querer crear una nueva ventana con las mismas proppiedades y tener un nuevo objeto colgando de esa nueva ventana. Cuando los desarrolladores preguntan para crear una nueva copia de un objeto Zend Engine checkea si el método __clone() está definido o no. Si no se ha creado usa el método __clone() que implementa por defecto que copiaqrá todas las características del objeto. Si el método está definido este será el responsable de ver que características se clonan y de que forma. Destructores: hoy por hoy no existen mecanismos de destrucción de objetos aunque php tiene soporte para funciones que permiten el cierre de solicitudes. La solución de Zend Engine es la misma que en la mayoría de lenguajes orientados a objetos. Cuando la última referencia a un objeto es destruida se llama al destructor y este borra el objeto de memoria. El usuario, tal y como ocurría con el método __clone() puede definir su propio método __destruct(). Destrucción de objetos aún referenciados: Con el anterior modelo de objetos no era posible destruir un objeto is este aún tenía características asociadas a él. Sin embargo, puede no ser el caso y el programador podría querer eliminar el objeto a pesar de todo por ejemplo si tenemos un objeto y lo ponemos a nulo $obj = null y este objeto tenía colgando una referencia a otro objeto ese objeto sigue instanciado pero quizás sea recomentable eliminarlo a poner a null el objeto del que cuelga eso obligaría a Zend Engine a destruir el objeto a pesar de aún haber referencias a él. Esta característica la implementa el metodo __delete(). Aunque no se sabía si iba a implementarlo al final los desarrolladores decidieron implementar la posibilidad de herencia múltiple en Zend Engine 2.0 con lo cual php puede soportar este tipo de herencia. Lo mismo para la posiblilidad de definir variables privadas, excepciones, sobrecarga y acceso a elementos de un String. GWT Como php es un lenguaje de lado servidor se hace necesario combinarlo con alguna tecnología que proporciona alguna vista si no se quiere usar ajax puro en la aplicación. Una buena opción es usar GWT (Google WebTool Kit) Creado por google en 2006 este framework permite ocultar la complejidad de varios aspectos de la tecnología ajax. Es compatible ocn varios navegadores y bastante sencillo. Básicamente lo que hace es crear código Java usando cualquier IDE (como eclipse) y el compilador lo transforma todo en html y javascript. Con esta biblioteca los desarrolladores pueden desarrollar aplicaciones java con código ajax. Cuando la aplicación se desplieda es cuando se hace la traducción a html y javascript. GWT puede ser ejecutada de dos formas distintas: Modo host y modo web. En el modo host La aplicación se ejecuta como código bytecode de Java dentro de la Máquina Virtual de Java (JVM). Este modo es el más usado para desarrollo, soportando el cambio de código en caliente y el depurado. Modo web (Web mode): La aplicación se ejecuta como código Javascript y HTML puro, compilado a partir del código Java. Este modo se suele usar para el despliegue de la aplicación GWT se compone de 4 módulos en su arquitectura: GWT Java-to-JavaScript Compiler: la función de este componente es traducir el código desarrollado en Java al lenguaje JavaScript. Lo empleamos cuando usamos al GWT en modo web. Hosted Web Browser: este componente ejecuta la aplicación Java sin traducirla a JavaScript, en modo host usando la máquina virtual de Java. JRE Emulation Library: contiene las bibliotecas más importantes de las clases de Java: java.lang en donde se encuentran las clases fundamentales para poder programar en Java y un subconjunto de las clases del paquete java.util. Java.lang incluye, entre otras, la clase java.lang.object que es la clase fundamental de la que heredan o extienden todas las clases en Java. El resto de los paquetes no están soportados por GWT. GWT Web UI Class Library: contiene un conjunto de elementos de interfaz de usuario que permite la creación de objetos tales como textos, cajas de texto, imágenes y botones. Las características de GWT son: Componentes de la interfaz de usuario dinámicos y re-utilizables Crea un Widget para construir otros. Coloca los Widgets automáticamente en Paneles. Envía tus Widget a otros desarrolladores en archivos JAR. RPC realmente fácil Para comunicarte desde el navegador que lanza tu aplicación con tu servidor web, solamente necesitas definir clases de Java serializables para las peticiones y respuestas. En producción, GWT serializa automáticamente las peticiones delnavegador y de-serializa las repuestas desde el servidor web . El mecanismo de RPC de GWT puede incluso manejar jerarquía de polimorfismo en clases, y puedes manejar las posibles excepciones. Administración del historial del navegador Las aplicaciones en AJAX no necesitan utilizar el botón “atrás” (back) del navegador. Y GWT no es la excepción, es decir, no es necesario que llames a otras páginas para realizar las diferentes acciones, ni recargar elnavegador ni nada. Depuración en tiempo real Para cuando tu aplicación esté lista, el código de la misma es traducido a JavaScript, pero mientras lo estás desarrollando este corre sobre una Java virtual machina (JVM). Lo que significa que en la fase de Desarrollo tienes la posibilidad de depurar tu aplicación con los avanzados sistemas de debugging y manipulación de excepciones incluidos en IDEs como Eclipse. Compatibilidad con los navegadores Tus aplicaciones en GWT serán automáticamente soportadas por navegadores como FireFox, Internet Explorer, Mozilla, Safari, y Opera sin ningún tipo de operación para la detección de los mismos, en la mayoría de los casos. Integración con Junit Mediante la integración de JUnit en GWT tu puedes probar tus aplicaciones y depurarlas en un navegador mientras las construyes...incluso, puedes testear llamadas asíncronas a procedimientos remotos RPC. Internacionalización Crea aplicaciones y librerías de Internacionalización rápida y fácilmente. Interoperability and fine-grained control Si las librerías de clases de GWT no son suficientes para lo que necesitas, puedes mezclar JavaScript en el código de tu aplicación usando la interfaz nativa de scripts de Java (JavaScript Native Interface, JSNI). GWT es un proyecto de código abierto Todo el código de GWT está disponible bajo la licencia Apache 2.0. Además como se basa en tecnología java se puede usar cualqueir IDE que desarrolle en java (por ejemplo eclipse) para implementarlo. Los errores mas comunes de javaScript son facilmente detectables mientras se desarrolla la aplicación y no cuando el usuario final lo está ejecutando. Por último, Los diseños en Java basados en la programación orientada a objetos es fácil de comunicar y entender, por ende hace la base de tu código AJAX más comprensible con menos documentación. Como php no es java para integrar las dos tecnologías es necesario un script php llamado json. (Detalle: En el momento de la investigación inicial no lo encontramos pero recientemente encontramos un framework llamado Gwtphp que integra ambas tecnologías, sin embargo dado que finalmente decidimos dejar php para usar java no indagamos mas en este framework) Sin embargo, tuvimos que desistir de usar esa combinación de tecnologías. Primero, como decíamos en el último párrafo php no se integra de forma natural con gwt ya que gwt usa tecnología java y php es otro lenguaje. Para integrarlos hacía falta un “parche” que era el script json. Sin embargo apenas hay documentación sobre gwt (a parte de la oficial) y menos aún integrándolo con php. Al final, tuvimos que desistir y en un intento por continuar con php decidimos usar ajax de la cual había documentación de sobra. Sin embargo, al final php también cayó por su propio peso. La razón fue que no facilitaba la implementación del modelo MVC al contrario que otras tecnologías como Spring o Struts. PHP también salía perdiendo si lo comparábamos con Java. Programar con Java se hace mucho mas cómodo que programar con php ya que toda la api de java (y es mucho decir TODA la api de java) está a disposición del programador si decide usar este lenguaje. Php tiene también una api muy buena pero no se puede comparar con la api de java aunque va mejorando rápidamente. Otro interesante motivo fue el hecho de que si queríamos aprovecharnos de las ventajas de un framework (y pronto quisimos aprovecharnos de estas ventajas pues programar toda la aplicación a pelo se hacía cansado y poco eficiente) lo mas actuales implementan tecnología Java como Struts (1 y 2) y Spring. Usar un framework actual permite implementar en el modelo MVC casi de forma natural además que ahorra lineas de código automatizando muchos procesos que se usan habitualmente. El último motivo fue de comodidad. Estábamos mas familiarizados con el lenguaje JAVA que con php. La curva de aprendizaje de php es muy pequeña pero la de java a estas alturas para nosotras era prácticamente inexistente.