{"id":622,"date":"2016-04-15T15:47:40","date_gmt":"2016-04-15T18:47:40","guid":{"rendered":"https:\/\/blog.umbler.com\/?p=622"},"modified":"2018-12-06T11:00:34","modified_gmt":"2018-12-06T13:00:34","slug":"sintaxe-uniforme-de-variaveis-no-php-7","status":"publish","type":"post","link":"https:\/\/blog.umbler.com\/br\/sintaxe-uniforme-de-variaveis-no-php-7\/","title":{"rendered":"#3 PHP 7 &#8211; Sintaxe uniforme de vari\u00e1veis"},"content":{"rendered":"<p>A sintaxe de vari\u00e1veis do PHP \u00e9, de certa forma, inconsistente, particularmente o que diz respeito a vari\u00e1veis-vari\u00e1veis e vari\u00e1veis propriedades.<\/p>\n<p>Por exemplo, veja a sintaxe <code>$objeto-&gt;$array[chave]<\/code>; estamos sempre esperando que primeiro seja resolvido o <code>$array[chave]<\/code> para depois acessar a propriedade do objeto. Com a sintaxe uniforme de vari\u00e1veis, toda essa inconsist\u00eancia foi resolvida.<\/p>\n<p>A partir do PHP 7, todas as vari\u00e1veis passam a ser avaliadas da esquerda para a direita, sendo um &#8220;problema&#8221; somente em caso de vari\u00e1veis din\u00e2micas complexas e propriedades.<br \/>\nVeja no c\u00f3digo a seguir que \u00e9 poss\u00edvel obter o mesmo comportamento do PHP 5.x no PHP 7, ou vice-versa, especificando de forma expl\u00edcita a ordem das opera\u00e7\u00f5es com o uso de par\u00eanteses () e chaves {}.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">\/\/ Sintaxe\r\n$$var['chave']['chave2'];\r\n\/\/ PHP 5.x:\r\n\/\/ Usando um array multidimensional como nome da vari\u00e1vel\r\n${$var['chave']['chave2']};\r\n\/\/ PHP 7:\r\n\/\/ Acesssando um array multidimensional dentro de uma vari\u00e1vel-vari\u00e1vel\r\n($$var)['chave']['chave2'];\r\n\/\/ Sintaxe\r\n$var-&gt;$prop['chave'];\r\n\/\/ PHP 5.x:\r\n\/\/ Usando um array como nome de propriedade\r\n$var-&gt;{$prop['chave']};\r\n\/\/ PHP 7:\r\n\/\/ Acessando um array dentro de uma vari\u00e1vel-propriedade\r\n($var-&gt;$prop)['chave'];\r\n\/\/ Sintaxe\r\n$var-&gt;$prop['chave']();\r\n\/\/ PHP 5.x:\r\n\/\/ Usando um array como nome de um m\u00e9todo\r\n$var-&gt;{$prop['chave']}();\r\n\/\/ PHP 7:\r\n\/\/ Chamando um closure dentro de um array como vari\u00e1vel-propriedade\r\n($var-&gt;$prop)['key']();\r\n\/\/ Sintaxe\r\nClassName::$var['chave']();\r\n\/\/ PHP 5.x:\r\n\/\/ Usando um array como nome de m\u00e9todo est\u00e1tico\r\nClassName::{$var['chave']}();\r\n\/\/ PHP 7:\r\n\/\/ Chamando um closure dentro de um array com vari\u00e1vel est\u00e1tica variable\r\n(ClassName::$var)['chave']();<\/code><\/pre>\n<p>Um dos principais benef\u00edcios da sintaxe uniforme de vari\u00e1veis \u00e9 que ela permite muitas combina\u00e7\u00f5es de sintaxe, e muitas dessas novas combina\u00e7\u00f5es est\u00e3o dispon\u00edveis para uso.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">\/\/ Chama um closure dentro de um array retornando outro closure\r\n$foo()['bar']();\r\n\/\/ Chama uma propriedade referenciando um array literal\r\n[$obj1, $obj2][0]-&gt;prop;\r\n\/\/ Acessa um caracter pelo \u00edndice na string retornada\r\ngetStr(){0};<\/code><\/pre>\n<p>Al\u00e9m disso, o PHP 7 suporta &#8211; em alguns casos &#8211; dois pontos duplos aninhados.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">\/\/ Acessa uma propriedade est\u00e1tica no nome da classe ou objeto dentro de um array\r\n$foo['bar']::$baz;\r\n\/\/ Acessa uma propriedade est\u00e1tica no nome da classe ou objeto dentro de um array retornando para o met\u00f3do est\u00e1tico chamado em um nome de classe ou objeto\r\n$foo::bar()::$baz;\r\n\/\/ Chama um m\u00e9todo est\u00e1tico em uma classe ou objeto retornado por uma chamada de m\u00e9todo\r\n$foo-&gt;bar()::baz();<\/code><\/pre>\n<p>Ainda existe uma s\u00e9rie de casos amb\u00edguos que n\u00e3o podem ser resolvido, mesmo com a nova sintaxe de vari\u00e1veis, e mesmo quando a adi\u00e7\u00e3o de par\u00eanteses e chaves.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">$foo = 'Foo';\r\n$class = 'CLASS';\r\n$constant = 'BAR';\r\necho $foo::$class::$constant;\r\necho $foo::{$class}::$constant;\r\necho $foo::{\"$class\"}::$constant;\r\necho $foo::{\"$class\"}::{\"$constant\"};\r\necho $foo::CLASS::$constant;\r\necho $foo::CLASS::{\"$constant\"};\r\necho $foo::($class)::($constant);<\/code><\/pre>\n<p>Al\u00e9m disso, agora voc\u00ea pode fazer chamadas de m\u00e9todos e fun\u00e7\u00f5es dobrando os par\u00eanteses.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">\/\/ Chama o callback retornado por um m\u00e9todo\r\nfoo()();\r\n\/\/ Chama um callback retornado por um m\u00e9todo instanciado\r\n$foo-&gt;bar()();\r\n\/\/ Chama um callback retornado por um am\u00e9todo est\u00e1tico\r\nFoo::bar()();\r\n\/\/ Chama um callback retornado por outro callback\r\n$foo()();<\/code><\/pre>\n<p>Desde o PHP 5.4 era poss\u00edvel desreferenciar arrays retornados por m\u00e9todos e fun\u00e7\u00f5es, agora com o PHP 7 \u00e9 poss\u00edvel fazer isso com qualquer express\u00e3o v\u00e1lida colocada entre par\u00eanteses.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">\/\/ Acessando a chave de um array\r\n(expression)['foo'];\r\n\/\/ Acessando uma propriedade\r\n(expression)-&gt;foo;\r\n\/\/ Chamando um m\u00e9todo\r\n(expression)-&gt;foo();\r\n\/\/ Acessando uma propriedade est\u00e1tica\r\n(expression)::$foo;\r\n\/\/ Chamando um m\u00e9todo est\u00e1tico\r\n(expression)::foo();\r\n\/\/ Chamando um callback\r\n(expression)();\r\n\/\/ Acessando um caracter\r\n(expression){0};<\/code><\/pre>\n<p>Isso permite, finalmente, chamar um closure quando ele for definido, e chamar um callback dentro da propriedade de um objeto.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">\/\/ Define e chama imediatamente um closure sem atribui\u00e7\u00e3o\r\n(function() { \/* ... *\/ })();\r\n\/\/ Chama um callbacl dentro da propriedade de um objeto\r\n($obj-&gt;callable)();<\/code><\/pre>\n<p>O PHP 7 tamb\u00e9m d\u00e1 a possibilidade de chamar m\u00e9todos usando &#8220;array-notation&#8221;.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">\/\/ Chama um m\u00e9todo est\u00e1tico din\u00e2mico\r\n[\"className\", \"staticMethod\"]();\r\n\/\/ Chama uma m\u00e9todo de inst\u00c2ncia din\u00e2mico\r\n[$object, \"method\"]();\r\n\/\/ Usa uma string escalar como nome de classe\r\n'className'::staticMethod();<\/code><\/pre>\n<p>Uma possibilidade futura da sintaxe de vari\u00e1veis do PHP 7 \u00e9 a perspectiva de trabalho com objetos escalares, ou seja, a capacidade de chamar m\u00e9todos que agem diretamente sobre um valor.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">\/\/ converte os caracteres da string para min\u00fasculo\r\n\"string\"-&gt;toLower();<\/code><\/pre>\n<p>Nesse artigo voc\u00ea viu um pouco sobre a nova sintaxe de vari\u00e1veis do PHP 7, e no pr\u00f3ximo falarei sobre &#8220;Type Hints&#8221;, a caracter\u00edstica excitante do PHP 7.<\/p>\n<p>At\u00e9 o pr\u00f3ximo artigo!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A sintaxe de vari\u00e1veis do PHP \u00e9, de certa forma, inconsistente, particularmente o que diz respeito a vari\u00e1veis-vari\u00e1veis e vari\u00e1veis propriedades. Por exemplo, veja a sintaxe $objeto-&gt;$array[chave]; estamos sempre esperando que primeiro seja resolvido o $array[chave] para depois acessar a propriedade do objeto. Com a sintaxe uniforme de vari\u00e1veis, toda essa inconsist\u00eancia foi resolvida. A [&hellip;]<\/p>\n","protected":false},"author":37,"featured_media":5612,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,23],"tags":[30,57,76,77,78,79],"class_list":["post-622","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-comunidade","category-dev","tag-php","tag-php-7","tag-sintaxe","tag-variaveis","tag-variaveis-objetos","tag-variaveis-variaveis"],"_links":{"self":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts\/622"}],"collection":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/users\/37"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/comments?post=622"}],"version-history":[{"count":0,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts\/622\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/media\/5612"}],"wp:attachment":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/media?parent=622"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/categories?post=622"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/tags?post=622"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}