{"id":228779,"date":"2022-11-02T10:57:00","date_gmt":"2022-11-02T07:57:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228779"},"modified":"2022-11-09T04:14:37","modified_gmt":"2022-11-09T01:14:37","slug":"singletons-i-wordpress-revisited-en-tid-och-en-plats","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/singletons-i-wordpress-revisited-en-tid-och-en-plats\/","title":{"rendered":"Singletons i WordPress, Revisited (en tid och en plats?)"},"content":{"rendered":"\n<p>Innan jag b\u00f6rjar ett inl\u00e4gg d\u00e4r jag pratar om att anv\u00e4nda singletons i WordPress (eller, mer l\u00e4mpligt, <a href=\"https:\/\/tommcfarlin.com\/singleton-pattern-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Singleton Pattern<\/a> ), vill jag se till att du l\u00e4ser f\u00f6ljande tv\u00e5 artiklar:<\/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\">Kloning i PHP, eller varf\u00f6r din singleton kan d\u00f6da WordPress<\/a> av <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\">Singletons och deras anv\u00e4ndning i WordPress<\/a> av <a href=\"https:\/\/twitter.com\/twigpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Carl Alexander<\/a><\/li>\n<\/ul>\n<p>B\u00e5da dessa artiklar ger ett oerh\u00f6rt v\u00e4rdefullt perspektiv p\u00e5 detta m\u00f6nster och farorna med att anv\u00e4nda det n\u00e4r du anv\u00e4nder det under hela v\u00e5rt arbete i WordPress; Men betyder det att vi helt b\u00f6r undvika dem?<\/p>\n<p>Jag tror inte det.<\/p>\n<p>\u00c5terigen, jag inser ocks\u00e5 att artiklarna inte s\u00e4ger att man helt ska undvika dem. De ger starka argument f\u00f6r hur man anv\u00e4nder dem och farorna med att anv\u00e4nda dem om du v\u00e4ljer att g\u00f6ra det.<\/p>\n<p>Och \u00e4ven om jag definitivt har anv\u00e4nt dem tidigare, har jag i allm\u00e4nhet slutat. Men jag st\u00f6tte nyligen p\u00e5 ett anv\u00e4ndningsfall f\u00f6r ett projekt d\u00e4r jag tycker att det \u00e4r acceptabelt.<\/p>\n<h2>Anv\u00e4nder du fortfarande Singletons i WordPress?<\/h2>\n<p>F\u00f6r att ge en anledning till varf\u00f6r jag ens \u00f6verv\u00e4ger just detta m\u00f6nster, tycker jag att det \u00e4r v\u00e4rt att f\u00f6rst f\u00f6rst\u00e5 anv\u00e4ndningsfallet. F\u00f6r att uttrycka sig enkelt:<\/p>\n<ul>\n<li>Det finns en administrationssida som l\u00e5ter anv\u00e4ndaren v\u00e4lja hur de vill visa datumen p\u00e5 sidans front-end.<\/li>\n<li>N\u00e4r anv\u00e4ndaren sparar alternativet kommer den att skriva det <a href=\"https:\/\/php.net\/manual\/en\/function.date.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP-baserade<\/a> formatet f\u00f6r datumet till en tabell i WordPress.<\/li>\n<li>N\u00e4r du renderar ett datum kommer v\u00e4rdet att h\u00e4mtas fr\u00e5n databasen och till\u00e4mpas p\u00e5 det datum som ska renderas.<\/li>\n<\/ul>\n<p>Och f\u00f6r de som \u00e4r nyfikna finns det bara en handfull \u2013 s\u00e4g fyra eller fem \u2013 s\u00e4tt som vi till\u00e5ter anv\u00e4ndaren att visa datumet p\u00e5.<\/p>\n<p>Eftersom det h\u00e4r speciella projektet till\u00e5ter anv\u00e4ndare att importera CSV:er av data (som inkluderar datum) och som till\u00e5ter dem att rendera data fr\u00e5n CSV:erna om \u00e4n i ett annat format, \u00e4r det v\u00e4rt att notera att det finns en hel del datumformatering p\u00e5 baksidan.<\/p>\n<p>Naturligtvis uppst\u00e5r en fr\u00e5ga:<\/p>\n<p>Varf\u00f6r inte bara formatera datumet n\u00e4r anv\u00e4ndaren importerar sin CSV?<\/p>\n<p>Och det beror p\u00e5 att anv\u00e4ndaren kan v\u00e4lja att \u00e4ndra hur datumet renderas efter att CSV-filen har importerats.<\/p>\n<p>Med det sagt, det finns en helt annan mekanism i pluginet som \u00e4r ansvarig f\u00f6r att validera, sanera och skriva anv\u00e4ndarindata till databasen.<\/p>\n<p>Men n\u00e4r det \u00e4r dags att ta tag i v\u00e4rden fr\u00e5n databasen, s\u00e4rskilt n\u00e4r det kommer i form av att l\u00e4sa ett v\u00e4rde fr\u00e5n en databastabell, och g\u00f6ra det p\u00e5 flera punkter i hela applikationen, vore det inte vettigt att ha en enda punkt fr\u00e5n vilket v\u00e4rde kan h\u00e4rledas?<\/p>\n<p>En titt p\u00e5 h\u00f6g niv\u00e5 p\u00e5 hur detta fungerar.<\/p>\n<p>Eller, ett annat s\u00e4tt att uttrycka det, \u00e4r det inte meningsfullt att \u00e4ndra en plats i applikationen som l\u00e4tt kan \u00f6verlappa resten av applikationen ist\u00e4llet f\u00f6r att s\u00f6ka efter alla m\u00f6jliga platser f\u00f6r:<\/p>\n<ol>\n<li>l\u00e4ser alternativet,<\/li>\n<li>se till att den \u00e4r inst\u00e4lld,<\/li>\n<li>definiera en standard om den inte \u00e4r inst\u00e4lld,<\/li>\n<li>och returnera v\u00e4rdet?<\/li>\n<\/ol>\n<p>Och det \u00e4r h\u00e4r jag ser en giltig anv\u00e4ndning av en singleton i WordPress komma in i bilden: Ett s\u00e4tt att l\u00e4sa data p\u00e5 flera punkter i hela applikationen. Detta medf\u00f6r dock vissa implikationer:<\/p>\n<ul>\n<li>klassen beh\u00f6ver inte instansieras mer \u00e4n en g\u00e5ng (jag menar, det \u00e4r hela id\u00e9n med singletonen),<\/li>\n<li>det kommer inte att hantera f\u00f6r\u00e4nderlig data,<\/li>\n<li>det kommer inte att vara att skriva information eller manipulera information.<\/li>\n<\/ul>\n<p>Med andra ord, det \u00e4r ensamt ansvarigt f\u00f6r att h\u00e4mta information och returnera den. Det \u00e4r allt. Inget annat.<\/p>\n<h3>Ett exempel p\u00e5 implementering<\/h3>\n<p>S\u00e5 hur kan det h\u00e4r se ut? H\u00e4r \u00e4r <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e27db4b35ff6ed7fba3b506dccb8ad2d#file-00-date-formatter-singleton-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en grov implementering<\/a> f\u00f6r samtalets syfte:<\/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>Som du kan se uppfyller den alla punkter ovan. Det vill s\u00e4ga, den l\u00e4ser data, st\u00e4ller in ett standardv\u00e4rde och returnerar det sedan.<\/p>\n<p>Den h\u00e4r klassen g\u00f6r inget annat \u00e4n att l\u00e4sa och returnera en mycket specifik upps\u00e4ttning data.<\/p>\n<h3>En varning om cachelagring<\/h3>\n<p>Uppenbarligen, eftersom den h\u00e4r klassen l\u00e4ser data fr\u00e5n databasen, kan den cachelagras \u2013 och eventuellt b\u00f6r den. Meningen med det h\u00e4r inl\u00e4gget \u00e4r dock inte att komma in p\u00e5 transienter, utg\u00e5ngsdatum och att arbeta igenom alla dessa nyanser.<\/p>\n<p>Ist\u00e4llet handlar det om att utv\u00e4rdera om detta \u00e4r ett giltigt anv\u00e4ndningsfall f\u00f6r att implementera en singleton i WordPress.<\/p>\n<h2>V\u00e4nta, det beh\u00f6ver inte vara s\u00e5 h\u00e4r!<\/h2>\n<p>Jag vet jag vet. <a href=\"https:\/\/www.youtube.com\/watch?v=yeEp7BA2mLg\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Psyk<\/a>! Jag tror att det \u00e4r den korrekta terminologin, men l\u00e5t oss h\u00e5lla detta professionellt.<\/p>\n<p>Fram till denna punkt pratade hela inl\u00e4gget om varf\u00f6r du kanske vill unders\u00f6ka att anv\u00e4nda singletons i WordPress s\u00e5 att du har ett s\u00e4tt att enkelt h\u00e4mta information med konsekventa objektorienterade principer.<\/p>\n<p>Men jag tror fortfarande inte att det \u00e4r n\u00f6dv\u00e4ndigt att anv\u00e4nda en singleton i WordPress h\u00e4r. \u00c5tminstone tycker jag att en statisk funktion \u00e4r bra. Och den enda anledningen till att jag tycker att det \u00e4r okej \u00e4r att skapa en instans av klassen varje g\u00e5ng du beh\u00f6ver komma \u00e5t en funktion som h\u00e4mtar data som inte kommer att f\u00f6r\u00e4ndras inom klassen \u00e4r \u00f6verdrivet.<\/p>\n<p>S\u00e5 hur ser det h\u00e4r <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e27db4b35ff6ed7fba3b506dccb8ad2d#file-00-date-formatter-refactored-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ut<\/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>Och det tror jag \u00e4r en b\u00e4ttre l\u00f6sning \u00e4n att implementera ett godtyckligt designm\u00f6nster n\u00e4r det inte beh\u00f6vs alls.<\/p>\n<p>Men jag \u00e4r \u00f6ppen f\u00f6r att bli \u00f6vertygad om n\u00e5got annat.<\/p>\n<h2>Tankar fr\u00e5n mer erfarna utvecklare?<\/h2>\n<p>Jag har h\u00f6rt fr\u00e5n en v\u00e4n och kamrat \u00e4n att bara anv\u00e4nda en namnavgr\u00e4nsad funktion kan till och med vara r\u00e4tt v\u00e4g att g\u00e5. Det \u00e4r uppenbart att det finns en m\u00e4ngd olika s\u00e4tt att tackla detta.<\/p>\n<p>Och med det \u00e4r jag intresserad av att h\u00f6ra fr\u00e5n er andra om hur ni kan refaktorera detta ytterligare. Jag \u00e4r inte s\u00e5 mycket bekymrad \u00f6ver implementeringen av <strong>get<\/strong> -funktionen eftersom den huvudsakligen \u00e4r sammansatt f\u00f6r demon.<\/p>\n<p>Ist\u00e4llet \u00e4r jag intresserad av s\u00e4tt att hantera detta utanf\u00f6r det som presenteras h\u00e4r. Eller snarare, bara din syn p\u00e5 det du ser.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kanske vill du implementera singletons i WordPress f\u00f6r att enkelt l\u00e4sa data. Det beh\u00f6ver dock inte vara s\u00e5.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":[901,724,868],"tags":[1173],"class_list":["post-228779","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228779","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=228779"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228779\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/221011"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228779"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228779"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}