{"id":229586,"date":"2022-11-23T19:49:00","date_gmt":"2022-11-23T16:49:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229586"},"modified":"2022-11-23T19:55:00","modified_gmt":"2022-11-23T16:55:00","slug":"szczegolowe-spojrzenie-na-polimorfizm","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/szczegolowe-spojrzenie-na-polimorfizm\/","title":{"rendered":"Szczeg\u00f3\u0142owe spojrzenie na polimorfizm"},"content":{"rendered":"\n<p>Kiedy zaczyna\u0142em t\u0119 seri\u0119, m\u00f3wi\u0142em o czterech filarach programowania obiektowego. Ka\u017cdy z tych temat\u00f3w jest wymieniony i po\u0142\u0105czony poni\u017cej.<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/pierwsze-dwa-filary-oop\/\" title=\"Abstrakcja\">Abstrakcja<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/pierwsze-dwa-filary-oop\/\" title=\"Kapsu\u0142kowanie\">Kapsu\u0142kowanie<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/drugie-dwa-filary-oop\/\" title=\"Dziedzictwo\">Dziedzictwo<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/drugie-dwa-filary-oop\/\" title=\"Wielopostaciowo\u015b\u0107\">Wielopostaciowo\u015b\u0107<\/a><\/strong><\/li>\n<\/ol>\n<p>W tym momencie normalnie chcia\u0142bym przej\u015b\u0107 do nast\u0119pnego tematu. Jednak zanim to zrobi\u0119, chcia\u0142bym po\u015bwi\u0119ci\u0107 jeszcze jeden post na badanie poj\u0119cia polimorfizmu.<\/p>\n<p>W swojej dotychczasowej karierze widzia\u0142em kilka temat\u00f3w, kt\u00f3re przysparzaj\u0105 osobom zajmuj\u0105cym si\u0119 programowaniem obiektowym wi\u0119cej zamieszania i problem\u00f3w ni\u017c polimorfizm. Dlatego chcia\u0142bym om\u00f3wi\u0107 to nieco bardziej szczeg\u00f3\u0142owo w kontek\u015bcie programowania obiektowego i poza konkretnym frameworkiem lub aplikacj\u0105 (jak WordPress).<\/p>\n<p>W tym po\u015bcie zrobi\u0119 szybki przegl\u0105d tego, co om\u00f3wili\u015bmy do tej pory, a nast\u0119pnie wskocz\u0119 z powrotem do polimorfizmu.<\/p>\n<h2>Polimorfizm dog\u0142\u0119bny<\/h2>\n<p>Po pierwsze, jak wspomniano, chc\u0119 szybko przejrze\u0107 to, co zosta\u0142o om\u00f3wione do tej pory, zw\u0142aszcza je\u015bli przeoczy\u0142e\u015b kt\u00f3rykolwiek z poprzednich post\u00f3w.<\/p>\n<p>Nie martw si\u0119: nic poni\u017cej nie wnika w kod. Zamiast tego po prostu definiuje terminy, kt\u00f3rych u\u017cyli\u015bmy, wi\u0119c masz pewne poj\u0119cie o tym, do czego mam na my\u015bli, gdy zobaczysz s\u0142owo pojawiaj\u0105ce si\u0119 w tej serii.<\/p>\n<h3>Abstrakcja<\/h3>\n<blockquote>\n<p>Abstrahujemy ide\u0119 czego\u015b w klas\u0119. Zamiast tego b\u0119dziemy abstrahowa\u0107 pomys\u0142y do \u200b\u200bich klas. I tutaj jest kluczowa idea: klasa powinna reprezentowa\u0107 rzeczownik.<\/p>\n<\/blockquote>\n<h3>Kapsu\u0142kowanie<\/h3>\n<blockquote>\n<p>Enkapsulacja to tak naprawd\u0119 tylko \u201edu\u017ce&quot; s\u0142owo, kt\u00f3re odnosi si\u0119 do idei zarz\u0105dzania swoimi obowi\u0105zkami (lub \u015bledzenia swoich danych).<\/p>\n<\/blockquote>\n<h3>Dziedzictwo<\/h3>\n<blockquote>\n<p>Dziedziczenie odnosi si\u0119 do idei, \u017ce jedna klasa, chocia\u017c ma w\u0142asn\u0105 implementacj\u0119, dos\u0142ownie dziedziczy w\u0142a\u015bciwo\u015bci, funkcje i og\u00f3ln\u0105 implementacj\u0119 z klasy nadrz\u0119dnej.<\/p>\n<\/blockquote>\n<h3>Wielopostaciowo\u015b\u0107<\/h3>\n<blockquote>\n<p>Polimorfizm pozwala nam odnosi\u0107 si\u0119 do klasy jednego typu, kiedy mo\u017ce by\u0107 zadeklarowana jako inny typ.<\/p>\n<\/blockquote>\n<p>Maj\u0105c to na uwadze, my\u015bl\u0119, \u017ce tutaj sprawy mog\u0105 si\u0119 nieco bardziej skomplikowa\u0107. W poprzednich postach poda\u0142em szereg r\u00f3\u017cnych przyk\u0142ad\u00f3w kodu (i zach\u0119cam do spojrzenia na nie).<\/p>\n<p>Ale w dzisiejszym po\u015bcie spr\u00f3buj\u0119 zbada\u0107 t\u0119 ide\u0119 nieco dalej, zar\u00f3wno w wyja\u015bnieniu, jak i w kodzie.<\/p>\n<h2>Odnosz\u0105ce si\u0119 do dziedziczenia<\/h2>\n<p>Je\u015bli w tym momencie nie jest to oczywiste, polimorfizm jest silnie zwi\u0105zany z dziedziczeniem. Pomy\u015bl o tym w ten spos\u00f3b: Je\u015bli jedna klasa dziedziczy w\u0142a\u015bciwo\u015bci i metody z innej klasy, to mo\u017ce \u201ezast\u0105pi\u0107&#8221; klasy nadrz\u0119dnej.<\/p>\n<p>Oznacza to, \u017ce je\u015bli masz co\u015b takiego jak\u00a0 klasa <strong>Content<\/strong>, a nast\u0119pnie masz dwie podklasy, jedn\u0105 b\u0119d\u0105c\u0105 <strong>Postem<\/strong>, a drug\u0105 b\u0119d\u0105c\u0105 <strong>Page<\/strong>, mo\u017cesz utworzy\u0107 instancj\u0119 klasy, u\u017cywaj\u0105c odwo\u0142ania do <strong>Content<\/strong> type.t<\/p>\n<p>Ale w czasie wykonywania b\u0119dzie to faktycznie instancja\u00a0 typu <strong>Post<\/strong>. Ma sens? Oto przyk\u0142adowy kod.<\/p>\n<p>Najpierw zaczniemy od zdefiniowania\u00a0 klasy <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-00-content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Content<\/a> :<\/p>\n<pre><code>&lt;?php\nclass Content {\n\n   protected $title;\n\n   protected $content;\n\n   protected $metadata;\n\n   public function __construct()\n   {\n     $this-&gt;title = \"Hello World!\";\n     $this-&gt;content = \"This is a sample piece of content.\";\n     $this-&gt;metadata = \"&lt;This is the metadata of the post.&gt;\";\n   }\n\n   public function getTitle()\n   {\n     return $this-&gt;title;\n   }\n\n   public function getContent()\n   {\n     return $this-&gt;content;\n   }\n\n   public function getMetadata()\n   {\n     return $this-&gt;metadata;\n   }\n }\n<\/code><\/pre>\n<p>Ma og\u00f3lne w\u0142a\u015bciwo\u015bci, kt\u00f3rych prawdopodobnie oczekujesz \u2013 tytu\u0142, tre\u015b\u0107 i metadane. To prawda, \u017ce \u200b\u200bte w\u0142a\u015bciwo\u015bci s\u0105 tylko ci\u0105gami, ale mog\u0105 by\u0107 bardziej rozbudowanymi strukturami danych w sytuacji rzeczywistej.<\/p>\n<p>Teraz sp\u00f3jrzmy na <strong>post<\/strong> :<\/p>\n<pre><code>&lt;?php\n\nclass Post extends Content  {\n\n   private $author;\n\n   public function __construct() {\n     parent::__construct();\n     $this-&gt;author = \"Tom McFarlin\";\n   }\n\n   public function getAuthor()\n   {\n     return $this-&gt;author;\n   }\n }\n<\/code><\/pre>\n<p>Co si\u0119 stanie, je\u015bli wywo\u0142asz metod\u0119 w\u00a0 klasie <strong>Post<\/strong>, tak\u0105 jak <strong>getTitle<\/strong>, kt\u00f3ra nie istnieje, ale istnieje w\u00a0 klasie <strong>Content<\/strong>? Nast\u0119pnie ze wzgl\u0119du na dziedziczenie b\u0119dzie szuka\u0107 metody w <strong>Post<\/strong>, a nie znale\u017a\u0107 jej, a nast\u0119pnie zacznie szuka\u0107 jej w <strong>Content<\/strong>.<\/p>\n<p>Je\u015bli zostanie znaleziony, uruchomi go.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164720-61e76b6c3e3d0.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-164720-61e76b6c3e3d0.png\" alt=\"Szczeg\u00f3\u0142owe spojrzenie na polimorfizm\"><\/a><\/p>\n<p>Podobnie mo\u017cemy zrobi\u0107 co\u015b takiego z klas\u0105 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-02-page-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Page i danymi zawarto\u015bci.<\/a> Najpierw tworzymy instancj\u0119 klasy bazowej, a nast\u0119pnie ustawiamy w\u0142a\u015bciwo\u015bci specyficzne dla <strong>Page<\/strong>. W tym przypadku b\u0119dzie to kategoria.<\/p>\n<pre><code>&lt;?php\n\nclass Page extends Content  {\n\n   private $category;\n\n   public function __construct() {\n     parent::__construct();\n     $this-&gt;category = \"Articles\";\n   }\n\n   public function getCategory()\n   {\n     return $this-&gt;category;\n   }\n }\n<\/code><\/pre>\n<p>Teraz, gdy uruchomimy kod, mo\u017cemy zacz\u0105\u0107 od <strong>zawarto\u015bci:<\/strong><\/p>\n<pre><code>&lt;?php\n\n$content = new Content();\necho $content-&gt;getTitle();<\/code><\/pre>\n<p>Zwr\u00f3\u0107 uwag\u0119, \u017ce wygl\u0105da to tak, jak by\u015bmy si\u0119 spodziewali, poniewa\u017c mamy tytu\u0142 i zawarto\u015b\u0107. Sp\u00f3jrzmy te\u017c na <strong>Post<\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ These will work because they reside in the Content base class.\n$post = new Post();\necho $post-&gt;getAuthor();\necho $post-&gt;getTitle();<\/code><\/pre>\n<p>To dzia\u0142a, poniewa\u017c mamy autora, ale mamy te\u017c tytu\u0142, poniewa\u017c znajduje si\u0119 on w <strong>tre\u015bci<\/strong>. Ale je\u015bli spr\u00f3bujemy wywo\u0142a\u0107 <strong>getAuthor<\/strong> na instancji <strong>Post?<\/strong><\/p>\n<pre><code>&lt;?php\n\n\/\/ These will work because they reside in the Content base class.\n$post = new Post();\necho $post-&gt;getAuthor();\necho $post-&gt;getTitle();<\/code><\/pre>\n<p>Otrzymamy b\u0142\u0105d, poniewa\u017c metoda nie znajduje si\u0119 w tej klasie.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164720-61e76b6f7949a.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-164720-61e76b6f7949a.png\" alt=\"Szczeg\u00f3\u0142owe spojrzenie na polimorfizm\"><\/a><\/p>\n<p>Wi\u0119c co mamy zrobi\u0107? Poniewa\u017c nie mamy silnych typ\u00f3w w PHP, nie mo\u017cemy rzutowa\u0107 go na inny typ.<\/p>\n<p>Istniej\u0105 na to wzorce projektowe, kt\u00f3re om\u00f3wi\u0119 w przysz\u0142ych wpisach, ale PHP nie pozwala na to tak \u0142atwo, jak niekt\u00f3re inne j\u0119zyki (takie jak C# lub Java).<\/p>\n<h2>Pytania dotycz\u0105ce polimorfizmu<\/h2>\n<p>Mamy nadziej\u0119, \u017ce powy\u017cszy kod daje wyobra\u017cenie o tym, w jaki spos\u00f3b konkretny typ, taki jak <strong>Post\u00a0<\/strong> lub <strong>Page<\/strong>, mo\u017ce niejawnie mie\u0107 w\u0142a\u015bciwo\u015bci i metody swojej klasy bazowej <strong>Content<\/strong>, u\u017cywanej w czasie wykonywania.<\/p>\n<p>Ale rodzi te\u017c kilka pyta\u0144, prawda? Na przyk\u0142ad:<\/p>\n<ul>\n<li><strong>Dlaczego polimorfizm jest przydatny?<\/strong> Ostatecznie jest to kwestia elastyczno\u015bci. Oznacza to, \u017ce mo\u017cesz napisa\u0107 og\u00f3lny\u00a0 typ <strong>tre\u015bci<\/strong>, a nast\u0119pnie utworzy\u0107 <strong>post<\/strong> lub <strong>stron\u0119<\/strong>, jak widzieli\u015bmy powy\u017cej. Daje nam to wszystkie zalety\u00a0 klasy <strong>Content<\/strong>, jednocze\u015bnie daj\u0105c nam na przyk\u0142ad specyfik\u0119\u00a0 klasy <strong>Post<\/strong>.<\/li>\n<li><strong>Wydaje si\u0119 to bardziej myl\u0105ce ni\u017c elastyczne.<\/strong> W pewnym sensie jest to myl\u0105ce, poniewa\u017c kod wymaga troch\u0119 \u015bledzenia. Oznacza to, \u017ce mo\u017cesz zacz\u0105\u0107 od\u00a0 klasy <strong>Post<\/strong> i musisz sprawdzi\u0107, co oferuje klasa <strong>Content .<\/strong> Z drugiej strony u\u0142atwia to r\u00f3wnie\u017c wprowadzenie nowej\u00a0 podklasy <strong>Content<\/strong>, a nast\u0119pnie u\u017cywanie jej, gdy jest najbardziej odpowiednia w czasie wykonywania.<\/li>\n<\/ul>\n<p>Je\u015bli chodzi o odwo\u0142ywanie si\u0119 do nadklas i podklas, w tym miejscu w gr\u0119 wchodzi solidne IDE.<\/p>\n<p>Oczywi\u015bcie fajnie jest mie\u0107 edytor, kt\u00f3ry ci si\u0119 podoba, ale posiadanie takiego, kt\u00f3ry mo\u017ce intuicyjnie okre\u015bli\u0107, co jest klas\u0105 nadrz\u0119dn\u0105, co jest klas\u0105 bazow\u0105 itp., mo\u017ce znacznie pom\u00f3c w \u015bledzeniu, debugowaniu, \u015bledzeniu i pisaniu nowych kod.<\/p>\n<p>Ale to ju\u017c tre\u015b\u0107 na kolejny post, kt\u00f3ry pojawi si\u0119 po tym, jak porozmawiamy o wzorcach projektowych.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Przyjrzyjmy si\u0119 dog\u0142\u0119bnie polimorfizmowi, aby uzyska\u0107 ja\u015bniejsze poj\u0119cie o tym, jak dzia\u0142a i dlaczego jest korzystny.<\/p>\n","protected":false},"author":1,"featured_media":223973,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,805,845],"tags":[1169],"class_list":["post-229586","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-php-7","category-samouczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229586","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=229586"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229586\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229586"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229586"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229586"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}