{"id":729,"date":"2016-06-16T16:08:30","date_gmt":"2016-06-16T19:08:30","guid":{"rendered":"https:\/\/blog.umbler.com\/?p=729"},"modified":"2018-12-06T10:38:36","modified_gmt":"2018-12-06T12:38:36","slug":"php-7-mudancas-programacao-orientada-a-objetos","status":"publish","type":"post","link":"https:\/\/blog.umbler.com\/br\/php-7-mudancas-programacao-orientada-a-objetos\/","title":{"rendered":"#6 PHP 7 &#8211; Mudan\u00e7as relacionadas a Programa\u00e7\u00e3o Orientada a Objetos"},"content":{"rendered":"<p>O PHP 5 e seus sucessores trouxeram v\u00e1rias altera\u00e7\u00f5es sobre o mode do objetos, j\u00e1 o PHP 7 quase n\u00e3o trouxe novos recursos nesse sentido, mas, mesmo sendo poucos, os que vieram s\u00e3o bastante interessantes.<\/p>\n<h2>Context-Sensitive lexer<\/h2>\n<p>Permite o uso de palavras-chave como nome de propriedades, m\u00e9todos e constantes dentro de classes, interfaces e traits.<br \/>\nIsso quer dizer que o PHP vai ter apenas uma palavra-chave reservada, &#8216;class&#8217;, e somente no contexto de constante da classe.<br \/>\nVeja abaixo a lista de palavras-chave que voc\u00ea poder\u00e1 utilizar como propriedade, fun\u00e7\u00e3o e nomes de constantes:<br \/>\n<code>callable, and, include, function, trait, global, include_once, if, extends, goto, throw, endswitch, implements, instanceof, array, finally, static, insteadof, print, for, abstract, interface, echo, foreach, final, namespace, require, declare, public, new, require_once, case, protected, or, return, do, private, or, else, while, const, try, elseif, as, enddeclare, use, default, catch, endfor, var, break, die, endforeach, exit, continue, self, endif, list, switch, parent, endwhile, clone, yield, class.<\/code><br \/>\nA \u00fanica exce\u00e7\u00e3o \u00e9 n\u00e3o poder usar &#8216;const class&#8217;, pois entra em conflito com o nome da constante m\u00e1gica do PHP 5.5.<\/p>\n<h2>Construtores descontinuados do PHP 4<\/h2>\n<p>Ao inv\u00e9s de remover os construtores do PHP 4 &#8211; que estava sendo pedido por muitos na comunidade &#8211; eles foram marcados como &#8220;deprecated&#8221; <a href=\"https:\/\/blog.umbler.com\/php-7-recursos-obsoletos\/\">(obsoletos)<\/a> no PHP 7.<br \/>\nRemover esses construtores causaria um problema de compatibilidade com c\u00f3digos escritos para aplica\u00e7\u00f5es em vers\u00f5es anteriores do PHP. Caso venham a ser removidos, isso acontecer\u00e1 no PHP 8, o que n\u00e3o vai afetar as aplica\u00e7\u00f5es e desenvolvedores por um bom tempo.<br \/>\nA utiliza\u00e7\u00e3o dos construtores do PHP 4 foi anulada quando os namespaces das classes foram introduzidos no PHP 5.3.<\/p>\n<h2>Declara\u00e7\u00f5es de grupo<\/h2>\n<p>As declara\u00e7\u00f5es de grupo s\u00e3o o resultado de um esfor\u00e7o para reduzir a duplica\u00e7\u00e3o e simplificar o c\u00f3digo escrito.<br \/>\nAs declara\u00e7\u00f5es de grupo permitem remover a duplica\u00e7\u00e3o de prefixos comuns, especificando partes \u00fanicas dentro de um bloco ({}).<br \/>\nVeja nos c\u00f3digos abaixo uma exemplo de como essas declara\u00e7\u00f5es de grupo podem ser utilizadas:<br \/>\nUsando &#8216;group use statements&#8217;<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">\/\/ Original\r\nuse Framework\\Component\\ClassA;\r\nuse Framework\\Component\\ClassB as ClassC;\r\nuse Framework\\OtherComponent\\ClassD;\r\n\/\/ Com group use statements\r\nuse Framework\\{\r\nComponent\\ClassA,\r\nComponent\\ClassB as ClassC,\r\nOtherComponent\\ClassD\r\n};<\/code><\/pre>\n<p>Organiza\u00e7\u00e3o alternativa de &#8216;guse statements&#8217;<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">use Framework\\Component\\{\r\nClassA,\r\nClassB as ClassC\r\n};\r\nUse Framework\\OtherComponent\\ClassD;<\/code><\/pre>\n<p>Veja que em ambos os c\u00f3digos as declara\u00e7\u00f5es repetidas foram sendo agrupadas, de forma a reduzir o conte\u00fado duplicado das declara\u00e7\u00f5es.<br \/>\nSe voc\u00ea quiser importar fun\u00e7\u00f5es ou constantes &#8211; feature que foi adicionada no PHP 5.6 &#8211; voc\u00ea deve simplesmente adicionar o prefixo com a fun\u00e7\u00e3o ou constante. Veja a seguir um exemplo de c\u00f3digo com uso desse recurso:<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">use Framework\\Component\\{\r\nSubComponent\\ClassA,\r\nfunction OtherComponent\\someFunction,\r\nconst OtherComponent\\SOME_CONSTANT\r\n};<\/code><\/pre>\n<p>&nbsp;<\/p>\n<h2>Classe An\u00f4nima<\/h2>\n<p>Classes an\u00f4nimas, proavelmente, s\u00e3o o mais perto que chegaremos de uma sintaxe literal de objetos no PHP.\u00a0Para criar uma classe an\u00f4nima voc\u00ea simplesmente combina a nova classe, seguida de uma defini\u00e7\u00e3o de classe padr\u00e3o.<\/p>\n<p>A classe an\u00f4nima \u00e9 sempre instanciada durante a cria\u00e7\u00e3o, dando-lhe um objeto dessa classe.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">$object = new class(\"bar\") {\r\npublic $foo;\r\npublic function __construct($arg)\r\n{\r\n$this-&gt;foo = $arg;\r\n}\r\n};<\/code><\/pre>\n<p>O c\u00f3digo acima cria um objeto com um m\u00e9todo construtor <code>'__construct()'<\/code>, chamado com o argumento <code>'bar'<\/code> e com a propriedade <code>'$foo'<\/code>, atribuindo o valor do argumento ao construtor.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">object(class@anonymous)#1 (1) {\r\n[\"foo\"]=&gt;\r\nstring(3) \"bar\"\r\n}<\/code><\/pre>\n<p>Classes an\u00f4nimas podem ser namespaced, oferecendo suporte a heran\u00e7a, traits, interfaces, usando a mesma sintaxe de classes regulares.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">namespace MyProject\\Component;\r\n$object = new class ($args) extends Foo implements Bar {\r\nuse Bat;\r\n};<\/code><\/pre>\n<p>&nbsp;<\/p>\n<h2>Nomes de classes an\u00f4nimas<\/h2>\n<p>Pode parecer estranho nomear uma classe an\u00f4nima, afinal, ela \u00e9 an\u00f4nima. O nome de uma classe an\u00f4nima \u00e9 baseado no endere\u00e7o de mem\u00f3ria da opera\u00e7\u00e3o que a criou, por exemplo:<\/p>\n<p>class@0x7fa77f271bd0<\/p>\n<p>Imagina que estivesse criando classes an\u00f4nimas dentro de um loop, a classe teria o mesmo endere\u00e7o de mem\u00f3ria de cada itera\u00e7\u00e3o desse loop, o que faria com que somente uma classe fosse definida.<\/p>\n<p>Isso sognifica que se o objeto resultante de duas itera\u00e7\u00f5es t\u00eam o mesmo valor de propriedades, elas ser\u00e3o iguais (<code>==<\/code> mas n\u00e3o id\u00eanticas <code>===<\/code>).<\/p>\n<p>No entanto, mesmo se voc\u00ea definir outra classe an\u00f4nima com a mesma estrutura, em outro lugar do c\u00f3digo, ela ter\u00e1 um nome diferente com base em seu endere\u00e7o de mem\u00f3ria, e ent\u00e3o n\u00e3o ser\u00e1 igual.<\/p>\n<p>Veja no c\u00f3digo abaixo a ilustra\u00e7\u00e3o do que foi falado acima.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">$objects = [];\r\nforeach ([\"foo\", \"foo\", \"bar\"] as $value) {\r\n$objects[] = new class($value) {\r\npublic $value;\r\npublic function __construct($value)\r\n{\r\n$this-&gt;value = $value;\r\n}\r\n};\r\n}\r\n$objects[] = new class(\"foo\") {\r\npublic $value;\r\npublic function __construct($value)\r\n{\r\n$this-&gt;value = $value;\r\n}\r\n};<\/code><\/pre>\n<p>No c\u00f3digo acima foram criadas 3 inst\u00e2ncias de uma classe an\u00f4nima dentro do loop foreach. Os dois primeiros s\u00e3o passados como &#8216;foo&#8217; ao construtor, e o terceiro \u00e9 passado como &#8216;bar&#8217;. Fora do loop foi criada uma quarta classe an\u00f4nima, com a mesma defini\u00e7\u00e3o, e novamente foi passado &#8216;foo&#8217; para o construtor.<\/p>\n<p>Devido a isso, os 2 primeiros objetos &#8211; <code>$objects[0]<\/code> e <code>$objects[1]<\/code> respectivamente &#8211; s\u00e3o iguais mas n\u00e3o id\u00eanticos. No entanto, nenhum desses 2 objetos \u00e9 igual ao terceiro &#8211; <code>$objects[2]<\/code> e tamb\u00e9m n\u00e3o ser\u00e3o iguais ao quarto &#8211; <code>$objects[3]<\/code> &#8211; j\u00e1 que esse foi definido fora do loop, e apesar de ter estrutura e valor id\u00eanticos, \u00e9 uma classe diferente, com um nome diferente, pois est\u00e1 alocado em outro endere\u00e7o de mem\u00f3ria.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Enquanto o foco do PHP 7 n\u00e3o \u00e9 de alterar muito o modelo de dados, as altera\u00e7\u00f5es adicionadas s\u00e3o substanciais, classes an\u00f4nimas abre uma s\u00e9rie de novas possiblidades de arquitetura. Essas mudan\u00e7as tornar\u00e3o o c\u00f3digo orientado a objeto mais robusto e f\u00e1cil de ser escrito.<\/p>\n<p>Confira outros posts da s\u00e9rie PHP 7 da Umbler:<\/p>\n<ul>\n<li>#1 <a href=\"https:\/\/blog.umbler.com\/php-7-mudancas-na-linguagem\/\" target=\"_blank\" rel=\"noopener\"> Mudan\u00e7as b\u00e1sicas na Linguagem <\/a><\/li>\n<li>#2 <a href=\"https:\/\/blog.umbler.com\/php-7-recursos-obsoletos\/\" target=\"_blank\" rel=\"noopener\"> Recursos Obsoletos<\/a><\/li>\n<li>#3 <a href=\"https:\/\/blog.umbler.com\/sintaxe-uniforme-de-variaveis-no-php-7\/\" target=\"_blank\" rel=\"noopener\"> Sintaxe Uniforme de Vari\u00e1veis<\/a><\/li>\n<li>#4 <a href=\"https:\/\/blog.umbler.com\/php-7-type-hints\/\" target=\"_blank\" rel=\"noopener\"> PHP 7: Type Hints <\/a><\/li>\n<li>#5 <a href=\"https:\/\/blog.umbler.com\/br\/php-7-error-handling-assertions-expectations\"> PHP 7: Error Handling, Assertions e Expectations<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>O PHP 5 e seus sucessores trouxeram v\u00e1rias altera\u00e7\u00f5es sobre o mode do objetos, j\u00e1 o PHP 7 quase n\u00e3o trouxe novos recursos nesse sentido, mas, mesmo sendo poucos, os que vieram s\u00e3o bastante interessantes. Context-Sensitive lexer Permite o uso de palavras-chave como nome de propriedades, m\u00e9todos e constantes dentro de classes, interfaces e traits. [&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":[95,96,30,57,97],"class_list":["post-729","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-comunidade","category-dev","tag-mode-objetos","tag-novidades-php","tag-php","tag-php-7","tag-poo"],"_links":{"self":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts\/729"}],"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=729"}],"version-history":[{"count":0,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts\/729\/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=729"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/categories?post=729"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/tags?post=729"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}