Mostrando las entradas con la etiqueta PHP5. Mostrar todas las entradas
Mostrando las entradas con la etiqueta PHP5. Mostrar todas las entradas

Disponible nueva versión para testear: PHP 5.5.0 Alpha1

Anuncia el equipo de desarrollo de PHP que se encuentra disponible para testear la versión 5.5.0alpha1 y con esto, marcan el inicio del ciclo de desarrollo de la rama 5.5.0. Avisan que tengan cuidado ya que es una versión de pruebas, no es para usar en producción, e invitan a reportar los bugs que encuentren.

Las nuevas características (lista no completa) son:
  • support for Generators,
  • a new password hashing API,
  • support for finally in try/catch blocks
  • support for list() in foreach,
  • constant array/string dereferencing,
  • ext/intl improvement.
Me parece muy interesante que ya hayan agregado la opción "finally" en los try/catch (tarde, pero llegó). Para quienes hayan trabajando en Java, sabrán que todo lo que está en try, si falla, pasa a la lista de catch (como si fueran reglas de un firewall), y sí o sí, cierra con la ejecución del código que hay en finally (ej, ya que tu sistema cayó por algo, te aseguras de hacer un cierre limpio, sin importar el tipo de error).

Indispensable. ;-)

Fuente: 
PHP 5.5.0 Alpha1

Encuesta: ¿Qué versión de PHP estás usando actualmente?

Creo que a todos nos despierta muchas dudas e inseguridades tal fragmentación de versiones de PHP... que lo más interesante es que ya pasamos por una campaña mundial para motivar que todos migráramos a PHP5 y dejáramos atrás PHP4 (2007) y el resultado de esta campaña ya quedó obsoleto.


Versiones disponibles
Actualmente todas las versiones que nos podemos encontrar en el mercado: 
  • PHP 5.4.*
  • PHP 5.3.*
  • PHP 5.2.*
  • PHP 5.1.*
  • PHP 5.0.*
  • PHP 4.*
(veo la lista y es para asustarse)

Ahora bien, si prestamos atención, recientemente salió PHP5.4, que estimo será una versión difundida y ampliamente utilizada (según dicta la experiencia) dentro de 2 años. La versión 5.3, si bien ya tiene un poco más de 2 años (mediados 2009), está empezando a aparecer en los servidores de hosting y en las instalaciones más estables de GNU/Linux, pero está aún lejos de ser común ver esta versión, creo que en la actualidad lo más probable es encontrarnos con PHP 5.2.


¿Debemos hacer otra campaña de migración?

Por lo pronto creo que, o mejoramos la forma de actualizar PHP para que sea mucho más fácil y transparente, y no dependa de un empaquetado o una instalación / migración (sea una simple actualización que se pueda hacer "en el aire / on the fly"), vamos a tener que hacer OTRA campaña de "migración" (que como toda migración, esto significa sacrificio, costos, problemas, no hay migraciones indoloras, o no se llamarían migraciones), a por lo menos PHP 5.3 (principalmente por hacer el quiebre con los namespaces).

Encuesta

Así que hacemos una encuesta pública en el margen derecho del blog con la pregunta , ¿qué versión de PHP estás usando actualmente? ... usando realmente, no que quieras usar a futuro... y es algo que también nos determina y clasifica en nuestros conocimientos, ya que si no usamos PHP 5.3 en adelante, quiere decir que aún no empezaste a trabajar con namespaces (y se entiende, no todo el mundo puede tener su servidor propio, no siempre uno puede actualizar el servidor de producción, muchas veces se depende de un hosting externo y no siempre tendremos la última versión disponible).

Visto en perspectiva, es complicado actualizarse y aprovechar lo último que nos ofrece PHP, ya que la pregunta es inmediata... a cual versión? (no tiene sentido decir la última si no sabes cuando tendrás acceso a la misma para probar todas sus características)


Qué uso?

Me estoy moviendo en dos versiones, PHP 5.2.* y PHP 5.3.* y haciendo pruebas con PHP 5.4. Particularmente, por un tema de "sistemas legados" y complejidad de actualización de servidores en producción, mayormente los sistemas están sin namespaces (5.2) y los sistemas nuevos se están desarrollando con namespaces (5.3).


Veremos cómo resulta la encuesta, a ver si está dentro de los parámetros que espero: creo que un buen grupo estará en PHP 5.2, muy tibio 5.3, pero la mayoría de 5.1 para abajo... espero equivocarme ;-)

Saludos! ;-)

[SURFORCE] Nuevo Curso: Actualización POO para nueva versión PHP 5.3 !!!

Estimados todos, estamos organizándonos para iniciar el nuevo período de cursos para el lunes próximo, como siempre, todos cursos relacionados con PHP en particular y POO en general.

Como novedad, iniciamos un curso nuevo, dirigido a todos los alumnos que ya han cursado POO para PHP5 o leído el libro de POO, nos actualizaremos a todas las mejoras de PHP 5.3, particularmente, con el nuevo uso de namespaces, que cambia sustancialmente el trabajo con objetos.

Toda la información en surforce.com

Saludos!

Pasar objetos por sesión

Como no es la primera vez que me lo han preguntado, y tampoco es la primera vez que veo esta duda en un foro, les agrego un ejemplo sobre el tema. ;-)

En sí, la única "complejidad técnica", más que nada asociada a la falta de experiencia en cómo trabaja PHP, es que debemos siempre requerir los fuentes de la clase del objeto en cuestión, y particularidad mediante, antes de iniciar la sesión.







No hace falta serializar los objetos, las sentencias de sesión ya se encargan de todo el trabajo, ante dudas de cómo trabaja, siempre el manual oficial.

Saludos!

Ejecución de scripts en modalidad "batch" y validar sintaxis

Muchas veces necesitamos correr procesos "batch" que se ejecutarán a determinada hora desde un cron (unix/linux) y no tienen ningún tipo de interacción con el usuario, a lo sumo, generarán un reporte de resultados del proceso en un log. Este tipo de procesos pueden ser tan variados como respaldos, transferencias de datos entre sistemas, envío masivo de mails a la base de usuarios, etc.

Por ejemplo:


30 13 * * *  enrique php /var/www/batch/sincronizarBases.php &>/dev/null

Aquí se ve la ejecución para el usuario enrique, el cual llegada las 13:30 hs ejecutará el comando php /var/www/batch/sincronizarBases.php y toda la salida de mensajes internamente será redireccionada a un archivo de log.

También se puede evitar tener que llamar desde consola el comando php y decirle internamente que el ejecutable es el binario de php, además de tener que darle permisos de ejecución al archivo en cuestión (chmod +x ), por lo que la invocación quedaría así (sin la invocación de php):

 30 13 * * *  enrique /var/www/batch/sincronizarBases.php &>/dev/null

y la primera línea de nuestro scripts debería ser:

#!/usr/bin/php -q

// código fuente


Bien podríamos usar otro tipo de lenguaje o simple scripting bash, pero tener todo un sistema desarrollado en PHP permite luego reusar componentes o clases dentro de estos scripts "batch", así que bien podemos seguir usando nuestro lenguaje base de desarrollo.

Como último detalle que quería comentarles, es que amén que siempre hay que probar todo en consola antes de agregarlo al crontab, sucede que si bien sabemos que funciona todo correctamente, a veces tenemos que hacer modificaciones al scripts y que probablemente luego no nos tomamos el trabajo de volver a revisar nuevamente. Para estas situaciones les dejo un pequeño "tips" que puede ser de ayuda con errores básicos que nos pueden suceder sin darnos cuenta:

Luego de editar nuestro fuente, podemos verificar la sintaxis básica del código, evitando por lo menos no cometer un error en algun ";" o similar (obviamente, esto no asegura que no hayamos cometido un error de lógica):

php -l sincronizarBases.php


No syntax errors detected in sincronizarBases.php

En caso contrario

Parse error: syntax error, unexpected T_INCLUDE in sincronizarBases.php on line 33
Errors parsing sincronizarBases.php 



Espero que les sea de utilidad ;-)

¿tienen alguna sugerencia más o experiencias en estos temas que quieran compartir?

PHP Namespace Support in NetBeans IDE 6.8

Interesante cómo va creciendo poco a poco las funcionalidades de Netbeans para PHP y cómo ya se asoma el soporte de PHP 5.3, como así también soporte para diversos frameworks PHP. Para tener en cuenta ;-)

Video de la charla: "Introducción a POO / UML / PHP5"

Lo prometido es deuda ;-). Ya se encuentran disponibles los videos de todas las charlas que hicimos a través del Grupo PHP Argentina el Sábado 6/Marzo en el Hotel Las Naciones, Corrientes 818 1º, Capital Federal.

No más palabras, aquí la charla (sí, casi no se me veía, luego se corrigió en las demás charlas ;-))

Presentación


Quiero aclarar algunos detalles sobre el contexto de la charla, ya que recibí algunas críticas (que las acepto):
  • Estaba saliendo de una gripe, por lo que me era difícil hablar mucho tiempo sin parar de toser, pero bien pude hacerlo, aunque al final de la charla me vino un ataque de tos por espacio de 5 minutos ;-)
  • Razón por lo que la charla fue rápida y casi sin pausa (que generalmente es todo lo contrario, me gusta interactuar y que me interrumpan), ya que no sabía si iba a tener que suspenderla (cosa que no sucedió).
  • Trato de ser "duro" para generar polémica y que posteriormente se hable de estos temas fuera de la charla misma, algo que creo sucedió ya que recibí muchos comentarios sobre el tema ;-)
  • Estoy hablando particularmente de PHP 5.2, esta charla cambiaría si estábamos hablando de 5.3
  • No quiero decir que los autoloads no sirvan para nada, simplemente que prefiero que los desarrolladores se acostumbren a medir las consecuencias de relacionar las clases, y que si hacemos todo "automático", muchas veces ayudados con los autoloads, nuestro sistema saldrá muy perjudicado. Las relaciones se planifican antes y durante el desarrollo del sistema, no es "porque la tengo disponible, la uso"... así no se hacen sistemas POO.
  • De todas formas, prefiero dar charlas concretas, directas y breves, y que el auditorio quede con ganas de más a que se aburran o saturen. Además, éramos varios oradores y no sabíamos si nos daba el tiempo para todos (varias razones para suspender mi segunda charla).

Espero todos sus comentarios, dudas o críticas ;-)

Breve resumen de la segunda reunión del Grupo de Usuarios PHP Argentina


Voy a tener que optar por "publicar algo breve" a "no publicar", ya que de lo contrario voy a escribir un post por mes, y nunca fue mi idea :-(. Creo que la mayoría sabrá que cuando inician los cursos que estamos dictando a través de surforce.com empiezo a estar un poco desbordado de trabajo y concentrarme casi exclusivamente a los alumnos.


Así que bueno, quería hacer un resumen más completo de la reunión que hicimos el sábado pasado, pero aquí van los titulares:
  • Nos reunimos varios desarrolladores PHP con las mismas inquietudes para tratar de "hacer algo por la comunidad PHP", particularmente promover nuestra tecnología y consolidar una organización que nos nuclee.
  • Algo que nos preocupa a todos es que muchos desarrolladores / empresas consideran a PHP como una "tecnología poco seria", por lo que queremos trabajar en ese sentido para cambiar radicalmente esa percepción a través de charlas.
  • Ya lo veníamos hablando en la primer reunión, empezar con charlas informativas, y para ello debíamos buscar un lugar para hacerlas. Tenemos algunas ideas, oficinas ofrecidas de algunas empresas, hasta universidades (aún no tenemos una confirmada).
  • Fijamos la fecha de mejor conveniencia para todos, el sábado 6 / Marzo.
  • Estamos tratando de pulir la idea general, si es una serie de charlas informales, o tendrá más perfil de jornada ó conferencia (por ahora se puede decir que va primando la primera).
El temario general de charlas introductorias se pasará en limpio y publicará en el sitio oficial, por ahora los títulos que más les interesen se pueden votar, para ver si dejamos alguna afuera, o cómo priorizamos el orden de las mismas. La idea es que dentro de unos días todos los que quieran ir a las charlas confirmen su lugar para que nos podamos organizar con tiempo en base al público que participará.




Se está discutiendo el tema de armar podcasts o videocast o streaming, aún no está definido si contamos con la infraestructura y organización suficiente como para hacerlo.


Para más información, tienen el sitio web "oficial" del grupo en grupophp.com.ar (en la página pueden extraer información sobre otros medios, como foro de discusión, twitter, facebook, etc).


¡Así que esperamos su participación!

PD: todas las demás fotos se encuentran en el grupo de facebook.

Segunda "PHP Meeting Argentina" - Sábado 30/1 - 10hs

Para quienes estén por Buenos Aires y quieran unirse a nosotros y organizar la comunidad PHP local, nos estaremos juntando este próximo sábado en la segunda "PHP Meeting" (aquí la primera).

Fecha: Sábado 30 de Enero
Hora: 10:00 (AM) hasta el mediodía.
Lugar: Tronador 2650 3 B (en las oficinas que nos ofrece un colega)


Ver mapa más grande

Aquí les muestro un posible camino desde Cabildo y Juramento (una zona conocida, pueden llegar en subte línea "D", bajar en la estación "Juramento" y posteriormente tomar un taxi). Pueden consultar también http://mapa2.buenosaires.gov.ar/ que está muy completo y en la sección de "cómo llegar" muestra todos los colectivos posibles y sus recorridos (Google, aún te falta ;-))

Nos concentramos en 2 horas concretas para tratar todos los temas de la comunidad y finalmente hacer algunas charlas semi-informales de los temas que cada uno quiera presentar.

Están todos invitados ;-)

¡Iniciamos inscripciones para los cursos Febrero 2010!

Damos oficialmente el anuncio de apertura de inscripciones para los cursos y talleres que iniciarán el 1ro de Febrero de 2010!

'Cursos Abiertos' <> 'Cursos Intensivos'

Les comento que los 'cursos abiertos' se van armando de forma libre a medida que los alumnos se van registrando. Si sobre la fecha de inicio del curso no se llegó al cupo mínimo de 10 alumnos, se postergará una semana el inicio del curso. En caso de superar el máximo de 20 alumnos, se abrirá un único segundo grupo a la semana siguiente. El próximo período de cursos se abrirán recién a partir de Marzo 2010 (fecha a confirmar).

Todos los cursos tienen una duración promedio de 2 meses, pero existe la posibilidad de armar grupos INTENSIVOS y REDUCIDOS de 1 mes de duración (a un costo mayor).

¡Promoción!

Es de público conocimiento que hace 3 años que los precios de los cursos se han mantenido invariables, por lo que este año aumentarán los 'cursos abiertos' de USD 50 a USD 60. Pero, a modo de promoción, quienes se inscriban durante esta semana (plazo hasta el domingo 24/1), lo podrán hacer a precio congelado! (luego no se aceptarán reclamos ;-)).

¡No pierdas tú lugar! Accede a usuarios.surforce.com e ingresa a la sección COMPRAR.

Toda la información sobre los cursos en surforce.com

Saludos! ;-)

Enrique Place

SURFORCE TEAM
www.surforce.com

¿Conoces la clase "DateTime"?

Es muy dificil conocer todas las funcionalidades que nos puede ofrecer un lenguaje, ya que leer el manual con el listado de funciones de arriba a abajo es tan divertido como leer la guía telefónica. Generalmente cuando tenemos un problema para resolver vamos a buscar en la sección correspondiente, según el tema, y listo (arrays, matemáticas, strings, etc). Lo importante muchas veces es, no solo saber de memoria, sino, saber donde buscar (o como dice el viejo dicho, "lo más importante es tener el teléfono de quién sabe", aunque esto lo único que hace es que evitemos aprender a valernos por nosotros mismos ;-)).

Siempre creí que la evolución natural de PHP debería ser juntar todas las funciones "sueltas" del lenguaje en formato "estructurado" y agruparlas en clases "base" como tiene cualquier lenguaje 100% Orientado a Objetos (tienen clases como String, Integer, etc, y si usamos un IDE veremos fácilmente toda la lista de métodos disponibles que se aplican a ese contexto concreto).

Nota al margen: hace unos años hicimos un experimento educativo y varios de mis alumnos de mi primer taller piloto a distancia hicieron un pequeño proyecto final que consistía desarrollar clases de tipo "wrapper" que cumplieran este objetivo (siguiendo el API de Java).

Espero que algún día PHP6 o 7 incorpore por defecto este tipo de organización que nos beneficiará a todos los desarrolladores.

De paso les comento que a veces, en raras ocasiones, podemos descubrir en el manual clases que vienen por defecto en PHP, por ejemplo, DateTime:

date_default_timezone_set('America/Argentina/Buenos_Aires');

$date = new DateTime("2009-02-28");
$date->modify("+1 day");
echo $date->format("Y-m-d");

$date = new DateTime("2009-01-01");
$date->modify("-1 day");
echo $date->format("Y-m-d");

// Salida:
//
// 2009-03-01
// 2008-12-31

Y Netbeans detecta todos sus elementos en la ayuda contextual:


Más información (obviamente): Manual Oficial de PHP

PD: y nunca te olvides de conocer las Standard PHP Library (SPL)

Excepciones: Cómo forzar un "backtrace" en un sistema que no usa try/catch

Para los que venimos de haber trabajado, aunque sea académicamente, en otros lenguajes/plataformas como Java o .Net, trabajar con excepciones es un tema de todos los días. Al principio, cuando uno está aprendiendo y surge el primer volcado de una excepción (aparecen en pantalla muchas líneas con la información del error) hay una que resalta sobre todas y es la que demoramos más aprender a interpretar: el "backtrace" o ruta de ejecución desde que se inicia el sistema, todas las invocaciones que van sucediendo, en qué línea salta la ejecución, hasta terminar en el lugar exacto donde falló el sistema.

Recuerdo cuando probé por primera vez PHP5 (una beta) y lo primero que fui a probar fue hacer un try / catch forzando el fallo de una conexión a la base de datos con funciones nativas del lenguaje. Mi sorpresa fue mayúscula al comprender que los try / catch no funcionan a menos que nos aseguremos que la función que estamos usando retorne una excepción, y para colmo, PHP no lo hace por defecto! ;-) Así que no quedó otra que dejar las excepciones para nuestros desarrollos donde todo método de nuestras clases debía tener un throw new Exception('mensaje de error');

A pesar de mi desilusión, esto no era problema para los sistemas que hacíamos de cero de ahora en más, pero... ¿cómo haríamos con los sistemas que ya están funcionando y que no puedes salir a modificar miles de líneas de código para que un try / catch funcione?

Particularmente considero que una de las informaciones más importantes para poder hacer un debug de qué falló es el "backtrace". No es lo mismo ver en el log del sistema donde falló algo que ver quién invocó antes y con qué información para que fallara esa rutina.

Bien, hace un tiempo que lo buscaba y lo encontré por accidente en un foro, así que les comento la forma de uso y cómo lo pueden aplicar a sus sistemas "legacy":


class Debug
{
public static function getBacktrace()
{
$ex = new Exception();
return $ex->getTrace();
}
public static function getBacktrace2String()
{
$ex = new Exception();
$trace = $ex->getTrace();

/* Elimino la primer linea que
siempre es la misma y
hace referencia a la
invocación de esta clase */

array_shift($trace);

$trace_ret = '';
$linea = 0 ;
foreach ($trace as $item){

$linea++;

$trace_ret .=
"(".$linea.")"
."[file: ".$item['file']
.":".$item['line']."]"
."[".$item['class']
.$item['type']
.$item['function']."]"
."[args: "
.implode(',',$item['args'])
."] ";
}
return $trace_ret;
}
}


Luego, a continuación, tenemos una clase Log que lo único que hace es persistir cualquier información del sistema que queramos en un archivo de log, por lo tanto ahora agregamos la ejecución del backtrace y lo registramos en el log tal cual nos llega:


/* Método modificado de la clase Log */

public static function setError()
{
$backtrace = Debug::getBacktrace2String();
self::logToFile('errores.log',$backtrace);
}


Listo, ahora automáticamente tenemos que cada vez que el sistema deba registrar un error, este, tendrá toda la información de backtrace, que se vería en nuestro sistema de la siguiente manera:

2009-10-26 09:40:11 (1)[file: /var/www/class/App.php:81][Log::errores][args: /var/www/class/Prueba.php,75,ERROR GRAVE: no se obtuvo el resultado esperado en el metodo: getProveedor,,0,SELECT * FROM proveedores WHERE estado = 1 AND id = 111 AND idCuenta = 1234] (2)[file: /var/www/public/sys/send.php:48][Prueba->getProveedor][args: 111,1234]

Lo cual si indentamos en base a los (n) que son los saltos que va dando la ejecución,

2009-10-26 09:40:11

(1)[file: /var/www/class/App.php:81][Log::errores][args: /var/www/class/Prueba.php,75,ERROR GRAVE: no se obtuvo el resultado esperado en el metodo: getProveedor,,0,SELECT * FROM proveedores WHERE estado = 1 AND id = "111" AND idCuenta = 1234]

(2)[file: /var/www/public/sys/send.php:48][Prueba->getProveedor][args: 111,1234]

Aquí se pueden ver dos saltos, el (1) es lo que veríamos siempre en nuestro log, la aplicación que propiamente falla, pero en el (2) estamos viendo desde donde realmente se inicio la ejecución que luego terminó fallando.

De todas formas, esto es un "parche", deberíamos usar try/catch en todos nuestros sistemas de ahora en más (si es que ya no lo estás usando), pero una forma de mejorar lo que ya existe es agregar un forzado "backtrace".

Espero que lo prueben en sus sistemas y les sea de utilidad ;-)

Cursos SURFORCE: ¡falta una semana para iniciar!

Para todos los que están interesados en participar de los cursos de educación a distancia, les comento que queda solo una semana para empezar, la cual fijamos como primer lunes de julio (6/7).

El cupo máximo para un grupo son de 20 alumnos, posteriormente se abre un siguiente grupo que iniciaría una semana después (13/7).

El estado actual de los lugares confirmados:
  • Introducción a los Patrones de Diseño para PHP5 = 7
  • Análisis y Diseño Orientado a Objetos para PHP5 = 9
  • Introducción a Zend Framework = 10
  • POO PHP5 2009 + Libro = 19
Recordatorio, aún quedan registraciones sin confirmar el pago, pero, quién se registre ahora y pague inmediatamente obtiene el lugar disponible.

Se recibirán los pagos hasta el viernes inclusive, no se recibirán pagos durante el último fin de semana, ya que lo usaré para preparar los sistemas para iniciar los cursos.

Por lo tanto ¡última semana! ;-)

Nueva versión del libro: "POO para PHP5" (edición "abril 2009")




Ya se encuentra disponible la nueva versión del libro (v1.8) que incluye todas las correcciones y sugerencias de los lectores desde febrero 2009 y un nuevo anexo "Lo Nuevo en PHP5" donde se empieza a abordar cada una de las nuevas características de PHP5, comentadas y con ejemplos prácticos para aprender a sacarle el máximo de provecho (pueden acceder a nuevos capítulos de ejemplo del libro).

Recordar las tres versiones del libro:
  1. Edición económica: 30 USD (2 meses de actualizaciones, material extra y consultas sobre dudas)
  2. Edición estándar: 50 USD (4 meses)
  3. Edición extendida: 60 USD (6 meses)
El medio de pago oficial es a través de Paypal y el medio alternativo es a través de Western Union. Una vez confirmado el pago (dentro de las primeras 24hs) se hace envío del libro digital (pdf) y se da acceso a usuarios.surforce.com para poder usar todos los servicios asociados.

A la fecha se llevan vendidos 75 libros
, entre alumnos y no alumnos de los Cursos de POO.

Recuerda: para el segundo semestre del año se volverán a abrir los cursos de POO, los cuales están basados en el libro pero abordando nuevos trabajos semanales para profundizar los conceptos tratados.


Más información

Polémica / discusión: ¿Debemos usar "null == $var" ó "$var == null"?

Algunos de mis lectores y colegas se quejan que gracias a los cursos el blog quedó un poco vacío de contenidos, así que voy a compartir una discusión interesante que se dió en el foro de uno de los grupos del curso "Introducción a Zend Framework" ;-)

Se presentó un ejemplo donde se usaba un if con "null === $var", en vez del tradicional "$var === null" (el orden invertido).

Aquí mi explicación:

Imagen de Enrique Place
Re: Pagina 13 Correccion
de Enrique Place - viernes, 27 de marzo de 2009, 19:57


Mmmm ... en lo personal no soy partidario de usar null === dato, prefiero el estándar dato === null, ya que es más claro y natural su lectura:

Leyendo de izquierda a derecha, "si el dato es exactamente igual a null" en oposición a "si null es exactamente igual al dato" guiño

Aunque conozco la seudo-ventaja de evitar un accidente de asignación, no creo que exista un IDE que no te marque el error.

Prefiero siempre pensar que debemos codificar para otros y cuanto más claro, simple y natural, más fácil será que nos sigan.

Es una opinión, podemos definir con un "si el estándar Zend lo dice, lo acatamos" guiño

Hablando con un colega sobre este tema (lo bueno de tener colegas desarrolladores / docentes es que podemos tener formas distintas de ver las cosas y podemos discutirlas de manera constructiva y hasta corregirnos entre nosotros), me comentaba que en todo el código fuente de ZF se usa la forma "null == $var", por lo que me decía que era un "estándar" de ZF.

En su momento no tenía tantas horas recorridas dentro del código de ZF, por lo tanto no estaba seguro si realmente se usaba en el 100% del código o sucedía en algunas partes del mismo, así que me puse a volver a revisar los documentos donde especifican el estándar de Zend (no sería la primera vez que me olvide de algún detalle del mismo, por eso siempre RTFM):

El borrador que supuestamente se va actualizando y discutiendo hasta pasar al documento formal
http://framework.zend.com/wiki/display/ZFDEV/PHP+Coding+Standard+(draft)

Documento formal

http://framework.zend.com/manual/en/coding-standard.html

En ambos casos no encontré ninguna sugerencia o referencia al respecto. Así que podríamos llegar a la siguiente conclusión:
  • Esta práctica o técnica no es parte (actualmente) del documento de estándar de codificación (no se sugiere en ningún momento).
  • Pero, aparentemente es un "estándar de facto" ("de hecho") o directamente "una práctica de facto" (más que un estándar de codificación) que los desarrolladores de ZF hacen uso (se puede ver en el código).
Por lo tanto, en mi opinión, si no hay evidencias que en ninguna parte del código de Zend exista el uso inverso, es decir "$var == null", podríamos llegar a la conclusión que es una práctica que deberíamos seguir (aunque yo no lo haya hecho hasta la fecha).

Los Estándares

Los estándares solo sirven si los seguimos todos, de lo contrario no son estándares y se pierde su efecto, y deberíamos dar el ejemplo, por lo que su adopción nos beneficia a todos los desarrolladores (ya que codificaríamos con las mismas reglas, facilitando el entendimiento y dejando un código más "uniforme").

Le comentaba a este colega que hace unos años cuando empecé a adoptar el primer estándar de codificación de Zend (cuando ZF ya se podía empezar a usar en su primer versión) me "dolió bastante" tener que adoptar las llaves iniciando a la izquierda (al estilo C++) y el uso de "_" para todo lo que es "elementos privados", de la misma forma me sucede con el nombre con separación "_" (ej: Zend_Db, Zend_View, etc), ya que estamos modificando los nombres de las clases por un problema de PHP de no tener resuelto el manejo de ubicaciones de directorios y namespaces.

Cabe acotar que muchas tecnologías, como Java o .Net, vienen siempre de la mano de una empresa que a su vez vende su IDE y este ayuda a resolver todos estos problemas (de cómo ubicar los archivos / directorios) y en sí no es tanto problema del lenguaje, aunque ayuda que este maneje conceptos como paquetes / namespaces, y que nosotros nunca tuvimos desde PHP esa relación con ningún IDE (donde muchos desarrolladores aún usan editores de código).

Pero, como acotaba antes, si no adoptamos todos el estándar y tratamos que los demás lo usen, el estándar carece de efecto y no sirve, a ningún desarrollador Java o .Net se le ocurre cambiar la forma de indentar el código por una propia. Por ejemplo, el IDE de .Net (Visual Studio .Net) no te permite cambiar la indentación, él te indenta automáticamente. La primera vez que lo usé dije "¡qué es esto!" pero luego me di cuenta que en realidad era una muy buena idea, no te dejaba lugar a "inventar" estándares y a preocuparte en lo funcional (de todas formas si creas atributos, métodos o variables de un solo carácter, hasta donde sé, te lo sigue permitiendo ;-))

En Resumen

Como docente y como "desarrollador que codifica pensando en los demás", esta práctica no es de mi agrado (por un tema de claridad), y tampoco aparece explícitamente en el documento de estándar de codificación (se podría hasta pensar que es una técnica para evitar un error y no una forma de codificación, aunque lleva a cambiar todo el "paisaje" de nuestro fuente), por el momento no puedo adoptarlo a menos que así explícitamente esté discutido y comunicado como un estándar formal, más allá de si es un "estándar/práctica/técnica de facto" del equipo de desarrollo de Zend Framework.

Si alguno de vosotros encuentra más argumentos o documentación que hable que debemos seguirlo (como estándar), me avisa, y a los 5 minutos estoy cambiando mi forma de codificar ("la cabeza es redonda para que las ideas puedan cambiar de sentido").

Pero... (segundos antes de publicar este post)

Cuando este post ya estaba casi terminando y reconociendo mi falta de no cumplir algo que era "estándar de facto" y hacer público que aún así no iba a seguir esta práctica (ya que no aparecía en los documentos de estándares), empecé a hacer una investigación en el código de Zend y me llevé una gran sorpresa ;-)

Como soy un poco necio, pero mayormente curioso y metódico, me puse a sacar números reales del uso de una y otra práctica en el código de Zend a través de la siguiente búsqueda (buscar la cadena de forma recursiva dentro del directorio de ZF):

grep -i "null ==" * -R

Ingresé a uno de los servidores en GNU/Linux y tomé el directorio de Zend actualizado a la fecha y realicé las siguientes comprobaciones:

Aquí busqué todas las líneas de código en todos los fuentes de Zend y me encontré con el uso extendido de "null ==" algo.


Pero hice la búsqueda opuesta (pensando que no iba a encontrar nada) y veo que aparecen muchas líneas con "== null" (¿eh?)



Entonces, el pulso me temblaba e hice la siguiente prueba, para cada una de las sentencias antes ejecutadas, conté las lineas de ocurrencia ("wc -l") y llegué a la siguiente conclusión:

  • "null ==" aparece en 546 líneas
  • "== null" aparece en 2444 líneas!
Conclusión Final

Listo, no dije nada, tengo razón, no usen "null ==" por que yo lo digo y se acabó la discusión hasta nuevo aviso ;-)

PD: Esto en sí no es un tema de si mi colega se equivoca o yo, me pareció importante discutir todo el asunto de estándares y técnicas, y particularmente, esta tan controvertida forma de "evitar errores" (que parece está de moda) que en mi opinión lo único que hacen es ofuscar el código.

Además, para quebrar una lanza por mis colegas / amigos, muchas veces me han corregido errores más de los que yo pude encontrarles, sin olvidar que me considero eterno alumno de todo y aún dudo y me equivoco ;-)

¡Próximos cursos, lunes 23/3!

Este próximo lunes estaríamos iniciando dos de los cursos nuevos:
  • "Análisis y Diseño Orientado a Objetos": es el curso "continuación" del primero de "POO en PHP5", donde seguiremos trabajando en la parte teórica del diseño, profundizando el uso de UML y ejercitando la resolución de problemas de diseño (casos de uso, diagramas de secuencia, diagrama de clases, etc), abordaremos los principios de diseño, GRASP, etc, y tocaremos temas accesorios como Refactoring y metodologías de gestión ágil.
  • "Introducción a los Patrones de Diseño": este curso está basado en el famoso libro GOF ("grupo de los cuatro") que recopila los más usados patrones de diseño. Nosotros nos enfocaremos en los principales patrones, plantearemos una introducción a uno o dos por semana y posteriormente nos enfocaremos en una tarea que implique aplicarlos.
El primer curso, aunque siempre vamos anidando teoría y práctica para asimilar los conocimientos, es mucho más teórico que el primero de POO, donde veremos más principios y reglas de diseño "esotéricas" ;-)

El segundo curso es "introductorio", idea para quienes no conocen de patrones, y para quién sí los conoce, poder practicar y aplicarlos enfrentando "tareas desafío" durante 2 meses.

Ambos cursos son de "carga media", se pueden hacer con pocas horas por semana, y el procedimiento es el mismo de siempre:

  1. Se entrega generalmente un material inicial de estudio (*) ,
  2. Durante la semana se discute el tema en foros,
  3. Entre el jueves / viernes se hace entrega de la tarea,
  4. El lunes siguiente se debe entregar, y
  5. Entre el martes y miércoles se corrigen todos los trabajos de forma individual y posteriormente un documento con la solución propuesta por el docente explicando todos los errores que se encontraron en el grupo
  6. Y vuelve a iniciar la siguiente semana.

(*) Aclaración: dependiendo el avance del grupo o la complejidad del tema existirán algunas semanas que no habrá material "nuevo" y se seguirá tratando el mismo tema de la semana siguiente acompañado de un documento de corrección de trabajo más extenso y que aborda temas nuevos que deberán ser tenidos en cuenta en la siguiente tarea.

Posibles nuevos y últimos grupos de Zend Framework y de POO

Me han enviado varios emails con consultas sobre el ingreso a los cursos de Zend y de POO, pero como la semana ya estaba bastante iniciada, debía ser responsabilidad de cada uno ingresar tarde en el curso y actualizarse con todo lo visto hasta el momento (obviamente contaban con nuestro apoyo para responder cualquier duda durante el fin de semana).

Existe una posibilidad de abrir los 2 últimos cursos de este período el lunes, si realmente hay interés por favor enviarme un email confirmando o registrándose y reservando los cursos que deseen y veo luego de evaluar hasta el cupo para ver de abrir uno el próximo lunes o en la semana siguiente.

¡Últimas fechas de este primer semestre del año!

Confirmado: los cursos que inician el lunes 9/3 son ...

"POO para PHP5" (segunda edición) e "Introducción a Zend Framework", por lo tanto se inicia el cobro de las reservas a través de Paypal / Western Union / Giro Bancario (solo si es en Argentina).

Los restantes cursos se postergarán una semana hasta el lunes 16/3 (estaré avisando el viernes 13/3 el cobro de las reservas).

Tendrán plazo desde hoy hasta el lunes a última hora para confirmar el pago, posteriormente se comunicarán los grupos creados para cada curso y la información de ingreso.

Ya fueron notificados todos los usuarios registrados que tenían al menos una reserva de un producto (libro o curso).

PD: estoy terminado de contestar los correos que me envían, no desesperen ;-)

Viernes 6/Marzo: estoy anunciando el inicio de los primeros cursos

Estimados, la espera ha valido la pena. Estoy terminando de analizar los datos hasta el momento y mañana en el correr del día estaré anunciando qué cursos inician el lunes próximo (9/3) de acuerdo a la cantidad de inscriptos. También les comentaré cual de los cursos iniciará la otra semana (lunes 16/3).

En el correr del día de mañana (viernes 6/3) me comunicaré con los alumnos que han pre-reservado su lugar en el curso para habilitarles el pago del mismo.

Aclaraciones
  • Si el lunes al final del día todos los contactados han pago sus reservas, se armarán grupos de 20 alumnos como máximo (según el orden de registro/pago).
  • Solo contra el pago de la reserva se obtiene un lugar en el grupo del curso, si llegado el lunes al final del día no se confirma el pago, se habilita al usuario siguiente en la lista que sí lo ha hecho.
  • Como los cursos están pensados como módulos semanales, no es estricto que el alumno inicie el mismo lunes, ya que recién en el correr del día se entregarán los primeros materiales de estudio y tendrán toda la semana para estudiar y hacer consultas, hasta que el jueves o viernes (dependiendo la cantidad de dudas que existan) reciban la primer tarea semanal que tendrán que resolver para el lunes de la semana siguiente (y así repetir el ciclo).
En estos momentos estoy trabajando para actualizar el sistema usuarios.surforce.com y agregar toda la información que me han solicitado pero que no he podido terminar de revisar (aunque estoy respondiendo en el día todas las dudas que me envían por email, si no te respondí, por favor reenvía el correo).

Recuerden, el año pasado teníamos un solo curso y abrimos 6 grupos, uno por semana, por consiguiente este año haremos lo mismo, fijaremos las prioridades de acuerdo al volumen de alumnos registrados y la cantidad que paga en fecha su reserva. Si existen demoras en la confirmación de los pagos, el curso se atrasa una semana e inicia el dictado aunque este sea un grupo reducido.

Cualquier duda estoy respondiendo los comentarios en esta entrada, a través del correo electrónico, y en las próximas horas con más información en el sitio web de usuarios.surforce.com

Saludos y muchas gracias a todos por el interés en los cursos y en la confianza depositada en nosotros los que vamos a dictarlos, Andrés Guzmán y yo! ;-)

Por qué no deberíamos usar los "short tags" <? y <?=

Recientemente en una discusión en un foro uno de los tantos "expertos" que pueblan la comunidad PHP se mostraba contrario a mi explicación de qué cosas debía corregir en su código otro usuario.

Puntualmente la situación era la siguiente:

---Cita (Autor enriqueplace)---

[...]Sustituye los <?= por <?php echo, lo mismo que <? por <?php, está en desuso (por más que veas algunos ejemplos en el manual de Zend, eso es error de algún programador descarriado ;-))[...]

---Fin de Cita---


Y el usuario respondía:

"Che guru, fijate que lo que esta mal es usar el tag como "<?", pero no esta depcrecated el uso de "<?="

Chau guru."


En lo personal puedo aceptar (y me parece obvio) que desarrolladores duden y vuelvan a preguntar, pero no que contradigan sin fundamentos por el simple hecho que "ellos lo usan".

Dado que la discusión se trasladó al ámbito personal (la idea de esta persona era simplemente descalificar), nuestros aportes fueron borrados por el administrador del foro. Como considero que vale la pena la explicación sobre por qué no debemos usar los "short tags" o "etiquetas cortas" de apertura y cierre de PHP (en lo personal hace años evito esta práctica, pero he visto que algunos desarrolladores aún siguen usando).

Aquí la copia de la respuesta dada en el foro:

"Me remito al manual de PHP (que este capítulo está escrito hace mucho tiempo):

Sintaxis básica del lenguaje
http://www.php.net/manual/es/languag...ax.phpmode.php

Donde da ejemplos de todos los tags posibles para PHP, y el segundo dice:

2. <? echo ("esta es la más simple, una instrucción de procesado SGML \n"); ?>
<?= expression ?> Esto es una abreviatura de "<? echo expression ?>"


Este ejemplo hacer referencia al "formato corto de etiquetas" o "short tags", por lo cual el manual aclara:

"El método segundo no siempre está disponible. El formato corto de etiquetas está disponible con la función short_tags() (sólo PHP 3), activando el parámetro del fichero de configuración de PHP short_open_tag, o compilando PHP con la opción --enable-short-tags del comando configure. Aunque esté activa por defecto en php.ini-dist, se desaconseja el uso del formato de etiquetas corto."

Aunque esto pudiera no ser suficiente, el manual vuelve a reiterarlo un poco más abajo y ampliando otras situaciones donde además no es conveniente:

"Note: No se debe usar el formato corto de etiquetas cuando se desarrollen aplicaciones o bibliotecas con intención de redistribuirlas, o cuando se desarrolle para servidores que no están bajo nuestro control, porque puede ser que el formato corto de etiquetas no esté soportado en el servidor. Para generar código portable y redistribuíble, asegúrate de no usar el formato corto de etiquetas."

No recuerdo ahora (tampoco vale la pena buscarlo en este contexto) pero creo haber leído que en la versión 6 o 7 de PHP estos tags serán eliminados.

PD:
ahh, casi me olvido, en el manual de Zend Framework dice claramente "Short tags are never allowed" ("las etiquetas cortas nunca son permitidas"), de ahí mi expresión que "a pesar de ver ejemplos en el manual de Zend, no usarlos como excusa para decir "que no están en desuso / permitidos"".


Nota: Si se toman el tiempo para investigar un poco verán que las fuentes pueden ser contradictorias con sus sugerencias: el manual de PHP dice no usarlos, la guía de buenas prácticas del wiki de los desarrolladores de Zend Framework recomienda por un lado tampoco usarlos, pero por otro lado sí (en determinadas condiciones), y luego se pueden ver ejemplos de código en los dos sentidos (con y sin "short tags").

Claramente la respuesta válida no es "los short tags se pueden usar porque PHP lo permite usar" (de esa forma validaríamos muchas prácticas erróneas) o porque simplemente "yo lo uso hace tiempo" o porque "nunca leí nada que dijera lo contrario" (y ni siquiera han consultado el manual oficial).

En conclusión

Mi recomendación es que no uses los "short tags", usa siempre <?php y <?php echo, solo tienes que escribir unos caracteres más y usas una sintaxis que no te trae problemas en ningún contexto y es la versión "oficial" de los tags de PHP (lo otro es una abreviación).

Entradas populares