{"id":230686,"date":"2022-12-02T15:57:00","date_gmt":"2022-12-02T12:57:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230686"},"modified":"2022-11-09T23:32:18","modified_gmt":"2022-11-09T20:32:18","slug":"nullable-palautustyyppien-kaeyttaeminen-php-ssae","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/nullable-palautustyyppien-kaeyttaeminen-php-ssae\/","title":{"rendered":"Nullable-palautustyyppien k\u00e4ytt\u00e4minen PHP:ss\u00e4"},"content":{"rendered":"\n<p>&quot;Yksi PHP:n mukavimmista ominaisuuksista on tyyppivihjeet erityisesti niille, jotka tulevat olio-ohjelmointitaustasta.<\/p>\n<p>PHP <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\">k\u00e4sikirjasta<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Tyyppim\u00e4\u00e4ritykset sallivat funktioiden vaatia, ett\u00e4 parametrit ovat tietyn tyyppisi\u00e4 kutsun aikana. Jos annettu arvo on v\u00e4\u00e4r\u00e4\u00e4 tyyppi\u00e4, syntyy virhe: PHP 5:ss\u00e4 t\u00e4m\u00e4 on korjattavissa oleva kohtalokas virhe, kun taas PHP 7 heitt\u00e4\u00e4 <a href=\"https:\/\/php.net\/manual\/en\/class.typeerror.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">TypeError<\/a> &#8211; poikkeuksen.<\/p>\n<\/blockquote>\n<p>T\u00e4m\u00e4 on t\u00e4rke\u00e4 syy, koska se antaa ihmisille, jotka aikovat k\u00e4ytt\u00e4\u00e4 koodiasi \u2013 erityisesti niille, jotka kirjoittavat koodia koodiasi vastaan \u200b\u200b\u2013 mink\u00e4 tyyppisi\u00e4 parametreja tietty konstruktori tai funktio hyv\u00e4ksyy.<\/p>\n<p>Mutta siin\u00e4 on muutakin, koska tyyppivihjeit\u00e4 voidaan soveltaa my\u00f6s tietotyypeihin, jotka funktio voi palauttaa.<\/p>\n<h2>Nollattavat palautustyypit<\/h2>\n<p>Ensinn\u00e4kin, oletetaan, ett\u00e4 sinulla on funktio, jonka on tarkoitus palauttaa jonkinlainen objekti. Oletetaan t\u00e4ss\u00e4 esimerkiss\u00e4, ett\u00e4 meill\u00e4 on a <code>Post<\/code>ja viesti\u00e4 edustaa malli. Luonnollisesti malli on post-tyyppinen, joten luokan allekirjoitus n\u00e4ytt\u00e4\u00e4 suunnilleen <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/abfec39e0a65e272d7856d88a7ae2fd7#file-00-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4<\/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>Oletetaan nyt, ett\u00e4 sinulla on toissijainen luokka, joka palauttaa viestin esiintym\u00e4n. Kun funktiolle k\u00e4ytet\u00e4\u00e4n tyyppivihjett\u00e4, allekirjoitus n\u00e4ytt\u00e4isi t\u00e4lt\u00e4 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/abfec39e0a65e272d7856d88a7ae2fd7#file-01-postmanager-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">:<\/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>Asia on siin\u00e4, ett\u00e4 menetelm\u00e4 voi palauttaa viestin tai se voi palata <code>null<\/code>, jos mallia ei ole koskaan instantoitu, siirretty tiettyyn luokkaan tai sit\u00e4 ei yksinkertaisesti ole jostain syyst\u00e4 olemassa, meid\u00e4n on otettava se huomioon.<\/p>\n<p>Esimerkki: Jos olet ty\u00f6skennellyt WordPressiss\u00e4 perusteellisesti jonkin aikaa, tied\u00e4t, ett\u00e4 funktiot voivat palauttaa useita asioita (kuten esiintym\u00e4n <code>WP_Error<\/code>tai taulukon). Mutta puhtaimmassa oliokeskeisess\u00e4 tapauksessa, josta puhun edell\u00e4, tarkastelemme funktiota, joka voi palauttaa <code>null<\/code>tai saattaa palauttaa esiintym\u00e4n <code>Post<\/code>.<\/p>\n<p>Ja osoittaaksesi t\u00e4m\u00e4n, voit m\u00e4\u00e4ritt\u00e4\u00e4 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/abfec39e0a65e272d7856d88a7ae2fd7#file-02-postmanager-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">menetelm\u00e4n seuraavasti:<\/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>Lyhyesti sanottuna yksinkertaisen kysymysmerkin lis\u00e4\u00e4minen objektityypin eteen sanoo &quot;T\u00e4m\u00e4 menetelm\u00e4 voi palauttaa nollan tai esiintym\u00e4n <code>Post<\/code>.&quot;<\/p>\n<p>Tai tarkemmin PHP-oppaasta:<\/p>\n<blockquote>\n<p>Parametrien ja palautusarvojen tyyppim\u00e4\u00e4ritykset voidaan nyt merkit\u00e4 tyhj\u00e4ksi lis\u00e4\u00e4m\u00e4ll\u00e4 tyypin nimen eteen kysymysmerkki. T\u00e4m\u00e4 tarkoittaa, ett\u00e4 m\u00e4\u00e4ritetyn tyypin lis\u00e4ksi <strong><code>NULL<\/code><\/strong>se voidaan v\u00e4litt\u00e4\u00e4 argumenttina tai palauttaa arvona.<\/p>\n<\/blockquote>\n<p>Joten, joo, t\u00e4m\u00e4 on hieman pitk\u00e4 viesti selvent\u00e4\u00e4ksesi suoraviivaista koneptia. Mutta konkreettisten esimerkkien k\u00e4ytt\u00e4minen on mielest\u00e4ni usein hy\u00f6dyllisemp\u00e4\u00e4 kuin pelkk\u00e4 abstrakti puhuminen.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tyyppivihjeit\u00e4 voidaan soveltaa my\u00f6s tietotyypeille, jotka funktio voi palauttaa, mukaan lukien nollattavat palautustyypit.<\/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":[719,917,843,803],"tags":[1166],"class_list":["post-230686","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-muut","category-opetusohjelmia","category-php-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230686","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230686"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230686\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/163336"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230686"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230686"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230686"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}