{"id":230673,"date":"2022-11-28T15:45:00","date_gmt":"2022-11-28T12:45:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230673"},"modified":"2022-11-09T23:28:54","modified_gmt":"2022-11-09T20:28:54","slug":"una-guida-alla-riflessione-in-php-e-come-si-gioca-negli-unit-test","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/una-guida-alla-riflessione-in-php-e-come-si-gioca-negli-unit-test\/","title":{"rendered":"Una guida alla riflessione in PHP (e come si gioca negli unit test)"},"content":{"rendered":"\n<p>Nelle ultime settimane ho scritto di <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/unit-testing\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">unit test<\/a><\/strong> per i <strong><a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">membri<\/a><\/strong> del sito (e qualcosa che ho intenzione di continuare a fare nel prossimo post). \u00c8 qualcosa che penso; se scrivi codice lato server, dovresti farlo.<\/p>\n<p>Certo, \u00e8 pi\u00f9 facile per me dirlo che farlo, quindi anche se cerco di assicurarmi di fare un buon lavoro, c&#8217;\u00e8 sempre spazio per me per migliorare. Lo dico pi\u00f9 come un controllo di istinto personale che altro, quindi divago.<\/p>\n<p>Uno dei concetti che emergono spesso durante i test \u00e8 l&#8217;idea di testare i valori degli attributi privati. Ad esempio, supponiamo che tu abbia un setter, ma non hai necessariamente un getter per quel particolare valore.<\/p>\n<p>\u00c8 facile dire &quot;Beh, allora devi scrivere un getter&quot;, ma non \u00e8 sempre cos\u00ec. Voglio dire, cosa succede se memorizzi alcune informazioni all&#8217;interno della classe che non devono essere esposte a classi di terze parti?<\/p>\n<p>Come possiamo quindi scrivere test su quel tipo di dati quando vogliamo accedervi ma non abbiamo la capacit\u00e0 di farlo e non vogliamo compromettere l&#8217;integrit\u00e0 del nostro lavoro?<\/p>\n<p>\u00c8 qui che entra in gioco la riflessione.<\/p>\n<h2>Riflessione in PHP<\/h2>\n<p>Nello specifico, per capire come ispezionare il valore di una determinata variabile dall&#8217;esterno verso l&#8217;interno, \u00e8 necessario saper utilizzare la riflessione.<\/p>\n<p>Fortunatamente, PHP ci fornisce una potente API per farlo, e probabilmente vale la pena approfondire i dettagli in un altro post. Ma, per questo, rimarr\u00f2 con le basi.<\/p>\n<h3>Una definizione di lavoro<\/h3>\n<p>Innanzitutto, uno sguardo a cosa significa riflessione. Il manuale PHP <strong><a href=\"https:\/\/php.net\/manual\/en\/class.reflectionclass.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">lo definisce come<\/a><\/strong> :<\/p>\n<blockquote>\n<p>La classe <strong>ReflectionClass<\/strong> riporta informazioni su una classe.<\/p>\n<\/blockquote>\n<p>Ma penso che valga la pena avere qualcosa di un po&#8217; pi\u00f9 solido. Andiamo con qualcosa del genere almeno per questo post:<\/p>\n<blockquote>\n<p>La riflessione \u00e8 il modo in cui un programma controlla se stesso e si modifica durante l&#8217;esecuzione.<\/p>\n<\/blockquote>\n<p>Forse non \u00e8 eccezionale; forse no.<\/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=\"Una guida alla riflessione in PHP (e come si gioca negli unit test)\" ><\/a><\/p>\n<p>Ma servir\u00e0 allo scopo questo post.<\/p>\n<h3>Leggere un valore attraverso la riflessione<\/h3>\n<p>Supponiamo che per questo post tu abbia una classe namespace su <strong>AcmePluginAPIClient<\/strong> e abbia una propriet\u00e0 chiamata <strong>username<\/strong>. Daremo un&#8217;occhiata a come potrebbe essere un&#8217;implementazione molto semplice di questo in seguito.<\/p>\n<p>Naturalmente, sarebbe molto pi\u00f9 arricchito in un vero e proprio plugin.<\/p>\n<p>Diciamo, per\u00f2, che vuoi impostare il valore dell&#8217;attributo e poi leggerne il valore. L&#8217;avvertenza \u00e8 che la propriet\u00e0 \u00e8 contrassegnata come <strong>privata<\/strong> e non c&#8217;\u00e8 modo di leggerla dall&#8217;esterno.<\/p>\n<p>\u00c8 qui che la riflessione torna utile. Cio\u00e8, possiamo usare una parte del programma per guardare se stesso e riferire ci\u00f2 che vede. (Riflessione, capito? \u00c8 come quando vogliamo sapere cosa succede a noi stessi e nessun altro \u00e8 in giro, quindi ci guardiamo allo specchio e vediamo cosa c&#8217;\u00e8 l\u00ec.)<\/p>\n<p>Per fare ci\u00f2, devi fare cinque cose:<\/p>\n<ol>\n<li>Crea un&#8217;istanza della classe che vuoi testare,<\/li>\n<li>Imposta il valore della variabile,<\/li>\n<li>Prendi un&#8217;istanza di <strong>ReflectionClass<\/strong> per la classe che vogliamo testare,<\/li>\n<li>Imposta la sua propriet\u00e0 su accessibile,<\/li>\n<li>Leggi il valore.<\/li>\n<\/ol>\n<p>Quindi ecco una serie di informazioni che forniranno i passaggi necessari per fare esattamente questo.<\/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\">Istanziare la classe<\/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\">Impostare il valore<\/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\">Istanziare oggetti riflessi<\/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\">Impostare la propriet\u00e0, contrassegnarla come accessibile<\/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\">Leggi il valore<\/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>E questo \u00e8 il Primer di base sulla riflessione<\/h2>\n<p>A questo punto, questo dovrebbe darti alcune informazioni di base su cos&#8217;\u00e8 Reflection, come usarlo e perch\u00e9 \u00e8 utile soprattutto nel caso di <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/unit-testing\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">unit test<\/a><\/strong>.<\/p>\n<p>Questo \u00e8 uno di quei concetti che possono diventare pi\u00f9 complessi perch\u00e9 l&#8217;API di riflessione di PHP \u00e8 piuttosto potente (ma relativamente facile da capire). Quando lo accoppi con i test unitari, per\u00f2, ci sono molte cose che possono essere fatte.<\/p>\n<h3>La mia spina spudorata<\/h3>\n<p>Detto questo, se sei interessato ad apprendere i dettagli per questo tipo di cose, non esitare a controllare l&#8217; area riservata ai <strong><a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">membri<\/a><\/strong> del sito. Sto costruendo, ogni settimana, <strong><a href=\"https:\/\/tommcfarlin.com\/members-only-content\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">un arretrato di cose<\/a><\/strong> per aiutarci a concentrarci sull&#8217;adozione di pratiche migliori come sviluppatori di WordPress.<\/p>\n<p>Unit Testing, Reflection e altro ancora sono solo l&#8217;ultima parte di esso.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comprendere le basi della riflessione in PHP pu\u00f2 aiutare a rendere la programmazione, in particolare i test, molto pi\u00f9 semplice.<\/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":[896,804,720],"tags":[1168],"class_list":["post-230673","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-php-6","category-sviluppatore","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230673","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=230673"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230673\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/164037"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=230673"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=230673"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=230673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}