13 trucos y consejos de PHP que pueden hacerte la vida (profesional) más fácil

Por EducaciónIT
- 22/08/2016
8 minutos de lectura

PHP tiene bastante mala prensa. Y lo cierto es que las múltiples atrocidades que los desarrolladores de PHP cometen envalentonados por su flexibilidad y sencillez tienen buena parte de culpa. Sin embargo, si lleva tantos años siendo el lenguaje más utilizado para el desarrollo web, por algo será.

 

 

En las siguientes líneas te daremos algunos trucos, consejos y buenas practicas (13 en concreto) de PHP para que tu código sea mejor, tu vida profesional más agradable y puedas ir a los congresos de desarrolladores con la cabeza alta y sin esconder el elefante.

 

Disclaimer: los snippets de código usados en este artículo son orientativos. Usalos bajo tu estricta responsabilidad.

 

Desarrolla con el reporting de errores activado

 

Uno de las grandes némesis de los desarrolladores web en general y losphperos en particular es el "pantallazo blanco de la muerte". Un error 500 que no da ninguna información y que puede resultar tremendamente frustrante. Para evitarlo, sin tener que modificar el fichero php.ini, durante la fase de desarrollo tan sólo es necesario incluir las dos siguientes líneas al principio del código:

 

DATA HOSTED WITH ♥ BY PASTEBIN.COM - DOWNLOAD RAW - SEE ORIGINAL
  1. error_reporting(E_ALL);
  2. ini_set('display_errors', 1);

 

Esto te permitirá ver tanto los errores fatales que producen el temido pantallazo blanco como warnings o notices que pueden ser bugs a arreglar. Luego, claro está, no se te olvide eliminarlas al subir a producción.

 

Evita la inyección SQL

 

Posiblemente una de las causas de la mala prensa de PHP sean los agujeros de seguridad (Cross-Site Scripting, Cross-Site Request Forgeries...) que se te pueden colar en cuanto no seas un poco meticuloso. De todos ellos el más conocido (y el más sencillo de prevenir) es el de la SQL Injection: "la inserción de código SQL invasor con el fin de alterar el funcionamiento normal del programa y lograr que se ejecute la porción de código invasor en la base de datos" con funestas consecuencias.

 

¿Cómo lo evitamos? Hay varias maneras pero la más sencilla es escapando siempre cualquier variable (y no sólo los inputs del usuario) que vayamos a utilizar contra la base de datos. Tal que así:

 

DATA HOSTED WITH ♥ BY PASTEBIN.COM - DOWNLOAD RAW - SEE ORIGINAL
  1. $query_result = mysql_query("SELECT * FROM ex_table WHERE ex_field = \"" .mysql_real_escape_string($ex_field) . "\"");

 

¿Cómo? ¿Usando el obsoleto driver de MySQL en vez de MySQLi o PDO? ¿Y haciendo las consultas a pelo? Tranquilidad, no adelantemos acontecimientos de otros trucos y consejos que vendrán a posteriori.

 

Jubila el driver mysql

 

No estamos en 2005 ni seguimos usando PHP4 (o por lo menos eso espero) por lo que ya nos podemos deshacer del driver mysql para conectar con, mira tu por donde, MySQL. Podemos apostar por el driver mysqli (sobretodo en su forma orientada a objetos) o, mejor aún, caer en los fornidos brazos de PDO.

 

PDO, acrónimo de PHP Data Object, es una extensión de PHP que proporciona una capa de abstracción para la conexión con distintos gestores de bases de datos (porque en PHP también puedes trabajar contra otras bases de datos que no sean MySQL aunque a veces no lo parezca). Vamos, salvando las distancias puede equipararse a Hibernate de Java (que me perdonen los javeros si estoy diciendo alguna incongruencia) y su uso es tan sencillo como el que te mostramos a continuación:

 

DATA HOSTED WITH ♥ BY PASTEBIN.COM - DOWNLOAD RAW - SEE ORIGINAL
  1. try {
  2.     $conn = new PDO('mysql:host=localhost;dbname=database', $user, $pass);
  3.     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  4. } catch(PDOException $e){
  5.     echo "ERROR: " . $e->getMessage();
  6. }

 

Eso sí, recuerda tener instalada y activa la extensión y desempolva tus apuntes de POO.

 

Abraza cURL

 

Vale, cuando necesitas recuperar un fichero de otro servidor, file _ get _ contents()es potente, sencillo de utilizar y te saca del apuro pero no tienes nada de control sobre lo que ocurre y la flexibilidad también es escasa. Vamos, es como tener a Drenthe en tu equipo. Por eso mejor tirar de la popular extensión cURL (asegurate de tenerla instalada y activada antes de usarla): más potente, flexible y con decenas de opciones. Un ejemplo de uso de cURL puede ser tan sencillo como el siguiente:

 

DATA HOSTED WITH ♥ BY PASTEBIN.COM - DOWNLOAD RAW - SEE ORIGINAL
  1. $c = curl_init();
  2. curl_setopt($c, CURLOPT_URL, $url);
  3. curl_setopt($c, CURLOPT_TIMEOUT, 15);
  4. curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
  5. $content = curl_exec($c);
  6. $status = curl_getinfo($c, CURLINFO_HTTP_CODE);
  7. curl_close($c);

 

Abres una conexión con una url durante un tiempo determinado y recuperas el contenido de la misma además del status de la operación y sin olvidarnos de cerrarla. Luego las opciones que tienes para complicarlo todo son enormes, claro (cabeceras, parámetros por POST, autenticación, diferentes outputs, conexiones FTP, conexiones SSH, encriptación...).

 

[Bola extra] Si cURL se te queda corto siempre puedes tirar de librerías como GuzzleHTTP.

 

Usa las funciones _once() con precaución

 

A la hora de llamar a otros ficheros, librerías o clases podemos optar por la función include() o la función require(). La primera da un warning de no encontrar el fichero y sigue la ejecución. La segunda da un error fatal y para la ejecución. Bien, hasta aquí todo claro, PHP 101 de manual.

 

Sin embargo también tenemos la opción de utilizar las funciones include _ once()y require _ once(), que tienen la misma funcionalidad pero evitan que los ficheros, clases o librerías cargados puedan cargarse de nuevo causando duplicidades y estados no deseados en el código. Esto está genial a priori pero lo consiguen a costa de una disminución de rendimiento bastante notoria. Por lo tanto casi mejor ocuparte tu mismo, siempre que puedas, de evitar estas duplicidades revisando bien el código y todas las llamadas en el mismo.

 

Aprende a manejar los operadores ternarios

 

Los operadores ternarios son una buena alternativa a las construcciones IF simples: en una misma línea tienes el condicional y los resultados del TRUE y el FALSE. ¿Mande? He aquí un ejemplo:

 

DATA HOSTED WITH ♥ BY PASTEBIN.COM - DOWNLOAD RAW - SEE ORIGINAL
  1. $name = (!empty($_GET['name'])? $_GET['name'] : 'John');

La variable tendrá el valor del parámetro GET y de no haberlo, tendrá el literal John. Si eres disléxico o simplemente algo distraído lo mismo te cuesta un poco esto de los operadores ternarios pero a cambio tu código será más liviano. Ah, y se pueden anidar sin ningún problema.

 

Usa un Switch en vez de encadenar Ifs a lo loco

 

Seguimos nuestra lucha contra usar las construcciones If para todo. Switch es ligeramente más rápido que If pero dejando de lado el tema rendimiento, resulta horrible ver esa cantidad obscena de if-elseif-else encadenados que hacen ilegibles algunos códigos. Usa Switch, que para eso PHP es un lenguaje moderno y trae esta construcción, carallo.

 

Y ya que estamos, un truco para los Switch: pon antes los casos que consideres que van a ser más usados, el rendimiento será todavía mejor. Ejemplo:

 

DATA HOSTED WITH ♥ BY PASTEBIN.COM - DOWNLOAD RAW - SEE ORIGINAL
  1. switch ($color) {
  2.     case 'azul':
  3.         echo "El color es azul";
  4.         break;
  5.     case 'rojo':
  6.         echo "El color es rojo";
  7.         break;
  8.     case 'turquesa':
  9.         echo "El color es turquesa";
  10.         break;
  11.     case 'lapislazuli':
  12.         echo "El color es lapislazuli";
  13.         break;
  14. }

 

Usa comillas simples en vez de dobles

 

Esto puede parecer una perogrullada pero usar comillas simples ('') en vez de dobles ("") es el doble de rápido. O sea que siempre que puedas tira de comillas simples. El rendimiento de tu servidor te lo agradecerá.

 

URLs limpias de forma rápida con .htaccess

 

Las urls que genera PHP pueden ser un auténtico desastre. Soluciones para conseguir urls más limpias y amigables tanto para el ojo humano como para el SEO hay muchas pero pocas tan rápidas y sencillas como "hackear" el fichero .htaccess.

 

El .htaccess es un fichero oculto con directivas de Apache que sirve para una gran cantidad de cosas (aquí un tutorial bastante extenso y exhaustivo), entre ellas realizar redirecciones... y las urls limpias no dejan de ser redirecciones al fin y al cabo. ¿Un ejemplo?

 

DATA HOSTED WITH ♥ BY PASTEBIN.COM - DOWNLOAD RAW - SEE ORIGINAL
  1. RewriteEngine On
  2. RewriteRule ^([a-zA-Z0-9]+)$ index.php?page=$1

Con estas dos simples líneas de código consigues que una horrible url comotuweb.com/index.php?page=contacto sea accesible a través de la mucho más amigable tuweb.com/contacto. Si eres ducho con las expresiones regulares, puedes conseguir auténticas virguerías.

 

PHP encripta tus passwords por ti

 

A partir de PHP 5.5. (y de 5.3.7 con una librería alternativa) proporcionaencriptación nativa para las passwords que quieras almacenar en base de datos de una forma tan sencilla como:

DATA HOSTED WITH ♥ BY PASTEBIN.COM - DOWNLOAD RAW - SEE ORIGINAL
  1. $enc_pass = password_hash($submitted_pass, PASSWORD_DEFAULT);

¿Y chequear si la password es correcta? Igual de sencillo:

 

DATA HOSTED WITH ♥ BY PASTEBIN.COM - DOWNLOAD RAW - SEE ORIGINAL
  1. if (password_verify($submitted_pass, $stored_pass)) {
  2. // user correctamente autenticado
  3. }

Adiós engorros y calentamientos de cabeza con sha1() o md5().

 

Se consciente de la problemática de isset()

 

Otro de los problemas que le dan la mala fama a PHP es que hay funciones que no hacen exactamente lo que su nombre indica. Es el caso de, por ejemplo,isset(). Además de cuando la variable no existe, isset() devuelve False si el valor de la variable es NULL. Sí, como lo lees.

 

Por lo tanto, si NULL puede ser un valor válido de la variable, tenemos un problema:

 

DATA HOSTED WITH ♥ BY PASTEBIN.COM - DOWNLOAD RAW - SEE ORIGINAL
  1. $foo = null;
  2. if (isset($foo)) // devuelve false

¿Solución? Casi que mejor tiramos de get _ defined _ vars() y array _ key _ exists():

 

DATA HOSTED WITH ♥ BY PASTEBIN.COM - DOWNLOAD RAW - SEE ORIGINAL
  1. $foo = NULL;
  2. $vars = get_defined_vars();
  3. if (array_key_exists('foo', $vars)) // devuelve True

 

Pasa variables por referencia

 

Lo de las variables por referencia no es sólo para Java y demás lenguajes compilados, en PHP también puedes pasar los parámetros por referencia a una función y así esta podrá actualizar su valor sin necesidad de devolver nada o declarar engorrosas y olvidadizas variables globales. Tan fácil como anteponer un ampersand (&) y listo:

 

DATA HOSTED WITH ♥ BY PASTEBIN.COM - DOWNLOAD RAW - SEE ORIGINAL
  1. function square(&$number){
  2.     $number = $number * $number;
  3. }
  4. $number = 2;
  5. square($number);
  6. echo $number; // devuelve 4

 

En PHP ya está casi todo hecho... y es muy posible que sea open source

 

PHP es uno de los lenguajes de programación más populares del mundo y lo lleva siendo mucho tiempo... y esto es bueno, muy bueno, porque hay cuasi-infinitos recursos y muchos de ellos son gratis y/o open source. Por ejemplo en Awesome PHP recopilan centenares de librerías y recursos de contrastada calidad para hacer casi de todo: APIs, conexiones HTTP, conexiones con bases de datos SQL y NoSQL, generar documentación, testing, autenticación, enrutamiento, integración continua, herramientas para e-commerce...

 

Y, por supuesto, siempre que puedas, usa un framework, que para eso están. Y que PHP: The Right Way sea tu Biblia de cabecera.

 

 

 

 

Fuente: http://www.genbetadev.com/

Categoría
Artículo escrito por: EducaciónIT

Deja un comentario