{"id":230668,"date":"2022-12-02T16:37:00","date_gmt":"2022-12-02T13:37:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230668"},"modified":"2022-11-09T23:27:00","modified_gmt":"2022-11-09T20:27:00","slug":"usando-tipos-de-retorno-anulaveis-em-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/usando-tipos-de-retorno-anulaveis-em-php\/","title":{"rendered":"Usando tipos de retorno anul\u00e1veis \u200b\u200bem PHP"},"content":{"rendered":"\n<p>&#8220;Um dos recursos mais interessantes que o PHP oferece \u00e9 a dica de tipo especificamente para aqueles que v\u00eam de um background de programa\u00e7\u00e3o orientada a objetos.<\/p>\n<p>Do <strong><a href=\"https:\/\/secure.php.net\/manual\/en\/functions.arguments.php#functions.arguments.type-declaration\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">manual do PHP<\/a><\/strong> :<\/p>\n<blockquote>\n<p>As declara\u00e7\u00f5es de tipo permitem que as fun\u00e7\u00f5es exijam que os par\u00e2metros sejam de um determinado tipo no momento da chamada. Se o valor fornecido for do tipo incorreto, um erro ser\u00e1 gerado: no PHP 5, este ser\u00e1 um erro fatal recuper\u00e1vel, enquanto o PHP 7 lan\u00e7ar\u00e1 uma exce\u00e7\u00e3o <a href=\"https:\/\/php.net\/manual\/en\/class.typeerror.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">TypeError<\/a>.<\/p>\n<\/blockquote>\n<p>A raz\u00e3o pela qual isso \u00e9 importante \u00e9 porque d\u00e1 \u00e0s pessoas que v\u00e3o usar seu c\u00f3digo \u2013 especificamente aquelas que escrever\u00e3o c\u00f3digo em seu c\u00f3digo \u2013 que tipos de par\u00e2metros um determinado construtor ou fun\u00e7\u00e3o aceitar\u00e1.<\/p>\n<p>Mas h\u00e1 mais do que isso porque as dicas de tipo tamb\u00e9m s\u00e3o aplic\u00e1veis \u200b\u200bao tipo de dados que uma fun\u00e7\u00e3o pode retornar.<\/p>\n<h2>Tipos de retorno anul\u00e1veis<\/h2>\n<p>Para come\u00e7ar, digamos que voc\u00ea tenha uma fun\u00e7\u00e3o que deve retornar algum tipo de objeto. Neste exemplo, digamos que temos um <code>Post<\/code>e o post \u00e9 representado por um modelo. Naturalmente, o modelo ser\u00e1 do tipo post, ent\u00e3o a assinatura da classe ficar\u00e1 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/abfec39e0a65e272d7856d88a7ae2fd7#file-00-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\nnamespace Acme;\n\nclass Post {\n  \/\/ Attributes, Constructor, and Functions here.\n}\n<\/code><\/pre>\n<p>Agora, digamos que voc\u00ea tenha uma classe secund\u00e1ria que retornar\u00e1 uma inst\u00e2ncia do post. Ao usar uma dica de tipo para a fun\u00e7\u00e3o, a assinatura ficaria <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/abfec39e0a65e272d7856d88a7ae2fd7#file-01-postmanager-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace Acme;\n\nclass PostManager {\n\n  private $post;\n\n  \/\/ Constructor and other Functions here.\n\n  public function getPost(): Post\n  {\n    return $this-&gt;post;\n  }\n\n}\n<\/code><\/pre>\n<p>O problema \u00e9 que o m\u00e9todo pode retornar um post ou pode retornar <code>null<\/code>se o modelo nunca foi instanciado, passado para uma determinada classe ou simplesmente n\u00e3o existe por algum motivo, ent\u00e3o precisamos levar em conta isso.<\/p>\n<p>Caso em quest\u00e3o: Se voc\u00ea trabalhou no WordPress em profundidade por algum tempo, ent\u00e3o voc\u00ea sabe que as fun\u00e7\u00f5es podem retornar v\u00e1rias coisas (como uma inst\u00e2ncia <code>WP_Error<\/code>ou uma matriz). Mas no caso orientado a objetos mais puro do qual estou falando acima, estamos olhando para uma fun\u00e7\u00e3o que pode retornar <code>null<\/code>ou pode retornar uma inst\u00e2ncia de <code>Post<\/code>.<\/p>\n<p>E para indicar isso, voc\u00ea pode configurar <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/abfec39e0a65e272d7856d88a7ae2fd7#file-02-postmanager-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o m\u00e9todo assim:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace Acme;\n\nclass PostManager {\n\n  private $post;\n\n  \/\/ Constructor and other Functions here.\n\n  public function getPost(): ?Post\n  {\n    if ($this-&gt;post === null) {\n      return null;\n    }\n\n    return $this-&gt;post;\n  }\n}\n<\/code><\/pre>\n<p>Em resumo, adicionar o simples ponto de interroga\u00e7\u00e3o antes do tipo de objeto diz &quot;Este m\u00e9todo pode retornar nulo ou uma inst\u00e2ncia de <code>Post<\/code>.&quot;<\/p>\n<p>Ou, mais especificamente do manual do PHP:<\/p>\n<blockquote>\n<p>As declara\u00e7\u00f5es de tipo para par\u00e2metros e valores de retorno agora podem ser marcadas como anul\u00e1veis \u200b\u200bprefixando o nome do tipo com um ponto de interroga\u00e7\u00e3o. Isso significa que, assim como o tipo especificado, <strong><code>NULL<\/code><\/strong>pode ser passado como argumento ou retornado como valor, respectivamente.<\/p>\n<\/blockquote>\n<p>Ent\u00e3o, sim, este \u00e9 um post um pouco longo para explicar um conceito direto. Mas acho que usar exemplos concretos geralmente \u00e9 mais \u00fatil do que simplesmente falar sobre isso de forma abstrata.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>As dicas de tipo tamb\u00e9m s\u00e3o aplic\u00e1veis \u200b\u200bao tipo de dados que uma fun\u00e7\u00e3o pode retornar, incluindo tipos de retorno anul\u00e1veis.<\/p>\n","protected":false},"author":1,"featured_media":163336,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[722,920,806,846],"tags":[1170],"class_list":["post-230668","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvedor","category-outro","category-php-8","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230668","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=230668"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230668\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/163336"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230668"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230668"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230668"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}