{"id":229944,"date":"2022-11-28T16:17:00","date_gmt":"2022-11-28T13:17:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229944"},"modified":"2022-11-09T19:24:25","modified_gmt":"2022-11-09T16:24:25","slug":"praimer-peegelduse-kohta-php-s-ja-kuidas-see-uehikutestimisel-maengib","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/praimer-peegelduse-kohta-php-s-ja-kuidas-see-uehikutestimisel-maengib\/","title":{"rendered":"Praimer peegelduse kohta PHP-s (ja kuidas see \u00fchikutestimisel m\u00e4ngib)"},"content":{"rendered":"\n<p>Viimased paar n\u00e4dalat olen kirjutanud saidi <strong><a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">liikmete<\/a><\/strong> <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/unit-testing\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00fchikutestimisest<\/a><\/strong> (ja millestki, mida kavatsen j\u00e4rgmises postituses j\u00e4tkata). See on midagi, mida ma arvan; kui kirjutate serveripoolset koodi, peaksite seda tegema.<\/p>\n<p>Muidugi on mul lihtsam seda \u00f6elda kui teha, nii et kuigi ma p\u00fc\u00fcan olla kindel, et teen seda h\u00e4sti, on mul alati arenguruumi. \u00dctlen seda pigem isikliku k\u00f5hukontrolli kui millegi muuna, seega kaldun k\u00f5rvale.<\/p>\n<p>\u00dcks kontseptsioon, mis testimise k\u00e4igus sageli esile kerkib, on privaatsete atribuutide v\u00e4\u00e4rtuste testimise idee. Oletame n\u00e4iteks, et teil on setter, kuid teil pole tingimata selle konkreetse v\u00e4\u00e4rtuse jaoks getterit.<\/p>\n<p>Lihtne on \u00f6elda: &quot;Noh, siis peate kirjutama getteri&quot;, kuid see ei ole alati nii. Mis saab siis, kui salvestate klassis teavet, mida ei pea kolmandate osapoolte klassidele kokku puutuma?<\/p>\n<p>Kuidas me siis peaksime kirjutama teste selliste andmete vastu, kui tahame neile juurde p\u00e4\u00e4seda, kuid meil pole selleks v\u00f5imalust ega soovi oma t\u00f6\u00f6 terviklikkust kahjustada?<\/p>\n<p>Siin tulebki m\u00e4ngu peegeldus.<\/p>\n<h2>Peegeldus PHP-s<\/h2>\n<p>T\u00e4psemalt, selleks, et m\u00f5ista, kuidas antud muutuja v\u00e4\u00e4rtust v\u00e4ljastpoolt sissepoole kontrollida, peate teadma, kuidas kasutada peegeldust.<\/p>\n<p>\u00d5nneks pakub PHP meile selleks v\u00f5imsat API-t ja t\u00f5en\u00e4oliselt tasub selle s\u00fcgavamatesse \u00fcksikasjadesse sattuda m\u00f5nes teises postituses. Kuid selle puhul j\u00e4\u00e4n p\u00f5hit\u00f5dede juurde.<\/p>\n<h3>T\u00f6\u00f6tav definitsioon<\/h3>\n<p>K\u00f5igepealt vaadake, mida peegeldamine t\u00e4hendab. PHP k\u00e4siraamat <strong><a href=\"https:\/\/php.net\/manual\/en\/class.reflectionclass.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">m\u00e4\u00e4ratleb selle j\u00e4rgmiselt<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Klass <strong>ReflectionClass<\/strong> annab teavet klassi kohta.<\/p>\n<\/blockquote>\n<p>Aga ma arvan, et tasub v\u00f5tta midagi veidi soliidsemat. Teeme v\u00e4hemalt selle postituse jaoks midagi sellist:<\/p>\n<blockquote>\n<p>Peegeldus on viis, kuidas programm ennast t\u00f6\u00f6ajal kontrollib ja muudab.<\/p>\n<\/blockquote>\n<p>V\u00f5ib-olla pole see suurep\u00e4rane; v\u00f5ibolla mitte.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164036-61e75c7d26d26.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164036-61e75c7d26d26.png\" alt=\"Praimer peegelduse kohta PHP-s (ja kuidas see \u00fchikutestimisel m\u00e4ngib)\" ><\/a><\/p>\n<p>Kuid see t\u00e4idab selle postituse eesm\u00e4rki.<\/p>\n<h3>V\u00e4\u00e4rtuse lugemine peegelduse kaudu<\/h3>\n<p>Oletame, et selle postituse jaoks on teil <strong>AcmePluginAPIClientis<\/strong> nimeruumide klass ja sellel on atribuut nimega <strong>kasutajanimi<\/strong>. Vaatame hiljem, milline v\u00f5ib selle v\u00e4ga lihtne teostus v\u00e4lja n\u00e4ha.<\/p>\n<p>Muidugi oleks see tegelikus pistikprogrammis palju t\u00e4psem.<\/p>\n<p>Oletame aga, et soovite m\u00e4\u00e4rata atribuudi v\u00e4\u00e4rtuse ja seej\u00e4rel lugeda selle v\u00e4\u00e4rtust. Hoiatus on see, et vara on m\u00e4rgitud <strong>privaatseks<\/strong> ja seda pole v\u00f5imalik v\u00e4ljastpoolt lugeda.<\/p>\n<p>Siin tulebki peegeldus kasuks. See t\u00e4hendab, et saame kasutada programmi osa, et vaadata ennast ja teatada, mida see n\u00e4eb. (Peegeldus, saad aru? See on nagu siis, kui tahame teada, mis meiega toimub ja kedagi teist pole l\u00e4heduses, nii et vaatame peeglisse ja vaatame, mis seal on.)<\/p>\n<p>Selleks peate tegema viit asja:<\/p>\n<ol>\n<li>Looge klass, mida soovite testida,<\/li>\n<li>M\u00e4\u00e4ra muutuja v\u00e4\u00e4rtus,<\/li>\n<li><strong>Haarake ReflectionClassi<\/strong> eksemplar selle klassi jaoks, mida tahame testida,<\/li>\n<li>M\u00e4\u00e4rake selle omadus juurdep\u00e4\u00e4setavaks,<\/li>\n<li>Lugege v\u00e4\u00e4rtust.<\/li>\n<\/ol>\n<p>Nii et siin on rida p\u00f5hit\u00f5desid, mis pakuvad t\u00e4pselt selle tegemiseks vajalikke samme.<\/p>\n<h4>1 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c835d263062e768980d5ad3f6941f60e#file-00-apiclient-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Esitage klass<\/a><\/h4>\n<pre><code>&lt;?php\n\nnamespace AcmePlugin;\n\nclass APIClient\n{\n  private $username;\n\n  \/\/ Other functions for class implementation...\n}\n<\/code><\/pre>\n<h4>2 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c835d263062e768980d5ad3f6941f60e#file-01-setusername-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">M\u00e4\u00e4rake v\u00e4\u00e4rtus<\/a><\/h4>\n<pre><code>&lt;?php\n\nnamespace AcmePlugin;\n\nclass APIClient\n{\n  private $username;\n\n  public function setUsername($username)\n  {\n    $this-&gt;username = $username;\n  }\n\n  \/\/ Other functions for class implementation...\n}\n<\/code><\/pre>\n<h4>3 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c835d263062e768980d5ad3f6941f60e#file-01-apiclienttest-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Peegeldavate objektide kordus<\/a><\/h4>\n<pre><code>&lt;?php\n\nnamespace AcmePluginTests;\n\nuse AcmePluginAPIAPIClient;\n\nclass APIClientTest\n{\n  public function setUsername()\n  {\n\n    \/\/ Instantiate the class.\n    $client = new APIClient();\n    $username = 'tommcfarlin';\n    $client-&gt;setUsername($username);\n\n    \/\/ Now get a reflected instance of the class.\n    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');\n\n    \/\/ More to come...\n  }\n}\n<\/code><\/pre>\n<h4>4. <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c835d263062e768980d5ad3f6941f60e#file-02-setaccessibleproperty-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">M\u00e4\u00e4rake atribuut, m\u00e4rkige see juurdep\u00e4\u00e4setavaks<\/a><\/h4>\n<pre><code>&lt;?php\n\nnamespace AcmePluginTests;\n\nuse AcmePluginAPIAPIClient;\n\nclass APIClientTest\n{\n  public function setUsername()\n  {\n\n    \/\/ Instantiate the class.\n    $client = new APIClient();\n    $username = 'tommcfarlin';\n    $client-&gt;setUsername($username);\n\n    \/\/ Now get a reflected instance of the class.\n    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');\n    $usernameProperty = new ReflectionObject($client);\n    $usernameProperty-&gt;setAccessible(true);\n\n    \/\/ More to come...\n  }\n}\n<\/code><\/pre>\n<h4>5 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c835d263062e768980d5ad3f6941f60e#file-03-readpropertyvalue-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Lugege v\u00e4\u00e4rtust<\/a><\/h4>\n<pre><code>&lt;?php\n\nnamespace AcmePluginTests;\n\nuse AcmePluginAPIAPIClient;\n\nclass APIClientTest\n{\n  public function setUsername()\n  {\n\n    \/\/ Instantiate the class.\n    $client = new APIClient();\n    $username = 'tommcfarlin';\n    $client-&gt;setUsername($username);\n\n    \/\/ Now get a reflected instance of the class.\n    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');\n\n    \/\/ Grab a reference to the private property by making it accessible.\n    $usernameProperty = new ReflectionObject($client);\n    $usernameProperty-&gt;setAccessible(true);\n\n    \/\/ And finally, read it's value.\n    $usernameValue = $usernameProperty-&gt;getValue($client);\n  }\n}\n<\/code><\/pre>\n<h2>Ja see on peegelduse p\u00f5hiaabits<\/h2>\n<p>Siin peaks see andma teile p\u00f5hiteavet selle kohta, mis on Reflection, kuidas seda kasutada ja miks see kasulik on, eriti <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/unit-testing\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00fchikutestimise<\/a><\/strong> puhul .<\/p>\n<p>See on \u00fcks neist m\u00f5istetest, mis v\u00f5ib muutuda keerulisemaks, kuna PHP refleksiooni API on \u00fcsna v\u00f5imas (kuid suhteliselt kergesti m\u00f5istetav). Kuid kui \u00fchendate selle \u00fcksuse testimisega, saab teha palju asju.<\/p>\n<h3>Minu h\u00e4bematu pistik<\/h3>\n<p>Sellegipoolest, kui olete huvitatud seda t\u00fc\u00fcpi asjade l\u00e4bim\u00f5tlemisest, vaadake kindlasti saidi <strong><a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">liikmetele m\u00f5eldud<\/a><\/strong> ala. Kogun igal n\u00e4dalal <strong><a href=\"https:\/\/tommcfarlin.com\/members-only-content\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mahaj\u00e4\u00e4must,<\/a><\/strong> mis aitab meil keskenduda WordPressi arendajate paremate tavade omaksv\u00f5tmisele.<\/p>\n<p>\u00dcksuse testimine, peegeldus ja palju muud on vaid selle uusim osa.<\/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>PHP-s refleksiooni p\u00f5hit\u00f5dede m\u00f5istmine v\u00f5ib teie programmeerimist, eriti testimist, palju lihtsamaks muuta.<\/p>\n","protected":false},"author":1,"featured_media":164037,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[718,894,802],"tags":[1165],"class_list":["post-229944","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-kood","category-php-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/229944","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=229944"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/229944\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/164037"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=229944"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=229944"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=229944"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}