{"id":349,"date":"2026-05-05T21:25:31","date_gmt":"2026-05-05T21:25:31","guid":{"rendered":"https:\/\/piotrswitlicki.pl\/?p=349"},"modified":"2026-05-05T21:28:46","modified_gmt":"2026-05-05T21:28:46","slug":"interface-vs-abstract-class-w-php-czym-sie-roznia-i-kiedy-uzywac","status":"publish","type":"post","link":"https:\/\/piotrswitlicki.pl\/pl\/2026\/05\/05\/interface-vs-abstract-class-w-php-czym-sie-roznia-i-kiedy-uzywac\/","title":{"rendered":"\ud83e\udde0 Interface vs Abstract Class w PHP \u2014 czym si\u0119 r\u00f3\u017cni\u0105 i kiedy u\u017cywa\u0107?"},"content":{"rendered":"<p>W PHP cz\u0119sto pojawia si\u0119 pytanie:<br><strong>kiedy u\u017cy\u0107 interfejsu, a kiedy klasy abstrakcyjnej?<\/strong><\/p>\n\n<p>Na pierwszy rzut oka robi\u0105 podobne rzeczy \u2014 ale maj\u0105 inne zastosowania.<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\ud83d\udd39 Co to jest interfejs?<\/h2>\n\n<p>Interfejs (<code>interface<\/code>) to <strong>kontrakt<\/strong>, kt\u00f3ry m\u00f3wi:<\/p>\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201eka\u017cda klasa musi mie\u0107 te metody\u201d<\/p>\n<\/blockquote>\n\n<p>Nie zawiera logiki (poza wyj\u0105tkami w nowszym PHP), tylko definicje.<\/p>\n\n<h3 class=\"wp-block-heading\">Przyk\u0142ad:<\/h3>\n\n<pre class=\"wp-block-code\"><code>interface PaymentMethod {<br>    public function pay(float $amount): void;<br>}<\/code><\/pre>\n\n<p>Klasa, kt\u00f3ra implementuje interfejs:<\/p>\n\n<pre class=\"wp-block-code\"><code>class CardPayment implements PaymentMethod {<br>    public function pay(float $amount): void {<br>        echo \"P\u0142ac\u0119 kart\u0105: $amount\";<br>    }<br>}<\/code><\/pre>\n\n<p>\ud83d\udc49 Interfejs m\u00f3wi <em>CO ma by\u0107 zrobione<\/em><br>\ud83d\udc49 ale nie m\u00f3wi <em>JAK<\/em><\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\ud83d\udd38 Co to jest klasa abstrakcyjna?<\/h2>\n\n<p>Klasa abstrakcyjna (<code>abstract class<\/code>) to:<\/p>\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201eszkielet klasy + cz\u0119\u015bciowa implementacja\u201d<\/p>\n<\/blockquote>\n\n<p>Mo\u017ce mie\u0107:<\/p>\n\n<ul class=\"wp-block-list\">\n<li>gotowe metody<\/li>\n\n\n\n<li>w\u0142a\u015bciwo\u015bci<\/li>\n\n\n\n<li>metody abstrakcyjne (do nadpisania)<\/li>\n<\/ul>\n\n<h3 class=\"wp-block-heading\">Przyk\u0142ad:<\/h3>\n\n<pre class=\"wp-block-code\"><code>abstract class Payment {<br>    protected string $currency = 'PLN';<br><br>    abstract public function pay(float $amount): void;<br><br>    public function logPayment(float $amount): void {<br>        echo \"Log: $amount {$this-&gt;currency}\";<br>    }<br>}<\/code><\/pre>\n\n<p>Klasa dziedzicz\u0105ca:<\/p>\n\n<pre class=\"wp-block-code\"><code>class BlikPayment extends Payment {<br>    public function pay(float $amount): void {<br>        echo \"P\u0142ac\u0119 Blikiem: $amount\";<br>    }<br>}<\/code><\/pre>\n\n<p>\ud83d\udc49 Klasa abstrakcyjna daje:<\/p>\n\n<ul class=\"wp-block-list\">\n<li>wsp\u00f3ln\u0105 logik\u0119<\/li>\n\n\n\n<li>wsp\u00f3lny stan<\/li>\n<\/ul>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\u2694\ufe0f Interface vs Abstract Class \u2014 r\u00f3\u017cnice<\/h2>\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Cecha<\/th><th>Interface<\/th><th>Abstract Class<\/th><\/tr><\/thead><tbody><tr><td>Implementacja metod<\/td><td>\u274c (zazwyczaj brak)<\/td><td>\u2705 mo\u017ce mie\u0107<\/td><\/tr><tr><td>W\u0142a\u015bciwo\u015bci<\/td><td>\u274c<\/td><td>\u2705<\/td><\/tr><tr><td>Dziedziczenie<\/td><td>wiele interfejs\u00f3w<\/td><td>tylko jedna klasa<\/td><\/tr><tr><td>Cel<\/td><td>kontrakt<\/td><td>baza + logika<\/td><\/tr><tr><td>S\u0142owo kluczowe<\/td><td><code>implements<\/code><\/td><td><code>extends<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\ud83e\udde0 Kiedy u\u017cywa\u0107 czego?<\/h2>\n\n<h3 class=\"wp-block-heading\">\u2705 U\u017cyj interfejsu gdy:<\/h3>\n\n<ul class=\"wp-block-list\">\n<li>chcesz narzuci\u0107 struktur\u0119<\/li>\n\n\n\n<li>r\u00f3\u017cne klasy robi\u0105 to samo na r\u00f3\u017cne sposoby<\/li>\n\n\n\n<li>np. r\u00f3\u017cne metody p\u0142atno\u015bci, logowania, API<\/li>\n<\/ul>\n\n<p>\ud83d\udc49 przyk\u0142ad:<\/p>\n\n<pre class=\"wp-block-code\"><code>StripePayment, PayPalPayment, CryptoPayment<\/code><\/pre>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h3 class=\"wp-block-heading\">\u2705 U\u017cyj klasy abstrakcyjnej gdy:<\/h3>\n\n<ul class=\"wp-block-list\">\n<li>masz wsp\u00f3ln\u0105 logik\u0119<\/li>\n\n\n\n<li>chcesz unikn\u0105\u0107 duplikacji kodu<\/li>\n\n\n\n<li>masz bazowy model systemu<\/li>\n<\/ul>\n\n<p>\ud83d\udc49 przyk\u0142ad:<\/p>\n\n<pre class=\"wp-block-code\"><code>BaseController, BaseRepository<\/code><\/pre>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\ud83d\udd25 Realny przyk\u0142ad z \u017cycia<\/h2>\n\n<p>System CRM:<\/p>\n\n<ul class=\"wp-block-list\">\n<li>interfejs:<\/li>\n<\/ul>\n\n<pre class=\"wp-block-code\"><code>interface Notification {<br>    public function send(string $message): void;<br>}<\/code><\/pre>\n\n<ul class=\"wp-block-list\">\n<li>implementacje:<\/li>\n<\/ul>\n\n<pre class=\"wp-block-code\"><code>EmailNotification<br>SMSNotification<br>SlackNotification<\/code><\/pre>\n\n<p>\ud83d\udc49 ka\u017cda dzia\u0142a inaczej, ale API jest wsp\u00f3lne<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\ud83d\udca1 TL;DR<\/h2>\n\n<ul class=\"wp-block-list\">\n<li><strong>interface = kontrakt<\/strong><\/li>\n\n\n\n<li><strong>abstract class = baza + logika<\/strong><\/li>\n<\/ul>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\ud83d\ude80 Podsumowanie<\/h2>\n\n<p>Nie wybierasz \u201eco lepsze\u201d.<\/p>\n\n<p>Wybierasz:<\/p>\n\n<ul class=\"wp-block-list\">\n<li><strong>interface \u2192 gdy chcesz elastyczno\u015b\u0107<\/strong><\/li>\n\n\n\n<li><strong>abstract class \u2192 gdy chcesz wsp\u00f3\u0142dzieli\u0107 kod<\/strong><\/li>\n<\/ul>\n\n<p>W dobrze zaprojektowanym systemie u\u017cywasz\u2026 obu.<\/p>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pagelayer_contact_templates":[],"_pagelayer_content":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-349","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"acf":[],"_links":{"self":[{"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/posts\/349","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/comments?post=349"}],"version-history":[{"count":2,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/posts\/349\/revisions"}],"predecessor-version":[{"id":351,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/posts\/349\/revisions\/351"}],"wp:attachment":[{"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/media?parent=349"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/categories?post=349"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/tags?post=349"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}