{"id":36,"date":"2015-09-11T18:17:54","date_gmt":"2015-09-11T23:17:54","guid":{"rendered":"http:\/\/drmad.org\/blog\/?p=36"},"modified":"2020-07-16T23:59:27","modified_gmt":"2020-07-17T04:59:27","slug":"php7-sintaxis-uniforme-de-variables","status":"publish","type":"post","link":"https:\/\/drmad.org\/blog\/php7-sintaxis-uniforme-de-variables.html","title":{"rendered":"PHP7: Sintaxis uniforme de variables"},"content":{"rendered":"\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/php.net\/archive\/2015.php#id2015-09-04-1\">PHP 7 ya casi est\u00e1 aqu\u00ed<\/a>. Su principal cambio, es que debe funcionar, en promedio,&nbsp;<strong>el doble de&nbsp;r\u00e1pido<\/strong> que PHP 5.x sin necesidad de&nbsp;modificar los programas ya hechos. <a href=\"http:\/\/talks.php.net\/oz15#\/6\">Rasmus mostr\u00f3 unos slides en PHP Australia<\/a> con unos benchmarks (con flecha derecha avanza los slides) sobre algunas aplicaciones populares, y su diferencia de velocidad. Y wao&#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta nueva versi\u00f3n tiene un gran cambio que traer\u00e1 problemas con&nbsp;el c\u00f3digo en PHP ya existente, ahora usa una&nbsp;<a href=\"https:\/\/wiki.php.net\/rfc\/uniform_variable_syntax\">nueva sintaxis de variables<\/a>&nbsp;que afecta c\u00f3mo se eval\u00faan las <em>variables variables desreferenciadas.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las <a href=\"http:\/\/php.net\/manual\/es\/language.variables.variable.php\">variables variables<\/a>&nbsp;son una de esas&nbsp;<em>travesuras m\u00e1gicas<\/em>&nbsp;de PHP que algunos&nbsp;lo toman como <a href=\"http:\/\/stackoverflow.com\/questions\/8715937\/is-it-bad-practice-to-use-variable-variables-in-php-in-the-following-fashion\">mala pr\u00e1ctica de programaci\u00f3n<\/a>, &nbsp;aunque te&nbsp;ayuda bastante si los usas con cautela:&nbsp;Una&nbsp;<em>variable variable<\/em> es una forma de acceder a una variable, propiedad, funci\u00f3n, o m\u00e9todo, usando el valor de otra variable.<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\"><p>$nombre = &#8216;oliver&#8217;;<br \/>\n$campo = &#8216;nombre&#8217;;<br \/>\necho $$campo;<\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">El c\u00f3digo de arriba mostrar\u00e1 <tt>oliver<\/tt>.&nbsp;Con el tiempo,&nbsp;la sintaxis de PHP se volvi\u00f3 m\u00e1s compleja, y la forma de evaluar variables variables cuando se desreferencia un array comenz\u00f3 a ser inconsistente. PHP normalmente analiza las expresiones de izquierda a derecha. En el c\u00f3digo:<\/p>\n\n\n<p>$arr[&#8216;el&#8217;] -&gt; prop;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PHP primero buscar la variable array <tt>$arr<\/tt>, luego busca su elemento <tt>'el'<\/tt>, y del objeto resultante accede a su propiedad <tt>prop<\/tt>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PERO en algunas expresiones m\u00e1s complejas como:<\/p>\n\n\n<p>$$arr[&#8216;el&#8217;] ->; prop<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PHP 5.x primero obtendr\u00e1 el valor de $arr, ubicar\u00e1 su elemento &#8216;el&#8217;, y luego buscar\u00e1 una variable con nombre igual a dicho resultado, y de ah\u00ed acceder\u00e1 a su propiedad prop. Empieza a analizar por la mitad, regresa a la izquierda, y luego se va a la derecha. Y hay muchos m\u00e1s casos de inconsistencias de este tipo, incluso con expresiones id\u00e9nticas&nbsp;en contextos distintos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Adi\u00f3s al desorden<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">En PHP7&nbsp;el an\u00e1lisis de las variables ser\u00e1&nbsp;de izquierda a derecha, sin excepciones. <a href=\"https:\/\/twitter.com\/drmad\/status\/641621114498740224\">Ya me top\u00e9 con un problema de estos<\/a>: Este l\u00ednea de c\u00f3digo empez\u00f3 a generar la noticia &#8216;<tt>Array to string conversion<\/tt>&#8216;:<\/p>\n\n\n<p>$res[] = $record -> $params[0];<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quiz\u00e1s haya tenido un poco de sentido com\u00fan esta forma de analizar variables: obtienes la propiedad cuyo nombre se guarda en el \u00edndice 0 del array <tt>$params<\/tt>, del objeto <tt>$record<\/tt>. Pero nuevamente es inconsistente con el an\u00e1lisis izquierda-derecha. PHP7 ahora lo analiza as\u00ed: Obtiene la propiedad guardado en la variable $params del objeto $record, <i>y de \u00e9l obtiene el elemento 0<\/i>. Como <tt>$params<\/tt> es un array, y las variables variables tienen que ser <tt>strings<\/tt>, produce la noticia que mencion\u00e9 arriba.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para lograr el comportamiento que quiero en PHP7, es necesario darle un <i>hint<\/i> al analizador usando llaves, para agrupar los elementos que deben ser analizados juntos:<\/p>\n\n\n<p>$res[] = $record -> {$params[0]};<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este c\u00f3digo tambi\u00e9n es v\u00e1lido en PHP5. Este cambio trae orden al caos, a costas de romper compatibilidad con c\u00f3digo anterior. Pero adem\u00e1s, este cambio prepara al analizador de PHP para poder evaluar expresiones m\u00e1s complejas. Ahora queda a esperar al lanzamiento final, en Octubre \ud83d\ude42<\/p>\n<\/div><\/div>\n<\/div><\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>PHP 7 ya casi est\u00e1 aqu\u00ed. Su principal cambio, es que debe funcionar, en promedio,&nbsp;el doble de&nbsp;r\u00e1pido que PHP 5.x<\/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-36","post","type-post","status-publish","format-standard","hentry","category-php7"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6p3z1-A","jetpack-related-posts":[],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts\/36","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=36"}],"version-history":[{"count":12,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts\/36\/revisions"}],"predecessor-version":[{"id":881,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts\/36\/revisions\/881"}],"wp:attachment":[{"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/media?parent=36"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/categories?post=36"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/tags?post=36"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}