{"id":229711,"date":"2022-11-02T11:21:00","date_gmt":"2022-11-02T08:21:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229711"},"modified":"2022-11-09T16:03:19","modified_gmt":"2022-11-09T13:03:19","slug":"singleton-in-wordpress-rivisitati-unora-e-un-luogo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/singleton-in-wordpress-rivisitati-unora-e-un-luogo\/","title":{"rendered":"Singleton in WordPress, rivisitati (un&#8217;ora e un luogo?)"},"content":{"rendered":"\n<p>Prima di iniziare un post in cui si parla dell&#8217;utilizzo dei singleton in WordPress (o, pi\u00f9 appropriatamente, del <a href=\"https:\/\/tommcfarlin.com\/singleton-pattern-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Singleton Pattern<\/a> ), voglio assicurarmi che tu legga i seguenti due articoli:<\/p>\n<ul>\n<li><a href=\"http:\/\/wpkrauts.com\/2013\/cloning-in-php-or-why-your-singleton-might-kill-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Clonazione in PHP, o perch\u00e9 il tuo singleton potrebbe uccidere WordPress<\/a> di <a href=\"https:\/\/twitter.com\/toscho\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Thomas Scholz<\/a><\/li>\n<li><a href=\"https:\/\/carlalexander.ca\/singletons-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Singleton e loro utilizzo in WordPress<\/a> di <a href=\"https:\/\/twitter.com\/twigpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Carl Alexander<\/a><\/li>\n<\/ul>\n<p>Entrambi questi articoli forniscono una prospettiva immensamente preziosa su questo modello e sui pericoli del suo utilizzo ogni volta che lo si utilizza durante il nostro lavoro in WordPress; tuttavia, significa che dovremmo evitarli completamente?<\/p>\n<p>Non credo.<\/p>\n<p>Poi di nuovo, riconosco anche che gli articoli non dicono di evitarli completamente. Stanno fornendo casi forti su come usarli e sui pericoli del loro utilizzo se si sceglie di farlo.<\/p>\n<p>E sebbene li abbia sicuramente usati in passato, generalmente ho smesso. Tuttavia, di recente mi sono imbattuto in un caso d&#8217;uso per un progetto in cui penso sia accettabile.<\/p>\n<h2>Utilizzi ancora singleton in WordPress?<\/h2>\n<p>Per dare una ragione sul perch\u00e9 considero questo modello particolare, penso che valga la pena prima capire il caso d&#8217;uso. Per dirla semplicemente:<\/p>\n<ul>\n<li>C&#8217;\u00e8 una pagina di amministrazione che consente all&#8217;utente di selezionare come desidera visualizzare le date sul front-end del sito.<\/li>\n<li>Quando l&#8217;utente salva l&#8217;opzione, scriver\u00e0 il formato <a href=\"https:\/\/php.net\/manual\/en\/function.date.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">basato su PHP<\/a> per la data in una tabella in WordPress.<\/li>\n<li>Quando si esegue il rendering di una data, il valore verr\u00e0 recuperato dal database e applicato alla data di cui eseguire il rendering.<\/li>\n<\/ul>\n<p>E per coloro che sono curiosi, ci sono solo una manciata &#8211; diciamo quattro o cinque &#8211; modi in cui consentiamo all&#8217;utente di visualizzare la data.<\/p>\n<p>Poich\u00e9 questo particolare progetto consente agli utenti di importare CSV di dati (che includono date) e ci\u00f2 consente loro di eseguire il rendering dei dati dai CSV anche se in un formato diverso, vale la pena notare che c&#8217;\u00e8 una discreta quantit\u00e0 di formattazione della data che si verifica sul back-end.<\/p>\n<p>Naturalmente sorge una domanda:<\/p>\n<p>Perch\u00e9 non formattare semplicemente la data in cui l&#8217;utente importa il proprio CSV?<\/p>\n<p>E questo perch\u00e9 l&#8217;utente pu\u00f2 scegliere di modificare il modo in cui viene visualizzata la data dopo l&#8217;importazione del CSV.<\/p>\n<p>Detto questo, c&#8217;\u00e8 tutto questo altro meccanismo nel plug-in responsabile della convalida, della sanificazione e della scrittura dell&#8217;input dell&#8217;utente nel database.<\/p>\n<p>Ma quando arriva il momento di acquisire valori dal database, specialmente quando si tratta di leggere un valore da una tabella di database, e farlo in pi\u00f9 punti dell&#8217;applicazione, non avrebbe senso avere un singolo punto da quale valore si pu\u00f2 ricavare?<\/p>\n<p>Uno sguardo ad alto livello su come funziona.<\/p>\n<p>Oppure, in un altro modo, non ha senso cambiare una posizione nell&#8217;applicazione che pu\u00f2 facilmente sovrapporsi al resto dell&#8217;applicazione piuttosto che cercare tutte le possibili posizioni di:<\/p>\n<ol>\n<li>leggendo l&#8217;opzione,<\/li>\n<li>assicurandosi che sia impostato,<\/li>\n<li>definire un default se non \u00e8 impostato,<\/li>\n<li>e restituire il valore?<\/li>\n<\/ol>\n<p>Ed \u00e8 qui che vedo entrare in gioco un valido uso di un singleton in WordPress: un modo per leggere i dati in pi\u00f9 punti dell&#8217;applicazione. Ci\u00f2 comporta, tuttavia, alcune implicazioni:<\/p>\n<ul>\n<li>la classe non ha bisogno di essere istanziata pi\u00f9 di una volta (voglio dire, questa \u00e8 l&#8217;intera idea del singleton),<\/li>\n<li>non avr\u00e0 a che fare con dati mutevoli,<\/li>\n<li>non scriver\u00e0 informazioni o manipolare informazioni.<\/li>\n<\/ul>\n<p>In altre parole, \u00e8 l&#8217;unico responsabile del recupero delle informazioni e della restituzione. Questo \u00e8 tutto. Nient&#8217;altro.<\/p>\n<h3>Un esempio di implementazione<\/h3>\n<p>Allora come potrebbe essere? Ecco <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e27db4b35ff6ed7fba3b506dccb8ad2d#file-00-date-formatter-singleton-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">un&#8217;implementazione approssimativa<\/a> ai fini della conversazione:<\/p>\n<pre><code>&lt;?php\n\nclass Date_Formatter {\n\n    private static $instance;\n\n    private function __construct() {\n    }\n\n    private static function get_instance() {\n\n        if (null === self::$instance) {\n            self::$instance = new self;\n        }\n\n        return self::$instance;\n    }\n\n    public static function get() {\n\n        self::get_instance();\n\n        $default_format = 'm\/d\/Y';\n        $format = get_option( 'yhd_directory_importer', false );\n        if (false === $format) {\n            return $default_format;\n        }\n\n        $format = $format['date'];\n        $format = (isset( $format) &amp;&amp; isset( $format['format']) )? $format['format']: $default_format;\n\n        return $format;\n    }\n}\n<\/code><\/pre>\n<p>Come puoi vedere, soddisfa tutti i punti sopra. Cio\u00e8, legge i dati, imposta un valore predefinito e quindi lo restituisce.<\/p>\n<p>Questa classe non fa altro che leggere e restituire un insieme di dati molto specifico.<\/p>\n<h3>Un avvertimento sulla memorizzazione nella cache<\/h3>\n<p>Ovviamente, poich\u00e9 questa classe sta leggendo i dati dal database, pu\u00f2 essere \u2013 e forse dovrebbe essere \u2013 memorizzata nella cache. Il punto di questo post, tuttavia, non \u00e8 entrare nei transitori, nelle scadenze e nell&#8217;elaborare tutte queste sfumature.<\/p>\n<p>Si tratta invece di valutare se questo \u00e8 un caso d&#8217;uso valido per l&#8217;implementazione di un singleton in WordPress.<\/p>\n<h2>Aspetta, non deve essere cos\u00ec!<\/h2>\n<p>Lo so, lo so. <a href=\"https:\/\/www.youtube.com\/watch?v=yeEp7BA2mLg\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Psichico<\/a>! Credo sia la terminologia corretta, ma manteniamo questo aspetto professionale.<\/p>\n<p>Fino a questo punto, l&#8217;intero post ha parlato del motivo per cui potresti voler indagare sull&#8217;utilizzo dei singleton in WordPress in modo da avere un modo per recuperare facilmente le informazioni utilizzando principi costantemente orientati agli oggetti.<\/p>\n<p>Ma non penso ancora che l&#8217;uso di un singleton in WordPress sia necessario qui. Per lo meno, penso che una funzione statica vada bene. E l&#8217;unico motivo per cui penso che vada bene \u00e8 perch\u00e9 creare un&#8217;istanza della classe ogni volta che \u00e8 necessario accedere a una funzione che recupera dati che non cambieranno all&#8217;interno della classe \u00e8 eccessivo.<\/p>\n<p>Allora com&#8217;\u00e8 questo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e27db4b35ff6ed7fba3b506dccb8ad2d#file-00-date-formatter-refactored-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aspetto<\/a>? <\/p>\n<pre><code>&lt;?php\n\nclass Date_Formatter {\n\n    public static function get() {\n\n        $default_format = 'm\/d\/Y';\n\n        $format = get_option( 'yhd_directory_importer', false );\n        if (false === $format) {\n            return $default_format;\n        }\n\n        $format = $format['date'];\n        $format = (isset( $format) &amp;&amp; isset( $format['format']) )? $format['format']: $default_format;\n\n        return $format;\n    }\n}\n<\/code><\/pre>\n<p>E questa, credo, sia una soluzione migliore rispetto all&#8217;implementazione di un modello di progettazione arbitrario quando non \u00e8 affatto necessario.<\/p>\n<p>Ma sono aperto ad essere convinto del contrario.<\/p>\n<h2>Pensieri di sviluppatori pi\u00f9 esperti?<\/h2>\n<p>Ho sentito da un altro amico e collega che semplicemente usare una funzione con spazio dei nomi potrebbe anche essere la strada da percorrere. Chiaramente, ci sono una variet\u00e0 di modi per affrontare questo.<\/p>\n<p>E con questo, sono interessato a sentire dal resto di voi come potresti riformulare ulteriormente questo aspetto. Non sono molto interessato all&#8217;implementazione della\u00a0 funzione <strong>get<\/strong> poich\u00e9 \u00e8 principalmente messa insieme per la demo.<\/p>\n<p>Invece, sono interessato a modi per gestirlo al di fuori di ci\u00f2 che viene presentato qui. O, meglio, solo la tua opinione su ci\u00f2 che vedi.<\/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>Forse vuoi implementare singleton in WordPress per leggere facilmente i dati. Non deve essere cos\u00ec, per\u00f2.a<\/p>\n","protected":false},"author":1,"featured_media":221011,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,720,865],"tags":[1168],"class_list":["post-229711","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-sviluppatore","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229711","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=229711"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229711\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/221011"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=229711"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=229711"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=229711"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}