Sigueme por RSS! RSS

Tips en PHP


Algunos tips, trucos en PHP

01 - Asignar valores a variables dependiendo de X condición (operador ternario).
02 - Asignar valores a múltiples variables en una sola línea.
03 - Validar cadena de caracteres.
04 - Uso de break y continue.
05 - Evitar la visualización de ciertos errores.
06 - Usar isset para comparar cantidad de caracteres de una cadena en lugar de strlen.
07 - Evitar usar funciones dentro o para comparar en estructuras de control iterativas.
08 - Pasar N cantidad de argumentos a una función.
09 - Pasar valores por referencia.
10 - Verificar en tiempo de ejecución si la directiva display_errors del php.ini se encuentra Off.
11 - Imprimir varias cadenas de caracteres es más rápido que imprimir una sola concatenada.
12 - Comprobar si se han enviado los headers.
13 - Heredoc.
14 - Función con parámetros opcionales.
15 - Comprobar si una función existe antes de usarla.

Otros tips:
- No use preg_match() si solo quiere verificar si una cadena está contenida en otra cadena. Use strpos() o strstr() en su lugar ya que éstas serán más rápidas.
- Es preferible usar las rutas completas en los includes y requires, ya que de ésta manera se pierde menos tiempo resolviendo la ruta.



01 - Asignar valores a variables dependiendo de X condición (operador ternario).

En algunas ocasiones necesitaremos imprimir en pantalla o actualizar alguna variable de acuerdo a determinada condición.

Ejemplo: de entre dos variables, mostrar cual es mayor..
if ($a <= $b)
   echo 'a es menor o igual que b';
else
   echo 'a es mayor que b';

Podríamos ahorrarnos unas lineas haciendo uso del operador ternario de la siguiente manera:
echo (condicion) ? 'Respuesta afirmativa' : 'Respuesta negativa';

Antes del símbolo de interrogación "?" colocamos las condiciones, luego la respuesta en caso de ser afirmativo y después de los dos puntos ":" agregamos los datos a mostrar si no se cumplen las condiciones. Ejemplo:
echo $a <= $b ? 'a es menor o igual que b' : 'a es mayor que b';

El operador ternario lo que hace es evaluar una condición y retornar un valor dependiendo del resultado, true/false.

Ejemplo: mostrar que variable es mayor por valor y posición
if ($a > $b)
{
   if ($a > $c)
      echo 'a es el mayor';
   else
      echo 'c es el mayor';
}
elseif ($b > $c)
   echo 'b es el mayor';
else
   echo 'c es el mayor';

Lo mismo en una sola línea y almacenando el resultado en una variable:
$sMayor = (($a > $b) ? (($a > $c) ? 'a es el mayor' : 
'c es el mayor') : (($b > $c) ? 'b es el mayor' : 'c es el mayor'));



2 - Asignar valores a múltiples variables en una sola línea:

// esta asignación:
$a=1;
$b=2;
$c=3;
$d=4;
$e=5;
$f=6;

// podemos simplificarla de esta manera:
list($a,$b,$c,$d,$e,$f) = array(1,2,3,4,5,6);

En este caso se usa el constructor list para asignar valores a una lista de variables en una sola operación.

Ejemplo: Asignando el resultado de una consulta a las variables correspondientes
$sSQL = "SELECT nombres,apellidos,sexo FROM users WHERE idpersona=1";
$result = mysql_query($sSQL);
list ($sNombre, $sApellido, $sSexo) = mysql_fetch_row($result);
echo $sNombre ,' - ', $sApellido ,' - ', $sSexo;



3 - Validar cadena de caracteres

En el caso de que necesites validar los datos de entradas para usarlos de forma segura mas adelante, puedes usar las funciones ctype, ejemplo:

ctype_alpha devuelve true si los caracteres de la cadena pasada por parámetro son alfabéticos
// devuelve true
echo ctype_alpha('cadena') ? 1 : 0;

// devuelve true, usar empty para comprobar.
echo (ctype_alpha('') ? 1 : 0);

// devuelve false por el espacio.
echo (ctype_alpha('otra cadena') ? 1 : 0);

// devuelve false
echo (ctype_alpha('1234') ? 1 : 0);

ctype_digit devuelve true si los caracteres de la cadena pasada por parámetro está compuesta solo por números.
// devuelve true
echo (ctype_digit('1234') ? 1 : 0);

// devuelve false por el punto
echo (ctype_digit('1234.5') ? 1 : 0);

// devuelve false por la coma
echo (ctype_digit('12345,6') ? 1 : 0);

// devuelve false por la letra e
echo (ctype_digit('222e222') ? 1 : 0);

ctype_alnum devuelve true si la cadena de caracteres pasada por parámetro es alfanumérica.
// devuelve true
echo (ctype_alnum ('12a3c') ? 1 : 0);

// devuelve false por no ser alfanumerica
echo (ctype_alnum ('!123abc') ? 1 : 0);

Podemos hacer uso de:
- empty --> devuelve false si la variable no está vacía y no es igual a cero (0).
- isset    --> devuelve true si se ha definido la variable.

$MyVar = 0;
// devuelve true ya que $var esta vacía
if (empty($MyVar))
echo '$var es 0, una variable vacía, o no está definida en absoluto';

// devuelve true ya que $var esta definida
if (isset($MyVar)) 
echo ' - $var está definida aunque este vacía';



4 - Uso de break y continue

Podemos usar break para escapar de las estructuras de control, for, while, switch. break acepta un argumento opcional que indica el número de estructuras a escapar. Ejemplo:
while (1)
{
   $var = rand(1,10);
   switch($var)
   {
      case 2: 
      {
         echo $var;
         break 1; // escapa/sale del swith        
      }
      case 6:
      {
         echo ' -- '.$var;
         break 2; // escapa/sale del swith y el while        
      }
   }
}
echo ' -- he salido del while';

continue permite saltarse el resto del procedimiento (dentro del bucle) y continuar con la siguiente iteración. Ejemplo:
for ($var = 1; $var<=10; $var++)
{
if ($var % 2 == 0)
continue;

/* 
   esta linea se imprime si no se abandona el bucle 
   en esta iteración
*/
echo ' - '.$var;
}

cita:
continue acepta un argumento numérico opcional el cual indica hasta el final de cuantos niveles de bucles cerrados se debe saltar.



5 - Evitar la visualización de ciertos errores

Para evitar que se muestre determinado error, podemos colocar el carácter arroba "@" delante de la instrucción. Ejemplo:
$Conex = @fsockopen('localhost',1234);

Esto solo evitara que se muestre el error en la página, no evitara que se produzca.



6 - Usar isset para comparar cantidad de caracteres de una cadena en lugar de strlen

A la hora de hacer comparaciones es recomendable el uso de constructores en lugar de funciones comunes, dado que estas ultimas son un poco mas lentas. Las cadenas de caracteres pueden ser tratadas como matrices, de manera que cada carácter es un elemento de dicho arreglo comenzando desde 0. Podemos usar isset y hacer la siguiente comparación:
$sCadena = '123456';
echo isset($sCadena[5]) ? 
'tiene 6 caracteres' : 'es diferente de 6 caracteres';

Este tipo de comparaciones es para casos específicos (como el del ejemplo), si necesitas saber la longitud de la cadena y no se tiene ninguna referencia, entonces usa strlen.



7 - Evitar usar funciones dentro o para comparar, en estructuras de control iterativas.

Ejemplo:
$MyArray = array(0,1,2,3,4,5,6,7,8,9);
for ($i=0; $i > count($MyArray); $i++)
   echo 'al hacer uso de la funcion count para comparar dentro de
         un ciclo, esta se ejecuta con cada iteracion...';



8 - Pasar N cantidad de argumentos a una función.

Podemos crear una función que no requiera de argumento alguno y que pueda ser llamada pasándole los parámetros que se deseen según sea el caso. Ejemplo:
function MyFuncion()
{
   // obtenemos el numero de argumentos
   $NumArgs = func_num_args();
   // obtenemos el array de argumentos
   $ArrayArg = func_get_args();
   for ($i=0; $i>$NumArgs; $i++)
      echo 'Parámetro ', $i ,': ', $ArrayArg[$i] ,' -- ';
}

MyFuncion('hola','como','estas','?','yo','bien',';)');
MyFuncion('hola','holaaa');
MyFuncion('hola','como','estas','?','yo','bien','nos','vemos','otro','dia');



9 - Pasar valores por referencia
PHP nos permite a partir de la versión 4 la posibilidad de pasar valores por referencia a funciones o variables, ejemplo:
$a=2;
function prueba(&$var)
{
   $var = $var + 4;
}

echo $a,' - ';
prueba($a);
echo $a;
// se imprime 2 - 6

En el ejemplo anterior se imprime "6" al final de la cadena, ya que el valor pasado como argumento no solo afecta a la variable dentro de la función, si no que modifica el valor de la variable pasada como parámetro, de manera que tanto $a como $var toman el mismo valor.



10 - Verificar en tiempo de ejecución si la directiva "display_errors" del "php.ini" se encuentra "Off".

Si en algún momento no se muestran los errores al ejecutar un script, es posible que la directiva display_errors se encuentre desactivada, para verificar esto solo basta con usar la siguiente línea para comprobarlo:
echo (!ini_get('display_errors') ? 'La directiva está desactivada' : 
'la directiva está activada');



11 - Imprimir varias cadenas de caracteres es más rápido que imprimir una sola concatenada.

Al imprimir varias cadenas de caracteres el script tarda un poco más si debe concatenarlas antes de imprimirla, diferencia mínima pero diferencia al fin:
$v4 = '?';
$v1 = 'hola';
$v3 = ' estas';
$v2 = ' como';

// concatenando
echo $v1 . $v2 . $v3 . $v4;

echo ' -- ';

//Muy diferente a si se imprimen por separado:
echo $v1; 
echo $v2;
echo $v3;
echo $v4;

echo ' -- ';

/*
  Hay otra forma de hacer esto ultimo sin llamar tantas veces a la
  función echo, ya que esta a diferencia de la función print, puede
  recibir varios parámetros e imprimir cada uno por separado, para 
  eso le pasamos cada argumento separado por una coma (,) 
*/
echo $v1,$v2,$v3,$v4;//pasando varios argumentos en lugar de concatenar



12 - Comprobar si se han enviado los Headers.

PHP nos provee de la función headers_sent que nos permite comprobar si los Headers se han enviado o no, antes intentar enviarlos nosotros y así evitar cualquier error en ejecución.
// si no se han enviado los headers ..
if (!headers_sent()) {
    header('Location: http://cassianinet.blogspot.com');
    exit;
}



13 - Heredoc.

Es una forma de identificador cadenas de texto en PHP, su sintaxis es la siguiente:
<<<[identificador]
... contenido
[identificador]

El identificador debe contener SOLO caracteres alfanuméricos, guiones bajos y debe empezar con un carácter alfabético o un guión bajo.

- las comillas en Heredoc no necesitan ser escapadas.
- en el caso de las variables, interpretara su contenido sin necesidad de concatenar.
- se puede emplear su sintaxis para pasar datos como argumento de una función.

Ejemplo:
$NumCita=6;
echo <<<quote
Cita #$NumCita:
"PHP es un lenguaje de programación interpretado, diseñado originalmente para la
creación de páginas web  dinámicas"
quote;



14 - Función con parámetros opcionales.

Si en una función necesitas parámetros opcionales, solo debes asignarle un valor por defecto, luego al llamar al procedimiento, si no le pasas ningún valor a esos argumentos alternativos usaran los que tienen por default.

function mi_funcion(
   $Parametro1,           // obligatorio
   $Parametro2 = true,    // opcional
   $Parametro3 = 1234,    // opcional
   $Parametro4 = 'string' // opcional
)
{
  echo $Parametro1,' - ',$Parametro2,' - ',$Parametro3,' - ',$Parametro4;
}

Mi_Funcion('parametro_1');
// imprime parametro_1 - 1 - 1234 - string

Mi_Funcion('parametro_1',true,5555);
// imprime parametro_1 - 1 - 5555 - string

Mi_Funcion('parametro_1',false,6534,'nueva string');
// imprime parametro_1 - - 6534 - nueva string

Si quieres cambiar el valor por defecto del ultimo parámetro opcional, debes especificar los valores para los parámetros que estén antes de él, solo de esa manera estarías indicando exactamente cual valor modificar.



15 - Comprobar si una función existe antes de usarla.

Para eso usamos function_exists:
Chequea la lista de funciones definidas, tanto incorporadas (internas) como definidas por el usuario, en busca de nombre_funcion. Devuelve TRUE si todo se llevó a cabo correctamente, FALSE en caso de fallo.

if (function_exists('mi_funcion')) {
    echo "Las función SI existe.";
    //.. aquí llamas a la función ..
} else {
    echo "Las función NO existe.";
}


Fuentes:
http://php.net

0 comentarios: Suscribete a los comentarios por RSS

Publicar un comentario

- Los comentarios están siendo moderados y serán publicados en la brevedad posible.