{"id":230272,"date":"2022-12-02T16:32:00","date_gmt":"2022-12-02T13:32:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230272"},"modified":"2022-11-09T20:53:17","modified_gmt":"2022-11-09T17:53:17","slug":"uso-de-tipos-de-devolucion-anulables-en-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/uso-de-tipos-de-devolucion-anulables-en-php\/","title":{"rendered":"Uso de tipos de devoluci\u00f3n anulables en PHP"},"content":{"rendered":"\n<p>\u00abUna de las caracter\u00edsticas m\u00e1s agradables que ofrece PHP es la sugerencia de tipo espec\u00edficamente para aquellos que provienen de una experiencia en programaci\u00f3n orientada a objetos.<\/p>\n<p>Del <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 de PHP<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Las declaraciones de tipo permiten que las funciones requieran que los par\u00e1metros sean de cierto tipo en el momento de la llamada. Si el valor dado es del tipo incorrecto, se genera un error: en PHP 5, este ser\u00e1 un error fatal recuperable, mientras que PHP 7 arrojar\u00e1 una excepci\u00f3n <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>La raz\u00f3n por la que esto es importante es porque les brinda a las personas que van a usar su c\u00f3digo, espec\u00edficamente a aquellos que escribir\u00e1n c\u00f3digo contra su c\u00f3digo, qu\u00e9 tipos de par\u00e1metros aceptar\u00e1 un determinado constructor o funci\u00f3n.<\/p>\n<p>Pero hay m\u00e1s que eso porque las sugerencias de tipo tambi\u00e9n son aplicables al tipo de datos que puede devolver una funci\u00f3n.<\/p>\n<h2>Tipos de devoluci\u00f3n anulables<\/h2>\n<p>Para empezar, digamos que tiene una funci\u00f3n que se supone que devuelve un objeto de alg\u00fan tipo. En este ejemplo, digamos que tenemos un <code>Post<\/code>y la publicaci\u00f3n est\u00e1 representada por un modelo. Naturalmente, el modelo ser\u00e1 de tipo post, por lo que la firma de la clase se ver\u00e1 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/abfec39e0a65e272d7856d88a7ae2fd7#file-00-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed<\/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>Ahora supongamos que tiene una clase secundaria que devolver\u00e1 una instancia de la publicaci\u00f3n. Al usar una sugerencia de tipo para la funci\u00f3n, la firma se ver\u00eda <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/abfec39e0a65e272d7856d88a7ae2fd7#file-01-postmanager-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed:<\/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>La cuesti\u00f3n es que el m\u00e9todo puede devolver una publicaci\u00f3n o puede devolver <code>null<\/code>si el modelo nunca fue instanciado, pasado a una clase determinada o simplemente no existe por alg\u00fan motivo, entonces debemos tenerlo en cuenta.<\/p>\n<p>Caso en cuesti\u00f3n: si ha trabajado en profundidad en WordPress durante un per\u00edodo de tiempo prolongado, entonces sabe que las funciones pueden devolver varias cosas (como una instancia de <code>WP_Error<\/code>o una matriz). Pero en el caso m\u00e1s puro orientado a objetos del que hablo anteriormente, estamos viendo una funci\u00f3n que puede devolver <code>null<\/code>o puede devolver una instancia de <code>Post<\/code>.<\/p>\n<p>Y para indicar esto, puede configurar <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/abfec39e0a65e272d7856d88a7ae2fd7#file-02-postmanager-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el m\u00e9todo de esta manera:<\/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>En resumen, agregar el signo de interrogaci\u00f3n simple antes del tipo de objeto dice &quot;Este m\u00e9todo puede devolver un valor nulo o una instancia de <code>Post<\/code>&quot;.<\/p>\n<p>O, m\u00e1s espec\u00edficamente del manual de PHP:<\/p>\n<blockquote>\n<p>Las declaraciones de tipo para par\u00e1metros y valores devueltos ahora se pueden marcar como anulables al anteponer el nombre del tipo con un signo de interrogaci\u00f3n. Esto significa que, adem\u00e1s del tipo especificado, <strong><code>NULL<\/code><\/strong>se puede pasar como argumento o devolver como valor, respectivamente.<\/p>\n<\/blockquote>\n<p>Entonces, s\u00ed, esta es una publicaci\u00f3n un poco larga para explicar un concepto directo. Pero encuentro que usar ejemplos concretos a menudo es m\u00e1s \u00fatil que simplemente hablar de ello en abstracto.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Las sugerencias de tipo tambi\u00e9n se aplican al tipo de datos que una funci\u00f3n puede devolver, incluidos los tipos de devoluci\u00f3n que aceptan valores NULL.<\/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":[716,914,800,840],"tags":[1172],"class_list":["post-230272","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollador","category-otro","category-php-2","category-tutoriales","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=230272"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230272\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/163336"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}