{"id":40,"date":"2013-04-03T21:20:50","date_gmt":"2013-04-03T19:20:50","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=40"},"modified":"2013-04-03T22:00:10","modified_gmt":"2013-04-03T20:00:10","slug":"les-classes-abstraites-en-php-partie-2","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/","title":{"rendered":"Les classes abstraites en PHP (partie 2)"},"content":{"rendered":"<p>Nous avons vu\u00a0pr\u00e9c\u00e9demment\u00a0que les classes abstraites \u00e9taient un bon moyen de <em>forcer<\/em> des impl\u00e9mentations dans les branches et les feuilles de l&rsquo;arbre d&rsquo;h\u00e9ritage et que c&rsquo;\u00e9tait aussi un moyen d&rsquo;interdire l&rsquo;instanciation de classes que l&rsquo;on juge trop \u00ab\u00a0g\u00e9n\u00e9riques\u00a0\u00bb (on s&rsquo;instancie pas un \u00ab\u00a0\u00eatre vivant\u00a0\u00bb, c&rsquo;est une notion trop abstraite, on aimerait plut\u00f4t instancier <em>Homme<\/em> ou <em>Baleine<\/em>).<\/p>\n<p>Une classe abstraite peut impl\u00e9menter une (ou des) interfaces :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\ninterface Reproduction {\r\n    public function seReproduire();\r\n}\r\n\r\ninterface Alimentation {\r\n    public function seNourrir();\r\n}\r\n<\/pre>\n<p><em>EtreVivant<\/em> est une classe abstraite donc rien ne l&rsquo;oblige \u00e0 impl\u00e9menter l&rsquo;int\u00e9gralit\u00e9 des fonctions (publiques, toujours !) impos\u00e9es par les interfaces\u00a0Reproduction et Alimentation, ce qui serait \u00e9videmment le cas si elle \u00e9tait concr\u00e8te. Comme dans la partie 1, elle d\u00e9l\u00e8gue cette obligation \u00e0 la premi\u00e8re classe concr\u00e8te qui va la d\u00e9river&#8230;<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\ninterface Reproduction {\r\n    public function seReproduire();\r\n}\r\n\r\ninterface Alimentation {\r\n    public function seNourrir();\r\n}\r\n\r\nabstract class EtreVivant implements Reproduction, Alimentation {}\r\n\r\nclass Baleine extends\u00a0EtreVivant {\r\n\r\n    public function seReproduire() {\r\n        \/\/ d\u00e9crivez ici de mani\u00e8re po\u00e9tique\r\n        \/\/ l'accouplement de ces majestueux animaux\r\n    }\r\n    public function seNourrir() {\r\n        echo &quot;Je mange du krill et du zooplancton&quot;, PHP_EOL;\r\n    }\r\n}\r\n<\/pre>\n<p>Bien entendu, une classe abstraite peut prendre en charge une partie de l&rsquo;impl\u00e9mentation des m\u00e9thodes impos\u00e9es par une interface et d\u00e9l\u00e9guer le reste \u00e0 ses filles&#8230;<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\ninterface Propulsion {\r\n    public function pedaler();\r\n}\r\n\r\ninterface Freinage {\r\n    public function freiner();\r\n}\r\n\r\nabstract class Velo implements Propulsion, Freinage {\r\n    public function pedaler() {\r\n        $this-&gt;mettrePiedsSurPedales();\r\n        $this-&gt;appuyerSurPedales();\r\n    }\r\n\r\n    public function mettrePiedsSurPedales() {\r\n        echo &quot;Je mets les pieds sur les p\u00e9dales&quot;, PHP_EOL;\r\n    }\r\n\r\n    public function appuyerSurPedales() {\r\n       echo &quot;J'appuie sur les p\u00e9dales&quot;, PHP_EOL;\r\n    }\r\n}\r\n\r\nclass BMX extends Velo {\r\n    public function freiner() {\r\n        echo &quot;Les patins appuient sur les roues&quot;, PHP_EOL;\r\n    }\r\n}\r\n\r\nclass VTTDernierCri extends Velo {\r\n    public function freiner() {\r\n        echo &quot;Les plaquettes appuient sur les disques&quot;, PHP_EOL;\r\n    }\r\n}\r\n<\/pre>\n<p><span style=\"line-height: 1.714285714; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; font-size: 1rem;\">Dans notre cas, <\/span><em style=\"line-height: 1.714285714; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; font-size: 1rem;\">Velo<\/em><span style=\"line-height: 1.714285714; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; font-size: 1rem;\">, qui est abstraite, a pris en charge une partie des m\u00e9thodes impos\u00e9es par les interfaces(impos\u00e9es&#8230;pas vraiment, puisqu&rsquo;elle est abstraite); elle a choisi d&rsquo;impl\u00e9menter <em>pedaler<\/em>, qui provient de l&rsquo;interface <em>Propulsion<\/em>. En effet, qu&rsquo;on conduise un v\u00e9lo de course, de descente, un BMX ou le tricycle d&rsquo;un enfant, on n&rsquo;y coupe pas : il faut p\u00e9daler, et toujours de la m\u00eame mani\u00e8re !<\/span><\/p>\n<p>Par contre le freinage peut \u00eatre d\u00e9l\u00e9gu\u00e9 aux filles car son impl\u00e9mentation va d\u00e9pendre directement de la classe concr\u00e8te&#8230;En effet un vieux v\u00e9lo ne freine pas forc\u00e9ment de la m\u00eame mani\u00e8re qu&rsquo;un nouveau (la plupart des nouveaux v\u00e9los ont des freins \u00e0 disques, les anciens &#8211; le mien \ud83d\ude41 &#8211; ont encore des freins \u00e0 \u00e9trier avec des patins&#8230;).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous avons vu\u00a0pr\u00e9c\u00e9demment\u00a0que les classes abstraites \u00e9taient un bon moyen de forcer des impl\u00e9mentations dans les branches et les feuilles de l&rsquo;arbre d&rsquo;h\u00e9ritage et que c&rsquo;\u00e9tait aussi un moyen d&rsquo;interdire l&rsquo;instanciation de classes que l&rsquo;on juge trop \u00ab\u00a0g\u00e9n\u00e9riques\u00a0\u00bb (on s&rsquo;instancie pas un \u00ab\u00a0\u00eatre vivant\u00a0\u00bb, c&rsquo;est une notion trop abstraite, on aimerait plut\u00f4t instancier Homme ou [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[3],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Les classes abstraites en PHP (partie 2) - La Fabrique de code - Tech blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Les classes abstraites en PHP (partie 2) - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"Nous avons vu\u00a0pr\u00e9c\u00e9demment\u00a0que les classes abstraites \u00e9taient un bon moyen de forcer des impl\u00e9mentations dans les branches et les feuilles de l&rsquo;arbre d&rsquo;h\u00e9ritage et que c&rsquo;\u00e9tait aussi un moyen d&rsquo;interdire l&rsquo;instanciation de classes que l&rsquo;on juge trop \u00ab\u00a0g\u00e9n\u00e9riques\u00a0\u00bb (on s&rsquo;instancie pas un \u00ab\u00a0\u00eatre vivant\u00a0\u00bb, c&rsquo;est une notion trop abstraite, on aimerait plut\u00f4t instancier Homme ou [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2013-04-03T19:20:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-04-03T20:00:10+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:creator\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:site\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/\",\"url\":\"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/\",\"name\":\"Les classes abstraites en PHP (partie 2) - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2013-04-03T19:20:50+00:00\",\"dateModified\":\"2013-04-03T20:00:10+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Les classes abstraites en PHP (partie 2)\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/\",\"name\":\"La Fabrique de code - Tech blog\",\"description\":\"PHP objet, MySQL, Design Patterns, OOP...et plus !\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"caption\":\"admin\"},\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Les classes abstraites en PHP (partie 2) - La Fabrique de code - Tech blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/","og_locale":"fr_FR","og_type":"article","og_title":"Les classes abstraites en PHP (partie 2) - La Fabrique de code - Tech blog","og_description":"Nous avons vu\u00a0pr\u00e9c\u00e9demment\u00a0que les classes abstraites \u00e9taient un bon moyen de forcer des impl\u00e9mentations dans les branches et les feuilles de l&rsquo;arbre d&rsquo;h\u00e9ritage et que c&rsquo;\u00e9tait aussi un moyen d&rsquo;interdire l&rsquo;instanciation de classes que l&rsquo;on juge trop \u00ab\u00a0g\u00e9n\u00e9riques\u00a0\u00bb (on s&rsquo;instancie pas un \u00ab\u00a0\u00eatre vivant\u00a0\u00bb, c&rsquo;est une notion trop abstraite, on aimerait plut\u00f4t instancier Homme ou [&hellip;]","og_url":"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2013-04-03T19:20:50+00:00","article_modified_time":"2013-04-03T20:00:10+00:00","author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/","url":"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/","name":"Les classes abstraites en PHP (partie 2) - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2013-04-03T19:20:50+00:00","dateModified":"2013-04-03T20:00:10+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"breadcrumb":{"@id":"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-classes-abstraites-en-php-partie-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Les classes abstraites en PHP (partie 2)"}]},{"@type":"WebSite","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website","url":"http:\/\/www.lafabriquedecode.com\/blog\/","name":"La Fabrique de code - Tech blog","description":"PHP objet, MySQL, Design Patterns, OOP...et plus !","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162","name":"admin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/","url":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","contentUrl":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","caption":"admin"},"url":"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/40"}],"collection":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/comments?post=40"}],"version-history":[{"count":14,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/40\/revisions"}],"predecessor-version":[{"id":47,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/40\/revisions\/47"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=40"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=40"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=40"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}