El mejor IDE para PHP

Este articulo lo encontre en SmashingMagazine – The Big PHP IDE Test, me pareció muy interesante saber que IDE (Entorno de Desarrollo Integrado) de PHP es el mejor para trabajar.

Aquí la traducción a español como también algunos aportes que le di.

Porque debemos elegir un buen IDE para Trabajar?

Para ser mas productivo, cometer menos errores, y escribir un buen código, pero todo esto depende de mi ¿o no?.

Si, pero los IDE’s sirven para ayudar a lograr estos objetivos con mucha facilidad. Y la elección de un buen IDE es muy difícil, ya que todos dicen ser los mejores, ya sean open source o licenciados.

Yo creo que la única forma de saber que IDE es el mejor, es probarlo, desarrollar una aplicación real con cada IDE y decidir con que entorno de desarrollo me fue mas productivo y agradable el trabajo.

El proposito de este articulo es ofrecerle los resultados de la experiencia de haber probado los mas populares IDE’s para PHP, explorando sus funciones, y comparandolas en una tabla de resultados donde usted conocera lo que cada IDE podrá ofrecerle y que alguno hasta se adapte a sus necesidades.

Características de un buen IDE

1. El resaltado de sintaxis (Syntax highlighting)

Desarrollar en un simple notepad no es lo mismo que escribir tu código y que el IDE resalte las funciones, comentarios, variables, textos, entre otras cosas en tu aplicación
Esto hara que sea mas legible y reconozca mejor tu código

2. El completado de código (code intelligence)

Esto ayuda mucho ya que evita al desarrollador escribir tanto, incluso si soporta los parametros en los comentarios de tus clases, funciones, variables de PHP (phpDoc), pueden mostrarte la descripcion, tipo de datos que retorna, que tipo de parametros soporta (en caso sean funciones o metodos), y su nivel de visibilidad (public, protected, private).

3. Busqueda de código

En PHP se acostumbra mucho hacer “includes”, ya sean archivos de configuración o funciones para reutilizarlas, y cuando vemos en nuestro código una llamada a una función o metodo ($this->getElementos), queremos ir rapidamente a la definición.
La mayoría de IDE’s buenos soportan el “GoTo Definition”, que busca de donde proviene la función, variable, constante, o clase, y con la ayuda de un botón del teclado( generalmente “control”) se muestra como un link permitiendo ir a la definición de dicho código
Esto nos ahorra un tiempo valioso cuando queremos encontrar una función para corregirla o ver el proceso que realiza.

4. El resaltado de errores y advertencias.

Si cometemos un error de sintaxis como por ejemplo olvidarnos de terminar la línea con punto y coma “;”, algunos IDE’s remarcan la línea de color rojo por lo general, a veces habrá un cuadro de dialogo donde te dira el posible error que tubiste, esta función nos evitaría ciertas molestias de prueba y fallo.

5. Refactorización y generación de código

Refactorización significa optimizar el código, reescribirlo de tal forma que quede mas solido, formateado, y con una nomenclatura estandar.
Actualmente esta función en los IDE’s de PHP es muy simple a comparación de Java y C, pero sigue siendo muy útil.

Las funciones de refactorización básicamente incluyen:

  • Mover: actualiza todos los archivos dependientes con la nueva ruta.
  • renombrado: cambiar el nombre de inclusión en todos los archivos necesarios.
  • eliminación: realiza la inspección de que no afecte a ningún archivo la eliminación de este.
  • Formateo: realiza la corrección de tabulado de código y corrección de apertura y cierre de llaves “{}” según algún estandar seleccionado en el IDE (PHP4, PHP5).

Sobre la generación de código, algunos IDE’s tienen la opción de crear getters y setters para las variables de una clase, y para que tipo de PHP es, por ejemplo: un metodo para PHP4 seria “function get_usuarios()” en cambio con el estandar para PHP5 seria de esta forma “public function getUsuarios()”.
Otra opción serian la generación de código para la conexion a la base de datos, pero esta función para mi opinión, no debería recomendarse, ya que es mejor realizar una clase de abstracción a la base de datos como escribí en mi anterior POST (MVC en PHP).

6. Depuración de código (Debugging)

A veces depuramos nuestro código con el famoso “echo” o si es array “print_r”, pintando las variables en los posibles lugares que creemos que hubo error, esta practica en aplicaciones complejas seria muy engorrosa y podríamos dejar uno que otro “echo” por hay, sin darnos cuenta.
Para esta solución es que se busca un IDE con función de depurar nuestro código PHP con breakpoints (lugares donde hara pausa la depuración), seteo de contenido para las variables, visión general de envio de datos GET, POST, SESSION, etc.

7. Cliente de sistema de control de versiones

Al realizar nuestros proyectos sean grandes, medianos, o chicos, es recomendable usar un sistema de control de versiones sea (CVS, SVN, git, etc).
Un IDE que tenga incorporado un cliente de sistema de control de versiones es un ahorro de tiempo ya que no estariamos abriendo dos programas a la vez y cambiandolo al hacer un checkout, update, commit u otro proceso de estos sistemas, y por consecuencia también ahorrariamos memoria en la PC.
También los sistemas de control de versiones cuentan con una ventana de comparación de versiones remarcando que cosas se cambiaron, borraron, agregaron.

8. cliente FTP / SFTP

Tener un programa para subir archivos por FTP es necesario siempre, y tenerlo integrado en el IDE es mucho mejor todavía, ya que tendríamos el control de descarga y subida en el mismo entorno.

Como elijo uno bueno?

Cada IDE tiene muchas características, algunas muy útiles como también a veces no necesarias, aquí algunas pautas para elegir al mejor IDE.
No necesariamente el software libre trae menos cosas, pero si puede comenzar con ellos para acostumbrarse al manejo de un IDE.
Asegurarse que las características que tiene el IDE son las que usted necesita y comprobar que funcionan correctamente.
Una vez elegido el IDE, tendrá que practicar con el durante algunos dias antes de realizar un proyecto.

IDE’s basados en Eclipse

PDT (PHP Developer Toolkit), Zend Studio 6, Aptana PHP y Aptana Studio Pro se basan en la plataforma Eclipse.
Eclipse se caracteriza por sus miles de plugins para nuevas funcionalidades. Si no encuentra alguna característica en el IDE por defecto, lo mas probable es que se encuentre como un plugin.

NetBeans

Es el nuevo y novedoso IDE ahora con soporte para PHP (principalmente era para trabajar con Java). Tiene la mayoría de las características de otros IDE’s y ha logrado evolucionar de manera rapida. En la pagina oficial de este NetBeans se encuentran las características mas detalladamente.

Conclusiones

Si aun no utiliza un IDE puede que este perdiendo tiempo valioso, pruebelo y en unos dias vera la diferencia.
PDT y NetBeans son muy buenos. Si necesita una gran cantidad de funcionalidades, Eclipse seria su mejor opción. Si la herramienta de edición de código es mas importante le recomiendo Netbeans.

Comercial VS Software libre

A veces los Software comerciales no tienen mucho mas ventajas que los Software libres, pero en este caso comparando Zend Studio con PDT 2.0 es el rendimiento, la detección de errores, el autocompletado quien diferencia a los dos.

Nota: Esta es solo lista con características que ustedes tienen que tomar en cuenta a la hora de evaluar que IDE sera el indicado. Prueben todos los IDE’s y verán que todos tienen sus particularidades.

Veamos la tabla de comparación con los IDE’s testeados

Tabla en Google Docs (versión no editable)

Recursos

Tutorial MVC con PHP

¿Qué es MVC?

Modelo Vista Controlador es un patrón de arquitectura de software que se utiliza mucho en aplicaciones web, separandola en tres capas (modelo, controlador y vista)

  • El Modelo se encarga de interactuar con la base de datos y también se ejecuta las reglas de negocio.
  • El Controlador procesa las peticiones de la pagina web (vista), y envía estos datos a la capa modelo, para que esta le devuelva la información adecuada para mostrarla en la capa vista.
  • La vista es el código HTML que se muestra al usuario, con la información proveniente del controlador.

¿Porqué útilizar MVC?

El fácil mantenimiento de código en un futuro, ya que al estar separadas los distintos procesos según su tipo.
Si quisieramos por ejemplo cambiar de tipo de base de datos, solo tendremos que cambiar la capa modelo.

Para una mejor percepción de esta arquitectura, muestro la transformación de una lista de artículos de un blog.

Este código es lo necesario para cumplir con el proposito de listar los artículos


[php]
<?php
$cn = mysql_connect(‘local’,’usu’,’clave’);
mysql_select_db(‘db’, $cn);
$r=mysql_query(‘SELECT *FROM articulo’, $cn);
?>
<h1>Listado de Artículos</h1>
<table>
<tr>
<td>Fecha</td>
<td>Titulo</td>
</tr>
</table>
<?php
while($fila= mysql_fetch_array($r, MYSQL_ASSOC))
{
echo "<tr>";
echo "<td> ".$fila[‘fecha’]." </td>";
echo "<td> ".$fila[‘titulo’]." </td>";
echo "</tr>";
}
?>
</table>
<?php
mysql_close($cn);
?>
[/php]

Observaciones

  • En la misma página nos conectamos al servidor ( solo funcionara si es MySQL ) y seleccionamos una base de datos.
  • Realizamos una consulta (no hay manejo de errores y/o excepciones).
  • Pintamos el código HTML (combinamos código HTML dentro del código PHP, dejando los tags (<tr>, <td>) ilegibles para la persona que implemente los estilos).

Utilizando el Controlador y la Vista

El ejemplo anterior los separaremos en dos archivos, uno se llamara controlador y el otro vista.

controlador.php


[php]
<?php
$cn = mysql_connect(‘local’,’usu’,’clave’);
mysql_select_db(‘db’, $cn);
$resultado = mysql_query(‘SELECT *FROM articulo’, $cn);
$articulos = array();
while($articulo = mysql_fetch_assoc($resultado))
{
$articulos[] = $articulo;
}
mysql_close();
require(‘vista.php’);
?>
[/php]

vista.php


[html]
<h1>Listado de Articulos</h1>
<table>
<tr>
<td>Fecha</td>
<td>Titulo</td>
</tr>
<?php foreach($articulos as $articulo): ?>
<tr>
<td><?php echo $articulo[‘fecha’]?></td>
<td><?php echo $articulo[‘titulo’]?></td>
</tr>
<?php endforeach;?>
</table>
[/html]

De esta manera tenemos separada en el controlador.php casi todo el código php con la lógica de negocios, mientras que en vista.php solo recorremos un array con datos.

Lo recomendable en la vista seria utilizar instrucciones PHP mas conocidad, como: if, endif, foreach, endforeach. Y no utilizarlas con llaves “{“, ya que dificulta reconocer donde empieza y termina.

Otro problema seria si queremos utilizar nuevamente el listar articulo en otra pagina, tendríamos que reescribir el controlador.php de nuevo.
Para esto separaremos el controlador(controlador.php) en modelo.php y controlador.php.

Utilizando el Modelo

modelo.php


[php]
<?php
function getArticulos()
{
$cn = mysql_connect(‘localhost’, ‘usuario’, ‘clave’);
mysql_select_db(‘db’, $cn);
$resultado = mysql_query(‘SELECT fecha, titulo FROM articulo’, $cn);
$articulos = array();
while($articulo = mysql_fetch_assoc($resultado))
{
$articulos[] = $articulo;
}
mysql_close();
return $articulos;
}
?>
[/php]

controlador.php


[php]
require(‘modelo.php’);
$articulos = getArticulos();
require(‘vista.php’);
[/php]

Despues de esta separación el controlador quedaría tan solo como un agente para pasar datos del modelo hacia la vista, pero en aplicaciones mas complejas el controlador es quien realiza las tareas de autenticación de usuarios, manejo de sesiones, filtrar y validar entradas de datos por GET o POST.

 

Cambiando el gestor de Base de Datos

La respuesta seria, cambiar todas las funciones del modelo (mysql_connect, mysql_query, …) por las correspondientes, y eso nos tomaría mucho tiempo.
Para hacer un mejor uso de MVC o mejor dicho cambiando el patrón un poco, se podría separar el modelo en dos capas:

  • La capa de Acceso a Datos
  • La capa de Abstracción de la Base de Datos

Si se diera el caso de cambiar de gestor de base de datos, solo tendríamos que actualizar la capa de abstracción de la base de datos

Ejemplo de las dos capas

Abstracción de datos


[php]
function crearConexion($servidor, $usuario, $clave)
{
return mysql_connect($servidor, $usuario, $clave);
}
function cerrarConexion($cn)
{
mysql_close($cn);
}
function consulta($consulta, $base_datos, $cn)
{
mysql_select_db($base_datos, $cn);
return mysql_query($consulta, $cn);
}
function getResultado($resultado, $tipo = MYSQL_ASSOC)
{
return mysql_fetch_array($resultado, $tipo);
}
[/php]

Acceso a Datos


[php]
function getTodosLosArticulos()
{
$cn = crearConexion(‘localhost’, ‘usuario’, ‘clave’);
$resultado=consulta(‘SELECT fecha, titulo FROM articulo’, ‘db’, $cn);
$articulos = array();
while ($articulo = getResultado($resultado))
{
$articulos[] = $articulo;
}
cerrarConexion($cn);
return $articulos;
}
[/php]

Ahora tenemos la capa de Acceso a Datos sin ninguna dependencia de funciones de alguna gestor de base de datos, y podremos reutilizar las funciones de la capa de abstracción de base de datos en otras funciones de acceso a datos de nuestro modelo.

MySQL to JSON

MySQL to JSON no es mas que una manera de ahorrar codificación del lado del servidor y también ayudar a disminuir el tiempo valioso de respuesta.

La manera mas simple y con mejor rendimiento si se quiere trabajar con JSON seria que la misma bd te devolviera los resultados en dicho formato.

Usando las funciones CONCAT() y GROUP_CONCAT() lograriamos construir el JSON directamente desde la consulta SQL.

Ejemplo

Para este ejemplo construiremos una tabla sencilla de usuarios(para variar)

CREATE TABLE `user`(
	`id`    int not null auto_increment,
        `name`  varchar(100),
        `email` varchar(50),
        PRIMARY KEY(id)
) ENGINE = InnoDB;

Luego insertaremos unos cuantos registros.

INSERT INTO `user` (`name`, `email`) VALUES
('Cesar', 'cesar@tednologia.com'),
('Maria', 'maria@gmail.com'),
('Jose', 'j0s3@hotmail.com'),
('Albert','albertpr@yahoo.com');

Finalmente realizaremos la consulta que nos traera el JSON.

SELECT
    CONCAT( "[",
        GROUP_CONCAT(
            CONCAT("{name:'",`name`,"'"),
            CONCAT(",email:'",`email`,"'}")
        )
    ,"]")
AS json FROM users;

resultado:

[
    {
        name : 'Cesar',
        email: 'cesar@tednologia.com'
    },
    {
        name : 'Maria',
        email: 'maria@gmail.com'
    },
    {
        name : 'Jose',
        email: 'j0s3@hotmail.com'
    },
    {
        name : 'Albert',
        email: 'albertpr@yahoo.com'
    }
]

Triggers en MySQL 5

p>¿Qué son los triggers?

Los Triggers son simplemente procedimientos guardados en la base de datos que se ejecutan antes (BEFORE) y/o después (AFTER) de algún(os) eventos (INSERT, DELETE, UPDATE) sobre la tabla que fue asociada al trigger.

Tienen dos palabras claves, OLD y NEW que simbolizan los valores anteriores o nuevos de la columna.

  • Los INSERT permiten NEW
  • Los DELETE sólo OLD
  • Los UPDATE ambas, NEW y OLD.

Esta es el la estructura de como se declara un trigger:

CREATE TRIGGER [ Nombre_de_Trigger ]
[ Momento ] [ Evento ] ON [ Nombre_de_Tabla ]
FOR EACH ROW
[ Sentencia_SQL ]

Donde:

  • Nombre_de_Trigger: Es el nombre que identificara al trigger
  • Momento: Sera cuando se ejecute ( BEFORE, AFTER )
  • Evento: Proceso el cual llamara al trigger ( INSERT, UPDATE, DELETE )
  • Sentencia_SQL: SQL que se ejecutara al realizar la acción anterior
  • Un ejemplo de trigger seria guardar un log de cambios de datos de un usuario.

    Primero crearemos la tabla `user`

    CREATE TABLE `user`(
    	`id`      int not null auto_increment,
            `name`  varchar(100),
            `email` varchar(50),
            PRIMARY KEY(id)
    ) ENGINE = InnoDB;
    

    Insertaremos un par de registros

    INSERT INTO `user` (`name`, `email`) VALUES
    ('Cesar', 'cesar@tednologia.com'),
    ('Maria', 'maria@gmail.com'),
    ('Jose', 'j0s3@hotmail.com'),
    ('Albert','albertpr@yahoo.com');
    

    Esta sera la tabla de logs que guardara los datos históricos del usuario

    CREATE TABLE log_user
    (
    	`id`          int not null auto_increment,
    	`name`        varchar(100),
    	`email`       varchar(50),
    	`id_user`     int not null,
    	`user`        varchar(40),
    	`date_update` datetime,
    	primary key(id)
    ) ENGINE = InnoDB;
    

    y finalmente un trigger que se disparará cada vez que alguien modifique un dato de la tabla clientes y lo guardará en una tabla junto al nombre del usuario y la fecha.

    Ahora crearemos nuestro trigger llamado “trigger_log_users” que se ejecutara justo despues de actualizar la tabla `user` y guardara los datos anteriores de `user` en la tabla `log_user`

    CREATE TRIGGER trigger_log_users AFTER UPDATE ON `user`
       FOR EACH ROW
       INSERT INTO log_user(`name`, `email`, `id_user`, `user`, `date_update` )
       VALUES (OLD.`name`, OLD.`email`, OLD.`id`, CURRENT_USER(), NOW() );
    

    Recursos

Los mejores servicios de hosting gratis

Si necesitas un servicio de hospedaje (hosting) ya sea para tus pruebas, trabajo, webs que recien estan empezando, o para cualquiera de tus necesidades, dejo aquí una lista con los mas recomendados servicios de hosting gratis.

000WebHost

  • 1500 MB de espacio en disco
  • 100,000 MB de Transferencia
  • PHP5 y MySQL5
  • Cronjobs
  • Cuentas FTP
  • Cuentas Email
  • curl, gd, soporte de IMAP y POP3
  • Ninguna publicidad

Zymic

  • 5000 MB de espacio en disco
  • 50000 MB de Transferencia
  • PHP5 y MySQL5
  • Cuentas FTP
  • Ninguna publicidad

110MB Hosting

  • 5000 MB de espacio en disco
  • 50000 MB de Transferencia
  • PHP4 y 5
  • Cuentas FTP
  • curl, gd
  • 110DBManager / phpMyAdmin
  • Ninguna publicidad

Existen muchos servicios de hosting gratis, pero de todos los mejores tan solo 3 llegaron a ser verdaderamente buenos, por sus características, rapidez, y soporte.