El lenguaje PHP es un lenguaje muy amplio con muchas funciones, y muchas de ellas no utilizadas normalmente, cuando podrían sernos de mucha utilidad. Vamos a ver algunas funciones y características de este lenguaje, que todo el mundo debería de conocer. 1.- Funciones con un número arbitrario de argumentos Sabemos que PHP permite funciones donde podemos indicar que algún argumento es opcional, pero también se pueden crear funciones donde todos los argumentos son opcionales. Veamos un ejemplo sacado de la página oficial.
// function with 2 optional arguments function foo($arg1 = '', $arg2 = '') { echo "arg1: $arg1n"; echo "arg2: $arg2n"; } foo('hello','world'); /* prints: arg1: hello arg2: world */ foo(); /* prints: arg1: arg2: */Ahora, vamos a ver cómo podemos construir una función que acepta cualquier número de argumentos. Esta vez vamos a utilizar func_get_args ():
// yes, the argument list can be empty function foo() { // returns an array of all passed arguments $args = func_get_args(); foreach ($args as $k => $v) { echo "arg".($k+1).": $vn"; } } foo(); /* prints nothing */ foo('hello'); /* prints arg1: hello */ foo('hello', 'world', 'again'); /* prints arg1: hello arg2: world arg3: again */2.- Usando la función Glob() para encontrar archivos La función Glob(), lo que permite es buscar archivos según la cadena que le metamos como parámetro.
// get all php files $files = glob('*.php'); print_r($files); /* output looks like: Array ( [0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php ) */También se le puede meter varios tipos de archivos a buscar.
// get all php files AND txt files $files = glob('*.{php,txt}', GLOB_BRACE); print_r($files); /* output looks like: Array ( [0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php [4] => log.txt [5] => test.txt ) */La salida también puede ser una ruta, dependiendo del tipo de búsqueda que hagamos.
$files = glob('../images/a*.jpg'); print_r($files); /* output looks like: Array ( [0] => ../images/apple.jpg [1] => ../images/art.jpg ) */Si queremos obtener el path completo de los archivos, podemos utilizar la función realpath() para los valores retornados.
$files = glob('../images/a*.jpg'); // applies the function to each array element $files = array_map('realpath',$files); print_r($files); /* output looks like: Array ( [0] => C:wampwwwimagesapple.jpg [1] => C:wampwwwimagesart.jpg ) */3.- Información de la memoria utilizada Php nos ofrece funciones para poder controlar el tamaño de memoria utilizada por nuestros scripts. Para obtener el uso de la memoria actual, se puede utilizar la función memory_get_usage (), y para obtener la mayor cantidad de memoria utilizada en cualquier momento, podemos utilizar la función memory_get_usage ().
echo "Initial: ".memory_get_usage()." bytes n"; /* prints Initial: 361400 bytes */ // let's use up some memory for ($i = 0; $i < 100000; $i++) { $array []= md5($i); } // let's remove half of the array for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo "Final: ".memory_get_usage()." bytes n"; /* prints Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes n"; /* prints Peak: 13687072 bytes */4.- Información de uso de la CPU Para ver esta información podemos hacer uso de la función getrusage(), aunque no está disponible bajo plataformas Windows. La información que nos daría sería la siguiente. print_r(getrusage()); /* prints Array ( [ru_oublock] => 0 [ru_inblock] => 0 [ru_msgsnd] => 2 [ru_msgrcv] => 3 [ru_maxrss] => 12692 [ru_ixrss] => 764 [ru_idrss] => 3864 [ru_minflt] => 94 [ru_majflt] => 0 [ru_nsignals] => 1 [ru_nvcsw] => 67 [ru_nivcsw] => 4 [ru_nswap] => 0 [ru_utime.tv_usec] => 0 [ru_utime.tv_sec] => 0 [ru_stime.tv_usec] => 6269 [ru_stime.tv_sec] => 0 ) */ Veamos ahora lo que significa cada una de las cosas que nos muestra.
- ru_oublock: Operaciones de bloque de salida
- ru_inblock: Operaciones de bloque de entrada
- ru_msgsnd: Mensajes enviados
- ru_msgrcv: Mensajes recibidos
- ru_maxrss: Establecer el tamaño máximo de residentes.
- ru_ixrss: Tamaño de memoria compartida
- ru_idrss: Tamaño de datos compartidos.
- ru_minflt: Páginas reclamadas
- ru_majflt: Fallos de páginas
- ru_nsignals: Señales recibidas
- ru_nvcsw: Intercambio de contexto voluntario
- ru_nivcsw: Intercambio de contexto involuntario
- ru_nswap: swaps
- ru_utime.tv_usec: Tiempo utilizado por el usuario (microsegundos)
- ru_utime.tv_sec: Tiempo utilizado por el usuario (segundos)
- ru_stime.tv_usec: Tiempo utilizado por el sistema (microsegundos)
- ru_stime.tv_sec: Tiempo utilizado por el sistema (segundos)
// loop 10 million times (busy) for($i=0;$i<10000000;$i++) { } $data = getrusage(); echo "User time: ". ($data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec'] / 1000000); echo "System time: ". ($data['ru_stime.tv_sec'] + $data['ru_stime.tv_usec'] / 1000000); /* prints User time: 1.424592 System time: 0.004204 */5.- Constantes mágicas PHP ofrece una serie de constantes que nos ayuda a conseguir ciertos valores de forma sencilla como pueden ser:
- Número de línea (__LINE__)
- El path del fichero (__FILE__)
- El path del directorio (__DIR__)
- El nombre de la función (__FUNCTION__)
- Nombre de la clase (__CLASS__)
- Nombre del método (__METHOD__)
- Espacio de nombres (__NAMESPACE__)
// some code // ... my_debug("some debug message", __LINE__); /* prints Line 4: some debug message */ // some more code // ... my_debug("another debug message", __LINE__); /* prints Line 11: another debug message */ function my_debug($msg, $line) { echo "Line $line: $msgn"; }6.- Generar ID's únicos Hay situaciones en las que necesitamos generar un único id. Para ello PHP nos ofrece la función uniqid(), con lo que nos aseguramos de que sea único. Veamos un ejemplo:
// generate unique string echo uniqid(); /* prints 4bd67c947233e */ // generate another unique string echo uniqid(); /* prints 4bd67c9472340 */ Si nos fijamos, el principio de cada cadena es el mismo, ya que esto viene relacionado por la hora del servidor. Al id también se le puede hacer que se le añada un prefijo y/o una intropía para que sea aún más único el id. // with prefix echo uniqid('foo_'); /* prints foo_4bd67d6cd8b8f */ // with more entropy echo uniqid('',true); /* prints 4bd67d6cd8b926.12135106 */ // both echo uniqid('bar_',true); /* prints bar_4bd67da367b650.43684647 */7.- Serialización Si alguna vez tienes que almacenar en base de datos una array u objeto, se puede hacer de forma sencilla con el método serialize() de PHP, que convierte esas variables en cadenas de texto. Luego para deshacer los cambios, se utilizaría el método unserialize().
// a complex array $myvar = array( 'hello', 42, array(1,'two'), 'apple' ); // convert to a string $string = serialize($myvar); echo $string; /* prints a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";} */ // you can reproduce the original variable $newvar = unserialize($string); print_r($newvar); /* prints Array ( [0] => hello [1] => 42 [2] => Array ( [0] => 1 [1] => two ) [3] => apple ) */Esta era la forma nativa que tenía PHP para serializar, pero con la llegada de JSON, han añadido soporte para esto desde la versión 5.2. Ahora también podemos utilizar las funciones json_encode() y json_decode().
// a complex array $myvar = array( 'hello', 42, array(1,'two'), 'apple' ); // convert to a string $string = json_encode($myvar); echo $string; /* prints ["hello",42,[1,"two"],"apple"] */ // you can reproduce the original variable $newvar = json_decode($string); print_r($newvar); /* prints Array ( [0] => hello [1] => 42 [2] => Array ( [0] => 1 [1] => two ) [3] => apple ) */Esta segunda opción es mejor, ya que los datos son más compactos y compatibles con JavaScript. 8.- Compresión de cadenas Cuando hablamos de compresión, siempre nos viene a la cabeza archivos comprimidos en zip o en cualquier otro formato, pero PHP permite la compresión de cadenas largas por medio de los métodos gzcompress() y gzuncompress().
$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci, non ultricies elit lacus quis ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. Praesent ipsum diam, consectetur vitae ornare a, aliquam a nunc. In id magna pellentesque tellus posuere adipiscing. Sed non mi metus, at lacinia augue. Sed magna nisi, ornare in mollis in, mollis sed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eu nulla bibendum id euismod urna sodales. "; $compressed = gzcompress($string); echo "Original size: ". strlen($string)."n"; /* prints Original size: 800 */ echo "Compressed size: ". strlen($compressed)."n"; /* prints Compressed size: 418 */ // getting it back $original = gzuncompress($compressed);9.- Registro de función de desconexión Hay una función llamada register_shutdown_function (), que le permitirá ejecutar algunos código justo antes de que termine de ejecutar secuencias de comandos. Sea cual sea el motivo del cese de ejecución del script, lo que haya dentro de esa función se ejecutará.
$start_time = microtime(true); register_shutdown_function('my_shutdown'); // do some stuff // ... function my_shutdown() { global $start_time; echo "execution took: ". (microtime(true) - $start_time). " seconds."; }
0 comentarios:
Publicar un comentario