{"id":230564,"date":"2022-12-14T14:10:00","date_gmt":"2022-12-14T11:10:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230564"},"modified":"2022-12-14T14:13:23","modified_gmt":"2022-12-14T11:13:23","slug":"wordpress-widgets-upptaeck-objektorienterad-programmering","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-upptaeck-objektorienterad-programmering\/","title":{"rendered":"WordPress-widgets: Uppt\u00e4ck objektorienterad programmering"},"content":{"rendered":"\n<p>Om du inte har l\u00e4st det f\u00f6rsta inl\u00e4gget i den h\u00e4r serien rekommenderar jag det, eftersom vi b\u00f6rjar b\u00f6rja skriva objektorienterad kod f\u00f6r WordPress genom att anv\u00e4nda <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Widgets API.<\/a><\/strong><\/p>\n<p>Serien kommer att f\u00e5nga n\u00e5gra saker:<\/p>\n<ol>\n<li>visa dig grundskelettet f\u00f6r en widget och varf\u00f6r den \u00e4r objektorienterad,<\/li>\n<li>diskutera vilka saker du b\u00f6r kunna l\u00e4gga m\u00e4rke till och varf\u00f6r<\/li>\n<li>uppdatera Widget Boilerplate direkt p\u00e5 den h\u00e4r webbplatsen f\u00f6rst och tryck sedan ut den till GitHub,<\/li>\n<li>bygga en widget med hj\u00e4lp av API:t med boilerplate som grund f\u00f6r v\u00e5rt arbete.<\/li>\n<\/ol>\n<p>Men innan jag g\u00f6r det vill jag f\u00f6rs\u00e4kra mig om att alla som l\u00e4ser detta \u00e4r f\u00e5ngade p\u00e5 k\u00e4rnprinciperna f\u00f6r objektorienterad programmering och har allt som beh\u00f6vs f\u00f6r att bygga ut en objektorienterad l\u00f6sning f\u00f6r WordPress.<\/p>\n<p>F\u00f6r detta \u00e4ndam\u00e5l rekommenderar jag f\u00f6ljande:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/de-tvaa-foersta-pelarna-i-oop\/\" title=\"Tv\u00e5 pelare f\u00f6r objektorienterad programmering: Del 1 av 2\">Tv\u00e5 pelare f\u00f6r objektorienterad programmering: Del 1 av 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/de-andra-tvaa-pelarna-i-oop\/\" title=\"Tv\u00e5 pelare f\u00f6r objektorienterad programmering: Del 2 av 2\">Tv\u00e5 pelare f\u00f6r objektorienterad programmering: Del 2 av 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/abstrakta-klasser-del-1-abstraherande-beteende\/\" title=\"Abstrakta klasser, del 1 \u2013 Abstraherande beteende\">Abstrakta klasser, del 1 \u2013 Abstraherande beteende<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/abstrakta-klasser-del-2-abstrakta-klasser-och-graenssnitt\/\" title=\"Abstrakta klasser, del 2 \u2013 Abstrakta klasser och gr\u00e4nssnitt\">Abstrakta klasser, del 2 \u2013 Abstrakta klasser och gr\u00e4nssnitt<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/tommcfarlin.com\/tag\/the-independent-wordpress-developer\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Den oberoende WordPress-utvecklaren<\/a><\/strong><\/li>\n<\/ol>\n<p>Om du har l\u00e4st allt inneh\u00e5ll, bra. Du kommer att vara v\u00e4l f\u00f6rberedd f\u00f6r det h\u00e4r inl\u00e4gget och de kommande inl\u00e4ggen. Om inte, kan det finnas n\u00e5gra h\u00e5l i resten av det du ska l\u00e4sa, men inneh\u00e5llet i inl\u00e4gget b\u00f6r vara tillr\u00e4ckligt tydligt.<\/p>\n<h3>Vad \u00e4r aff\u00e4ren, exakt?<\/h3>\n<p>S\u00e5 h\u00e4r \u00e4r det: <strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-ett-objektorienterat-tillvaegagaangssaett\/\" title=\"F\u00f6rra veckan\">F\u00f6rra veckan<\/a><\/strong> delade jag lite kod tillsammans med lite information om <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Widgets API<\/a><\/strong>. Jag kommer att \u00e5terkomma till det lite mer i det h\u00e4r inl\u00e4gget innan vi kommer in p\u00e5 den mer kodningsintensiva delen av tv\u00e5 anledningar:<\/p>\n<ol>\n<li>Jag vill att alla som l\u00e4ser detta ska vara p\u00e5 samma sida n\u00e4r det g\u00e4ller att skriva objektorienterad kod (\u00e5tminstone i detta sammanhang),<\/li>\n<li>Jag inser att m\u00e4nniskor kommer fr\u00e5n olika bakgrunder och jag vill se till att vi alla \u00e4r p\u00e5 samma sida s\u00e5 mycket som m\u00f6jligt innan jag forts\u00e4tter.<\/li>\n<\/ol>\n<p>Om du har erfarenhet av att skriva objektorienterad kod, s\u00e4rskilt i avancerad kapacitet, kan detta verka enklare f\u00f6r dig; Annars hoppas jag att detta kommer att bev\u00e4pna dig med allt du beh\u00f6ver f\u00f6r att uppt\u00e4cka objektorienterade metoder, inte bara ang\u00e5ende detta API utan \u00e4ven n\u00e4r du l\u00e4ser andras kod.<\/p>\n<h2>Hur man uppt\u00e4cker objektorienterad programmering<\/h2>\n<p>En naturlig f\u00f6rsta fr\u00e5ga \u00e4r kanske varf\u00f6r vi beh\u00f6ver kunna uppt\u00e4cka, l\u00e4sa eller f\u00f6rst\u00e5 objektorienterad programmering innan vi faktiskt skriver det?<\/p>\n<h3>Ett ord om d\u00e5lig kod<\/h3>\n<p>Det korta svaret p\u00e5 det \u00e4r detta:<\/p>\n<p>Du beh\u00f6ver inte, men jag \u00e4r till hj\u00e4lp. Om du kan l\u00e4sa objektorienterad programmering kommer du att f\u00e5 ett f\u00f6rspr\u00e5ng med att dra f\u00f6rdel av vad den erbjuder som ett paradigm eftersom du kommer att bygga vidare p\u00e5 strategier och arbete som gjorts av andra i andra projekt.<\/p>\n<p>Det betyder inte att vi inte kommer att l\u00e4sa den d\u00e5liga koden, men vi kommer att g\u00f6ra vad vi kan f\u00f6r att identifiera d\u00e5lig kod, identifiera de problematiska omr\u00e5dena och sedan g\u00f6ra vad vi kan f\u00f6r att undvika att inf\u00f6rliva den i v\u00e5rt arbete.<\/p>\n<p>F\u00f6r nu ska vi dock ta en titt p\u00e5 <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Widgets API<\/a><\/strong> f\u00f6r att se vad vi kan g\u00f6ra f\u00f6r att uppt\u00e4cka objektorienterad programmering.<\/p>\n<h3>Tillbaka till objektorienterad programmering<\/h3>\n<p>I det tidigare inl\u00e4gget beskrev jag tv\u00e5 saker som indikerar att API:et \u00e4r objektorienterat (\u00e5tminstone till viss del):<\/p>\n<ol>\n<li>anv\u00e4ndningen av s\u00f6kordet <strong>extends ,<\/strong><\/li>\n<li>funktioner som vi m\u00e5ste implementera.<\/li>\n<\/ol>\n<p>Anledningen till att jag vill \u00e5terkomma till detta \u00e4mne \u00e4r att det identifierar tv\u00e5 viktiga saker som \u00e4r en del av k\u00e4rnobjektorienterade principer: <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Arv<\/a><\/strong> och funktionsimplementering (som ofta \u00e4r en del av <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">abstrakta klasser<\/a><\/strong> ).<\/p>\n<p>En notering innan vi tittar p\u00e5 ovanst\u00e5ende:<\/p>\n<p>N\u00e4r du tittar p\u00e5 <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">k\u00e4llan till klassen WP_Widget<\/a><\/strong> kommer du att m\u00e4rka att det inte finns abstrakta metoder. Men n\u00e5gra av de funktioner som vi m\u00e5ste implementera, som jag kommer att n\u00e4mna senare i det h\u00e4r inl\u00e4gget, \u00e4r fr\u00e4msta kandidater f\u00f6r abstrakta metoder. Och jag ska diskutera varf\u00f6r ocks\u00e5.<\/p>\n<p>L\u00e5t oss dela upp \u00e4mnena ovan i tv\u00e5 separata avsnitt: Arv och Abstraktioner.<\/p>\n<h3>Arv<\/h3>\n<p>Jag t\u00e4ckte arv \u00e4r relativt djup <strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-ett-objektorienterat-tillvaegagaangssaett\/\" title=\"i f\u00f6rra inl\u00e4gget\">i f\u00f6rra inl\u00e4gget<\/a><\/strong>, s\u00e5 jag ska inte f\u00f6rtydliga po\u00e4ngen h\u00e4r. Jag ska bjuda p\u00e5 n\u00e5gra ord, men jag \u00e4r mycket mer intresserad av att diskutera abstraktion, vilket jag kommer att g\u00f6ra om ett \u00f6gonblick.<\/p>\n<p>Innan du g\u00e5r f\u00f6r l\u00e5ngt in p\u00e5 det h\u00e4r, v\u00e4nligen se <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ea73655b0a022d65317529930cbb0cad#file-00-widget-base-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6ljande kod:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\nclass AcmeWidget extends WP_Widget \n{ \n    public function __construct() \n    {\n    }\n\n    public function widget($args, $instance) \n    {\n    }\n\n    public function form($instance)\n    {\n    }\n\n    public function update($newInstance, $oldInstance)\n    {\n    }\n}<\/code><\/pre>\n<p>Men f\u00f6rst kan vi inse att alla klasser som implementerar Widgets API m\u00e5ste anv\u00e4nda arv enbart p\u00e5 grund av nyckelordet <strong>extends .<\/strong><\/p>\n<p>Det betyder att det finns en funktionalitet som vi kommer att \u00e4rva (eller f\u00e5 gratis) och det finns en funktionalitet som vi m\u00e5ste implementera p\u00e5 egen hand.<\/p>\n<p>Fr\u00e5n <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP-manualen<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Till exempel, n\u00e4r du ut\u00f6kar en klass, \u00e4rver underklassen alla offentliga och skyddade metoder fr\u00e5n den \u00f6verordnade klassen. Om inte en klass \u00e5sidos\u00e4tter dessa metoder kommer de att beh\u00e5lla sin ursprungliga funktionalitet.<\/p>\n<\/blockquote>\n<p>N\u00e4r du \u00e4rver funktionalitet fr\u00e5n en klass kan du dock uppt\u00e4cka att det \u00e4r viktigt att strikt anropa f\u00f6r\u00e4lderns konstruktor (i v\u00e5r <strong>__construct-<\/strong> funktion).<\/p>\n<p>Men detta v\u00e4cker vad jag tror \u00e4r en av de viktigaste fr\u00e5gorna med arv i PHP (och hela anledningen till att jag ville inkludera det h\u00e4r avsnittet): Beh\u00f6ver vi anropa den \u00f6verordnade konstruktorn uttryckligen?<\/p>\n<p>\u00c4ven enligt <strong><a href=\"http:\/\/www.php.net\/manual\/en\/language.oop5.decon.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">manualen:<\/a><\/strong><\/p>\n<blockquote>\n<p>\u00d6verordnade konstrukt\u00f6rer anropas inte implicit om den underordnade klassen definierar en konstruktor. F\u00f6r att k\u00f6ra en \u00f6verordnad konstruktor kr\u00e4vs ett anrop till <strong>parent::__construct() i den underordnade konstruktorn.<\/strong> Om det underordnade inte definierar en konstruktor s\u00e5 kan det \u00e4rvas fr\u00e5n den \u00f6verordnade klassen precis som en vanlig klassmetod (om den inte deklarerades som privat).<\/p>\n<\/blockquote>\n<p>Men vi kan f\u00f6renkla detta. Det h\u00e4r \u00e4r kanske l\u00e4ttare att komma ih\u00e5g:<\/p>\n<ol>\n<li>Om v\u00e5r klass anv\u00e4nder arv men inte definierar en konstruktor, anropas den \u00f6verordnade konstruktorn.<\/li>\n<li>Om v\u00e5r klass anv\u00e4nder arv men definierar en konstruktor, m\u00e5ste den \u00f6verordnade konstruktionen uttryckligen anropas.<\/li>\n<\/ol>\n<p>Eller kanske \u00e4nnu enklare:<\/p>\n<ul>\n<li>Om v\u00e5r klass inte definierar en konstruktor, kommer koden som standard till f\u00f6r\u00e4ldrarnas konstruktor.<\/li>\n<\/ul>\n<p>Vettigt? Kort sagt, om vi definierar v\u00e5ra egenskaper, initialisering och kod i en konstruktor, b\u00f6r den f\u00f6rsta raden i v\u00e5r klasss konstruktor vara ett anrop till den \u00f6verordnade konstruktorn.<\/p>\n<h3>Abstraktion<\/h3>\n<p>F\u00f6r att vara helt tydlig inneh\u00e5ller inte k\u00e4llkoden f\u00f6r klassen <strong>WP_Widget<\/strong> abstrakta metoder. En del av detta har att g\u00f6ra med hur klassen \u00e4r byggd, en del av detta har att g\u00f6ra med bak\u00e5tkompatibilitet och funktioner i PHP5.<\/p>\n<p>Detta betyder dock inte att vi inte kan identifiera vilka funktioner som kan markeras som <strong>abstrakta<\/strong>. Faktum \u00e4r att jag tror att det \u00e4r en fr\u00e5ga om vilka klasser som b\u00f6r g\u00f6ras abstrakta. Men f\u00f6rst, l\u00e5t oss definiera abstrakta funktioner.<\/p>\n<p><strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Fr\u00e5n manualen<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Vid \u00e4rvning fr\u00e5n en abstrakt klass m\u00e5ste alla metoder markerade som abstrakt i f\u00f6r\u00e4lderns klassdeklaration definieras av barnet; Dessutom m\u00e5ste dessa metoder definieras med samma (eller en mindre begr\u00e4nsad) synlighet.<\/p>\n<\/blockquote>\n<p>N\u00e4r du tittar p\u00e5 k\u00e4llan till v\u00e5r widget:<\/p>\n<pre><code>&lt;?php\nclass AcmeWidget extends WP_Widget \n{ \n    public function __construct() \n    {\n    }\n\n    public function widget($args, $instance) \n    {\n    }\n\n    public function form($instance)\n    {\n    }\n\n    public function update($newInstance, $oldInstance)\n    {\n    }\n}<\/code><\/pre>\n<p>Jag tycker att det \u00e4r r\u00e4ttvist att s\u00e4ga att <strong>formul\u00e4rfunktionen<\/strong> kan markeras som <strong>abstrakt<\/strong> eftersom den \u00e4r unik f\u00f6r v\u00e5r implementering. Ett annat s\u00e4tt att t\u00e4nka abstrakta funktioner ur en programmeringssynpunkt \u00e4r att fr\u00e5ga dig sj\u00e4lv: Vilka funktioner kommer att kr\u00e4va unik funktionalitet?<\/p>\n<p>Och i det h\u00e4r fallet \u00e4r <strong>formul\u00e4rfunktionen<\/strong> just det eftersom varje widget kommer att vara unikt annorlunda vad g\u00e4ller vad den renderar. Widgetfunktionen kan ocks\u00e5 markeras som abstrakt eftersom den matar ut inneh\u00e5llet i widgeten<strong>.<\/strong> Detta inneh\u00e5ll \u00e4r naturligtvis baserat p\u00e5 den funktionalitet vi har implementerat i v\u00e5r implementering.<\/p>\n<p>Dessutom s\u00e4ger sj\u00e4lva k\u00e4llkoden f\u00f6r klassen <strong>WP_Widget<\/strong> :<\/p>\n<blockquote>\n<p>funktion WP_Widget::widget() m\u00e5ste \u00e5sidos\u00e4ttas i en underklass.&#8217;<\/p>\n<\/blockquote>\n<p>Det \u00e4r just denna typ av funktion som b\u00f6r markeras som abstrakt. Eftersom PHP ger ett felmeddelande om en funktion \u00e4r markerad som abstrakt och inte implementerad. Vi beh\u00f6vde inga <strong>die<\/strong> function calls eller n\u00e5got liknande.<\/p>\n<p>De andra funktionerna beh\u00f6ver dock inte n\u00f6dv\u00e4ndigtvis markeras som abstrakta och h\u00e4r \u00e4r anledningen:<\/p>\n<ol>\n<li><strong>__construct<\/strong> kommer att anropa f\u00f6r\u00e4lderns konstruktor, p\u00e5 den mest grundl\u00e4ggande niv\u00e5n, och detta \u00e4r n\u00f6dv\u00e4ndigt f\u00f6r att initiera basklassen. Gl\u00f6m dock inte; vi kan l\u00e4gga till v\u00e5ra egenskaper till denna metod som \u00e4r unika f\u00f6r v\u00e5r klass.<\/li>\n<li><strong>update\u00a0<\/strong> anv\u00e4nder funktionalitet i den \u00f6verordnade klassen f\u00f6r att serialisera information.<\/li>\n<\/ol>\n<p>Vi har allts\u00e5 tv\u00e5 funktioner kvar som skulle kunna markeras som abstrakta i en mer modern iteration av klassen.<\/p>\n<h2>N\u00e4sta upp<\/h2>\n<p>Vid det h\u00e4r laget borde vi alla vara p\u00e5 samma sida n\u00e4r det g\u00e4ller objektorienterad kod. \u00c5tminstone s\u00e5 l\u00e5ngt vi kan komma igenom en rad blogginl\u00e4gg.<\/p>\n<p>Med b\u00f6rjan i n\u00e4sta inl\u00e4gg ska vi \u00e5terg\u00e5 till att skriva kod.<\/p>\n<p>Det vill s\u00e4ga, vi kommer att \u00e5terbes\u00f6ka <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplate<\/a><\/strong> och jag kommer att omstrukturera den i dess nuvarande tillst\u00e5nd f\u00f6r att anta mer moderna PHP-standarder.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161697-61e7280e064dc.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-161697-61e7280e064dc.png\" alt=\"WordPress-widgets: Uppt\u00e4ck objektorienterad programmering\"><\/a><\/p>\n<p>Jag ska dela med mig av \u00e4ndringarna jag g\u00f6r, motiveringarna till varf\u00f6r, och sedan ska jag ocks\u00e5 prata om vilken typ av widget vi ska bygga baserat p\u00e5 boilerplate (och vi kan g\u00f6ra det).<\/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>M\u00e5let \u00e4r att bev\u00e4pna dig med allt du beh\u00f6ver f\u00f6r att uppt\u00e4cka objektorienterade metoder b\u00e5de i detta API och andra.<\/p>\n","protected":false},"author":1,"featured_media":235594,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[901,807,724,868],"tags":[1173],"class_list":["post-230564","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-php-9","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230564","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=230564"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230564\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/235594"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230564"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230564"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230564"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}