{"id":73,"date":"2013-10-10T14:45:48","date_gmt":"2013-10-10T19:45:48","guid":{"rendered":"http:\/\/drmad.org\/blog\/?p=73"},"modified":"2017-07-20T15:25:53","modified_gmt":"2017-07-20T20:25:53","slug":"10-cosas-que-probablemente-no-sabias-de-php","status":"publish","type":"post","link":"https:\/\/drmad.org\/blog\/10-cosas-que-probablemente-no-sabias-de-php.html","title":{"rendered":"10 cosas que probablemente no sab\u00edas de PHP"},"content":{"rendered":"<p>Hace un a\u00f1o empec\u00e9 a buscar alternativas para desarrollar web, ya que el <a href=\"http:\/\/php.net\/\">PHP<\/a> que habia estado usando por a\u00f1os se qued\u00f3 atorado en el pasado\u2026 estuve revisando bastante\u00a0<a href=\"http:\/\/djangoproject.com\/\">Django<\/a> y <a href=\"http:\/\/rubyonrails.org\/\">Rails<\/a>, que son excelentes frameworks, en modernos lenguajes.<\/p>\n<p>Entonces fui invitado a ense\u00f1ar PHP en un instituto local, lo que me oblig\u00f3 a releer su documentaci\u00f3n (te das cuenta lo poco que sabes de algo, cuando lo ense\u00f1as\u2026). Y me di con la sorpresa que desde la versi\u00f3n 5.4, PHP est\u00e1 <em>menos feo\u00a0<\/em>\ud83d\ude42\u00a0Y desde entonces han estado a\u00f1adiendo caracter\u00edsticas interesantes, aunque no lo ponen a la par con los otros lenguajes, al menos ahora no est\u00e1 tan atrasado como en versiones pasadas.<\/p>\n<p>Pero veo que muchos no se han percatado de algunos cambios. As\u00ed aqu\u00ed presento mi top-ten de las cosas de PHP que probablemente no sab\u00edas que exist\u00edan:<\/p>\n<h3>El tag de cerrar el c\u00f3digo PHP es innecesario<\/h3>\n<p>Si tu fichero <tt>.php<\/tt> tiene puro c\u00f3digo PHP, <em>es mejor no colocar el tag ?&gt;<\/em> al final. Esto evita que se introduzcan l\u00edneas en blanco en el HTML, que lo personal me ha dado varios dolores de cabeza cuando uso la funci\u00f3n <code>header()<\/code>, por ejemplo.<\/p>\n<h3>Variables y funciones en castellano<\/h3>\n<p>PHP soporta los caracteres ASCII extendidos para los nombres de variables y funciones. Esto es medio limitante para otros idiomas, pero para el espa\u00f1ol es suficiente, ya que incluye todas las vocales acentuadas, la e\u00f1e, y la cedilla, en may\u00fasculas y min\u00fasculas.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">&lt;?php\r\nfunction a\u00f1adir_acci\u00f3n($acci\u00f3n) {\r\n    return \"Acci\u00f3n $acci\u00f3n a\u00f1adida\";\r\n}\r\n\r\n$A\u00d1O = 1991;\r\necho \"A\u00f1o $A\u00d1O: \" . a\u00f1adir_acci\u00f3n('correr') . PHP_EOL;<\/pre>\n<h3>Tag corto para plantillas ( &gt;= 5.4 )<\/h3>\n<p>Para imprimir una variable dentro de un HTML, puedes usar el tag <code>&lt;?=...<\/code> como reemplazo al <code>&lt;?php echo ...<\/code>, que hace tu HTML un poco m\u00e1s limpio, y ya no requerir\u00e1s usar alg\u00fan motor de plantillas.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">&lt;h1&gt;Informaci\u00f3n de usuario &lt;?=$usuario?&gt;&lt;\/h1&gt;\r\n&lt;p&gt;Nombre completo: &lt;?=$nombre_completo?&gt;&lt;\/p&gt;<\/pre>\n<p>Antes de la versi\u00f3n 5.4, esta versi\u00f3n del tag estaba unido al \u201ctag corto\u201d que cay\u00f3 en desuso, por lo que por defecto estaba desactivada.<\/p>\n<h3>include() y require() pueden devolver un valor<\/h3>\n<p>Esto tambi\u00e9n aplica para <code>include_once()<\/code> y <code>require_once()<\/code>. El c\u00f3digo incluido puede retornar un valor (o finalizar anticipadamente su ejecuci\u00f3n) usando la sentencia <code>return<\/code>. Me parece \u00fatil para ficheros de configuraci\u00f3n. E.g. este fichero llamado\u00a0<tt>configuracion.php<\/tt><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">&lt;?php return [\r\n    'base_datos' =&gt; [\r\n        'tipo' =&gt; 'mysql',\r\n        'usuario' =&gt; 'root',\r\n        'contrase\u00f1a' =&gt; 'pikachu123',\r\n        'basedatos' =&gt; 'historias',\r\n    ],\r\n];<\/pre>\n<p>Y luego, en otro fichero:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">&lt;?php\r\n    $configuraci\u00f3n = include 'configuracion.php';<\/pre>\n<h3>Forma alterna de estructuras de control para plantillas<\/h3>\n<p>Las estructuras de control <code>if<\/code>, <code>while<\/code>, <code>for<\/code>, <code>foreach<\/code>, y <code>switch<\/code> tienen una sintaxis alternativa, que puede ser \u00fatil al momento de hacer plantillas HTML: El bloque se inicia con un \u201c:\u201d, y se acaba con <code>endif<\/code>, <code>endwhile<\/code>, <code>endfor<\/code>, <code>endforeach<\/code>, y <code>endswitch<\/code>, respectivamente. Confunde menos que las llaves cuando se mezcla con HTML.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">&lt;table&gt;\r\n&lt;?php foreach ($datos as $d): ?&gt;\r\n&lt;tr&gt;\r\n&lt;td&gt;&lt;?=$d['nombres']?&gt;&lt;\/td&gt;\r\n&lt;td&gt;&lt;?=$d['apellidos']?&gt;&lt;\/td&gt;\r\n&lt;\/tr&gt;\r\n&lt;?php endforeach ?&gt;\r\n&lt;\/table&gt;<\/pre>\n<h3>\u00a0Arrays con corchetes ( &gt;= 5.4 )<\/h3>\n<p>Esto fue lo primero que me llam\u00f3 la atenci\u00f3n. Adi\u00f3s a la horrible funci\u00f3n <code>array()<\/code> para crearlos, que se ve horrible al crear arrays anidados. Ahora los arrays se ven elegantes, como en otros lenguajes:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">$a = [1, 2, 3];\r\n<\/pre>\n<p>Cabe acotar que puedes acceder los elementos de array usando corchetes, y <em>tambi\u00e9n usando llaves<\/em>. Asi que para imprimir el 2do elemento, puedes hacer un <code>echo $a{1};<\/code> , y es v\u00e1lido.<\/p>\n<h3><em>Desreferenciaci\u00f3n<\/em> de arrays y strings retornados desde funciones ( &gt;= 5.4 )<\/h3>\n<p>Bonita palabra, \u201cdesreferenciaci\u00f3n\u201d \ud83d\ude1b\u00a0Ahora puedes acceder directo a los elementos de un array (o a los caracteres de un string) directo desde la llamada de la funci\u00f3n. E.g.:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">&lt;?php\r\n\r\nfunction retorna_array () {\r\n    return ['pera', 'manzana', 'pl\u00e1tano'];\r\n}\r\n\r\nfunction retorna_string () {\r\n    return 'parangaricutirimicuaro';\r\n}\r\n\r\necho retorna_array()[2] . PHP_EOL; \/\/ Imprime 'platano'\r\necho retorna_string()[10] . PHP_EOL; \/\/ Imprime 'u'<\/pre>\n<p>Antes de esto, ten\u00edas que guardar en una variable el resultado de la funci\u00f3n, para acceder a sus elementos.<\/p>\n<p>Como bonus, a partir de la versi\u00f3n 5.5, puedes tambi\u00e9n desreferenciar arrays y strings literales, aunque aun no le encuentro una utilidad. E.g.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">&lt;?php\r\n\/\/ Imprime 'llorones'\r\necho ['papanatas', 'llorones', 'baratijas', 'pellizco'][1];\r\n<\/pre>\n<h3>Encadenamiento de m\u00e9todos ( &gt;= 5.0 )<\/h3>\n<p>Esto tambi\u00e9n era uno de los atrasos de PHP, los objetos eran devuelto como valor, y no como referencia. Ahora si son referencias, por lo que puedes retornar el mismo objeto desde un m\u00e9todo, y hacer cosas guapas como:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">$usuarios = users::find()\r\n   -&gt; where(['admin' =&gt; True])\r\n   -&gt; order('name')\r\n   -&gt; limit(10)\r\n   -&gt; getarray('login', 'name');\r\n<\/pre>\n<p>Es una sola instrucci\u00f3n, dividida en varias l\u00edneas por legibilidad. Cada m\u00e9todo no est\u00e1tico (excepto el \u00faltimo) tiene un <code>return $this;<\/code> al final. Este snippet de c\u00f3digo es parte de mi framework M3, que ya lo estar\u00e9 comentando despu\u00e9s \ud83d\ude09<\/p>\n<h3><em>Namespaces<\/em> ( &gt;= 5.3)<\/h3>\n<p>Los <em>namespaces<\/em> son una forma de agrupar constantes, funciones y clases bajo un nombre. Es una forma medio elegante de crear una librer\u00edas: En vez de tener una funci\u00f3n como\u00a0<code>mensajes_error()<\/code>, puedes tener en un fichero, digamos,\u00a0<code>mensajes.php<\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">&lt;?php\r\n\r\nnamespace mensajes;\r\n\r\nfunction error( $msg ) {\r\n    echo \"ERROR: $msg\" . PHP_EOL;\r\n}<\/pre>\n<p>Y luego, en otro fichero,\u00a0incluyes la librer\u00eda:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">&lt;?php\r\n\r\nrequire 'mensajes.php';\r\n\r\nmensajes\\error ( 'Todo ha fallado!' );<\/pre>\n<p>&nbsp;<\/p>\n<h3>Iteraci\u00f3n de resultado de una consulta en MySQLi ( &gt;= 5.4 )<\/h3>\n<p>En vez de hace un <code>while ($data = $result -&gt; fetch_assoc())<\/code>, puedes iterar el resultado con un <code>foreach<\/code>, como si se tratara de un array. Se ve un poco m\u00e1s elegante:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">&lt;?php\r\n\r\n$db = new MySQLi('localhost', 'root', '', 'mibasededatos');\r\n\r\n$result = $db -&gt; query ( 'SELECT * FROM clientes' );\r\n\r\nforeach ( $result as $r ) {\r\n    echo $r['nombres'] . PHP_EOL;\r\n}\r\n<\/pre>\n<div class=\"entry-content\">\n<p><strong>\u00bfFalt\u00f3 algo nuevo de PHP? \u00a1H\u00e1zmelo saber en los comentarios!<\/strong><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Hace un a\u00f1o empec\u00e9 a buscar alternativas para desarrollar web, ya que el PHP que habia estado usando por a\u00f1os<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[8],"tags":[],"class_list":["post-73","post","type-post","status-publish","format-standard","hentry","category-php7"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6p3z1-1b","jetpack-related-posts":[],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts\/73","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/comments?post=73"}],"version-history":[{"count":6,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts\/73\/revisions"}],"predecessor-version":[{"id":232,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts\/73\/revisions\/232"}],"wp:attachment":[{"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/media?parent=73"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/categories?post=73"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/tags?post=73"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}