{"id":229626,"date":"2022-11-21T17:02:00","date_gmt":"2022-11-21T14:02:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229626"},"modified":"2022-11-21T17:07:44","modified_gmt":"2022-11-21T14:07:44","slug":"de-andra-tvaa-pelarna-i-oop","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/de-andra-tvaa-pelarna-i-oop\/","title":{"rendered":"De andra tv\u00e5 pelarna i OOP"},"content":{"rendered":"\n<p>Som jag n\u00e4mnde i <strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/de-tvaa-foersta-pelarna-i-oop\/\" title=\"det f\u00f6rsta inl\u00e4gget i den h\u00e4r serien\">det f\u00f6rsta inl\u00e4gget i den h\u00e4r serien<\/a><\/strong>, kommer du ofta att h\u00f6ra om objektorienterad programmerings tre pelare. Du kanske ocks\u00e5 h\u00f6r om The Four Pillars of Object-Oriented Programming.<\/p>\n<p>Och det \u00e4r inte s\u00e5 att det \u00e4r totalt sju eller n\u00e5got liknande. Ist\u00e4llet handlar det mer om vad folk anser vara grundl\u00e4ggande f\u00f6r OOP: Finns det tre eller fyra stora koncept?<\/p>\n<p>Du kan ana fr\u00e5n f\u00f6reg\u00e5ende artikel (l\u00e5t vara titeln), jag tror att det finns fyra.<\/p>\n<p>Och i det h\u00e4r inl\u00e4gget kommer jag att t\u00e4cka de tv\u00e5 sista:<\/p>\n<ul>\n<li>Arv,<\/li>\n<li>och polymorfism<\/li>\n<\/ul>\n<p>Om du har gjort n\u00e5gon typ av objektorienterad programmering innan du l\u00e4ste den h\u00e4r artikeln, har du f\u00f6rmodligen h\u00f6rt talas om \u00e5tminstone en av dessa.<\/p>\n<p>Oavsett, l\u00e5t oss ta en titt p\u00e5 var och en av dem mer detaljerat.<\/p>\n<h2>Ytterligare tv\u00e5 pelare i OOP<\/h2>\n<p>Innan jag g\u00e5r in p\u00e5 var och en av dessa vill jag vara s\u00e4ker p\u00e5 att du \u00e4r med om vad vi hittills har t\u00e4ckt.<\/p>\n<h3>Ett ord om analys<\/h3>\n<p>Jag ska inte f\u00f6rtydliga po\u00e4ngen, men hela anledningen till att jag nu talar om objektorienterade grunder \u00e4r f\u00f6r att vi g\u00e5r in i en annan fas av detta material. Vi b\u00f6rjade med att t\u00e4cka <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-analysis\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">analysfasen<\/a><\/strong> som inkluderade:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/objektorienterad-programmering-i-wordpress-analys-del-1\/\" title=\"Analys, del 1\">Analys, del 1<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/objektorienterad-programmering-i-wordpress-analys-del-2\/\" title=\"Analys, del 2\">Analys, del 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/objektorienterad-programmering-i-wordpress-foerstaa-kundernas-foervaentningar\/\" title=\"F\u00f6rst\u00e5 kundernas f\u00f6rv\u00e4ntningar\">F\u00f6rst\u00e5 kundernas f\u00f6rv\u00e4ntningar<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/objektorienterad-programmering-i-wordpress-statement-of-work\/\" title=\"Arbetsbeskrivning\">Arbetsbeskrivning<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/objektorienterad-programmering-i-wordpress-regler-och-villkor\/\" title=\"Villkor\">Villkor<\/a><\/li>\n<\/ol>\n<h3>Nu till utveckling<\/h3>\n<p>Och nu \u00e4r vi vidare till <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">utvecklingsfasen<\/a><\/strong>. Vissa kanske kallar det fundamentals (men jag tycker att du inte kan g\u00f6ra bra utveckling utan grunderna s\u00e5 det finns det(.<\/p>\n<p>Om du inte har l\u00e4st <strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/de-tvaa-foersta-pelarna-i-oop\/\" title=\"det tidigare inl\u00e4gget\">det tidigare inl\u00e4gget<\/a><\/strong> rekommenderar jag att du g\u00f6r det innan du forts\u00e4tter eftersom det t\u00e4cker begreppen abstraktion, inkapsling och hur det relaterar till WordPress.<\/p>\n<h3>3 Arv<\/h3>\n<p>Begreppet arv \u00e4r ganska l\u00e4tt att f\u00f6lja. Det vill s\u00e4ga, en klass kan \u00e4rva attribut fr\u00e5n en annan klass. Jag ska ge n\u00e5gra exempel p\u00e5 detta om ett \u00f6gonblick, men l\u00e5t mig ge en fungerande definition f\u00f6r syftet med detta inl\u00e4gg:<\/p>\n<blockquote>\n<p>Arv h\u00e4nvisar till id\u00e9n att en klass, \u00e4ven om den har sin egen impementering, bokstavligen \u00e4rver egenskaper, funktioner och allm\u00e4n implementering fr\u00e5n en \u00f6verordnad klass.<\/p>\n<\/blockquote>\n<h4>Exempel 1: Ett dokument<\/h4>\n<p>I mycket enkla termer, l\u00e5t oss s\u00e4ga att du har en klass som heter Dokument och ett dokument har en titel och det har inneh\u00e5ll. Sedan finns det en underklass av dokument som har attribut f\u00f6r ett datum och en tid. Vi skulle kunna kalla detta ett PostDocument eller ett PageDocument.<\/p>\n<p>Det vill s\u00e4ga, PageDocument <strong>\u00e4rver<\/strong> dokumentets egenskaper och attribut samtidigt som det l\u00e4gger till sin egen implementering till det. Vettigt?<\/p>\n<p>Om inte, oroa dig inte. Det &quot;klickar&quot; inte alltid i b\u00f6rjan s\u00e5 l\u00e5t oss titta p\u00e5 ett annat exempel.<\/p>\n<h4>Exempel 2: Ett meddelande<\/h4>\n<p>L\u00e5t oss s\u00e4ga att vi har en meddelandeklass. Ett meddelande har vanligtvis tv\u00e5 egenskaper:<\/p>\n<ul>\n<li>1 en avs\u00e4ndare,<\/li>\n<li>2 En mottagare.<\/li>\n<\/ul>\n<p>Det \u00e4r r\u00e4ttvist att s\u00e4ga att det finns olika typer av meddelanden, eller hur? Det vill s\u00e4ga, kanske har vi ett e-postmeddelande eller kanske vi har ett textmeddelande.<\/p>\n<p>Ett e-postmeddelande har fortfarande en avs\u00e4ndare och har fortfarande en mottagare men det har s\u00e5 mycket mer, eller hur? Den har saker som:<\/p>\n<ul>\n<li>en \u00e4mnesrad,<\/li>\n<li>en valfri bilaga,<\/li>\n<li>en annan upps\u00e4ttning avs\u00e4ndare som den skickas till,<\/li>\n<li>st\u00f6d f\u00f6r att kopiera andra till meddelandet offentligt eller privat,<\/li>\n<li>och mycket mer.<\/li>\n<\/ul>\n<p>Ett textmeddelande \u00e5 andra sidan har inte n\u00f6dv\u00e4ndigtvis allt ovanst\u00e5ende. L\u00e5t oss anta att vi pratar om ett grundl\u00e4ggande SMS-meddelande (mot ett rikt textmeddelande i n\u00e5got som Hangouts, Telegram, iMessage eller vad som helst som finns d\u00e4r ute).<\/p>\n<p>Denna klass kommer att:<\/p>\n<ul>\n<li>vara bunden till ett telefonnummer,<\/li>\n<li>kan inkludera en grupp andra mottagare som alla \u00e4r offentliga,<\/li>\n<li>en operat\u00f6r (det vill s\u00e4ga en mobilleverant\u00f6r),<\/li>\n<li>ett maximalt antal tecken som den kan inneh\u00e5lla<\/li>\n<li>m\u00f6jligheten att dela upp ett enda meddelande i flera meddelanden om det maximala antalet tecken \u00f6verstiger ett visst antal tecken.<\/li>\n<\/ul>\n<p>Men det v\u00e4cker fortfarande fr\u00e5gor om egenskaper och metoder (eller, mer generellt, implementering, eller hur?)<\/p>\n<h4>Ett ord om implementering<\/h4>\n<p>N\u00e4r det kommer till objektorienterad programmering har vi vad vi kallar \u00e5tkomstmodifierare. Du kanske har l\u00e4st dem p\u00e5 annat h\u00e5ll som kallas f\u00f6r synlighetsmodifierare eller n\u00e5got liknande.<\/p>\n<p>Allt \u00e4r samma.<\/p>\n<p>Kort sagt kan dessa modifierare definieras som:<\/p>\n<blockquote>\n<p>Nyckelord som styr vad andra klasser har tillg\u00e5ng till informationen till hands.<\/p>\n<\/blockquote>\n<p>Lyckligtvis \u00e4r den h\u00e4r delen enkel att f\u00f6rst\u00e5:<\/p>\n<ul>\n<li><strong>privata<\/strong> egenskaper och funktioner \u00e4r endast tillg\u00e4ngliga f\u00f6r den klass d\u00e4r de \u00e4r definierade. Det betyder att PostDocument inte kan anv\u00e4nda n\u00e5got i Dokument som \u00e4r markerat som privat. PostDocument \u00e4r f\u00f6r all del inte ens medveten om att denna information finns.<\/li>\n<li><strong>skyddade<\/strong> egenskaper och funktioner \u00e4r tillg\u00e4ngliga f\u00f6r klassen d\u00e4r de \u00e4r definierade och alla klasser som \u00e4r en avkomling. Det vill s\u00e4ga alla klasser som \u00e4rver data fr\u00e5n basklassen eller f\u00f6r\u00e4lderklassen har tillg\u00e5ng till den. S\u00e5, till skillnad fr\u00e5n <strong>privata<\/strong> implementeringsdetaljer, kan PostDocument komma \u00e5t information fr\u00e5n Document om det \u00e4r markerat som skyddat.<\/li>\n<li><strong>offentliga<\/strong> fastigheter och funktioner \u00e4r tillg\u00e4ngliga f\u00f6r alla. Detta har egentligen ingenting med arv att g\u00f6ra, utan mer med inkapsling, om n\u00e5got. Ist\u00e4llet handlar det om att best\u00e4mma vad vi vill att andra objekt ska f\u00e5 tillg\u00e5ng till.<\/li>\n<\/ul>\n<p>S\u00e5 hur hanteras implementeringen? Detta varierar fr\u00e5n spr\u00e5k till spr\u00e5k, men PHP st\u00f6der inte det som kallas &quot;multipelt arv.&quot; Enkelt uttryckt kan en given klass i <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP bara \u00e4rva (eller ut\u00f6ka) en annan klass<\/a>. Inte flera klasser (vissa spr\u00e5k st\u00f6der detta).<\/p>\n<blockquote>\n<p>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>I v\u00e5rt exempel kan vi inte introducera en annan klass som WrittenDocument som \u00e4rver fr\u00e5n PageDocument s\u00e5v\u00e4l som PostDocument. Det \u00e4r antingen det ena eller det andra. Och det \u00e4r v\u00e4rt att notera att om det \u00e4rver fr\u00e5n PostDocument s\u00e5 \u00e4rver det ocks\u00e5 information fr\u00e5n Document eftersom det \u00e4r en underklass till en underklass av en klass.<\/p>\n<h3>4 Polymorfism<\/h3>\n<p>Nu n\u00e4r vi har en grundl\u00e4ggande definition av arv p\u00e5 plats, kan vi prata om polymorfism. Den goda nyheten \u00e4r att det \u00e4r ett stort, konstigt ord f\u00f6r ett v\u00e4ldigt enkelt koncept.<\/p>\n<p>Den d\u00e5liga nyheten \u00e4r att vi inte har pratat om gr\u00e4nssnitt eller abstrakta klasser. Dessa kommer men de anses vara en del av de fyra pelarna, s\u00e5 oroa dig inte f\u00f6r dem just nu.<\/p>\n<p>T\u00e4nk ist\u00e4llet p\u00e5 det s\u00e5 h\u00e4r:<\/p>\n<blockquote>\n<p>Polymorfism till\u00e5ter oss att referera till en klass av en typ n\u00e4r den kan deklareras som en annan typ.<\/p>\n<\/blockquote>\n<p>Det kan fortfarande vara f\u00f6rvirrande, men kommer du ih\u00e5g v\u00e5rt, s\u00e4g, meddelandeexempel ovan? Vi kan instansiera en SMSMessage-klass som <strong>ut\u00f6kar<\/strong> Message-klassen och sedan anropa vissa metoder p\u00e5 den.<\/p>\n<p>SMSMessage kan ha en metod som Message-klassen har. Och om klassen har instansierats som en instans av klassen SMSMessage, kommer den att anropa den metoden. P\u00e5 liknande s\u00e4tt, om den inte har en metod men dess \u00f6verordnade klass, Message, har det, kommer den att anropa den metoden.<\/p>\n<p>Ibland \u00e4r det l\u00e4ttast att f\u00f6rst\u00e5 detta i kod s\u00e5 l\u00e5t oss g\u00f6ra det.<\/p>\n<p>L\u00e5t oss f\u00f6rst definiera v\u00e5r <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-00-message-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">meddelandeklass<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\nclass Message\n{\n  public function send()\n  {\n    echo \"This message is sent from the Message class.n\";\n  }\n\n  public function receive()\n  {\n    echo \"This message was received from the Message class.n\";\n  }\n}\n<\/code><\/pre>\n<p>L\u00e5t oss sedan definiera v\u00e5r <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-01-smsmessage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SMSMessage-<\/a> klass. Observera att den inte har en <strong>receive()<\/strong> funktion. Detta kommer att vara viktigt f\u00f6r en stund:<\/p>\n<pre><code>&lt;?php\nclass SMSMessage extends Message\n{\n  public function send()\n  {\n    echo \"This message is sent from the SMSMessage class.n\";\n  }\n}<\/code><\/pre>\n<p>L\u00e5t oss nu <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-02-functionaldemo1-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">instansiera v\u00e5r Message<\/a><\/strong> -klass och anropa n\u00e5gra metoder:<\/p>\n<pre><code>&lt;?php\n$message = new Message();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>Och l\u00e5t oss g\u00f6ra samma sak <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-03-functionaldemo2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">med klassen SMSMessage:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n$message = new SMSMessage();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>Om du vill ha hela skriptet kan du se det <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e4r<\/a><\/strong>, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ladda ner<\/a> det och k\u00f6ra det lokalt.<\/p>\n<h2>Arv, polymorfism och WordPress<\/h2>\n<p>H\u00e4r \u00e4r take away (och vi kommer att utforska detta mer n\u00e4r vi kommer in p\u00e5 gr\u00e4nssnitt och abstrakta klasser): N\u00e4r en klass <strong>ut\u00f6kar<\/strong> en annan klass och den inte har de implementeringsdetaljer som dess \u00f6verordnade klass har, kommer f\u00f6r\u00e4lderns implementering att anv\u00e4ndas.<\/p>\n<p>Ett annat s\u00e4tt att t\u00e4nka p\u00e5 det \u00e4r &quot;att arbeta upp kommandokedjan.&quot; Det b\u00f6rjar med den klass som \u00e4r l\u00e4gst till vad vi har skapat. I v\u00e5rt exempel ovan \u00e4r det SMSMessage. Om den inte hittar den d\u00e4r kommer den att flytta upp till den klass den ut\u00f6kar. (Och om den inte hittar den d\u00e4r och den klassen ut\u00f6kar en klass, kommer den att f\u00f6rs\u00f6ka d\u00e4r.)<\/p>\n<p>Hela det polymorfa \u00e4r detta: Vi har instansierat en klass av en typ, SMSMessage, men den anv\u00e4nder implementeringen av en klass av en annan typ (som den \u00e4rver, ja, men det \u00e4r \u00e4nd\u00e5 annorlunda).<\/p>\n<h3>Skrivkurser p\u00e5 WordPress<\/h3>\n<p>Slutligen skulle jag vilja l\u00e4mna er med detta: Jag har n\u00e4mnt n\u00e5got liknande detta i f\u00f6rra inl\u00e4gget men jag vill upprepa det h\u00e4r.<\/p>\n<p>Oavsett hur m\u00e5nga av dessa begrepp WordPress core anv\u00e4nder spelar det ingen roll eftersom vi kan skriva h\u00f6gkvalitativ, objektorienterad kod p\u00e5 WordPress som interagerar med WordPress och som spelar bra med WordPress (och annan tredjepartskod \u2013 inte alltid, men m\u00e5nga g\u00e5nger).<\/p>\n<h2>Vad h\u00e4nder h\u00e4rn\u00e4st?<\/h2>\n<p>D\u00e4refter kommer vi att titta p\u00e5 gr\u00e4nssnitt och abstraktioner.<\/p>\n<p>Dessa \u00e4r fortfarande grundl\u00e4ggande f\u00f6r objektorienterad programmering, men om du har f\u00f6rst\u00e5tt de tv\u00e5 f\u00f6reg\u00e5ende inl\u00e4ggen \u00e4r du redo f\u00f6r en gedigen upplevelse av de kommande koncepten.<\/p>\n<p>Och om inte, oroa dig inte! Du kan alltid prata om det i kommentarerna eller s\u00e5 kan vi chatta om det mer via e-post.<\/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>H\u00e4r avslutar jag mina tv\u00e5 inl\u00e4gg om de fyra pelarna i OOP som t\u00e4cker arv och polymorfism tillsammans med en funktionell demo.<\/p>\n","protected":false},"author":1,"featured_media":164983,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[848,901,724],"tags":[1173],"class_list":["post-229626","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-koda","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229626","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=229626"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/164983"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=229626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=229626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=229626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}