{"id":142,"date":"2013-04-08T09:48:55","date_gmt":"2013-04-08T07:48:55","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=142"},"modified":"2013-04-08T09:51:03","modified_gmt":"2013-04-08T07:51:03","slug":"php-type-hinting-abstraction-heritage-all-in-one","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-type-hinting-abstraction-heritage-all-in-one\/","title":{"rendered":"PHP : petit exemple m\u00ealant type-hint, abstraction et h\u00e9ritage."},"content":{"rendered":"<p>Nous allons \u00e9crire un tout petit <em>snippet<\/em> pour mettre en \u00e9vidence des concepts de base de la programmation orient\u00e9e objet. Le but ici est d&rsquo;utiliser l&rsquo;abstraction, l&rsquo;h\u00e9ritage, le typage (<em>type-hint<\/em>) et le principe de substitution de Liskov. Le tronc de notre arbre d&rsquo;h\u00e9ritage est ici la classe abstraite <em>Animal<\/em>; elle ne poss\u00e8de qu&rsquo;une seule fonction membre : communiquer.<\/p>\n<p>Pourquoi <em>communiquer<\/em> est une fonction abstraite (un prototype, donc) dans <em>Animal<\/em> ? Tout simplement parce qu&rsquo;un animal ne communique pas forc\u00e9ment comme un autre. Nous d\u00e9l\u00e9guons ici la responsabilit\u00e9 de l&rsquo;impl\u00e9mentation de cette m\u00e9thode aux classes filles d&rsquo;<em>Animal<\/em>.<\/p>\n<p>Nous avons ensuite deux classes concr\u00e8tes Chameau et Belette qui elles d\u00e9taillent la mani\u00e8re dont nos animaux communiquent: d\u00e8s lors qu&rsquo;elles d\u00e9rivent <em>Animal<\/em>, elles sont tenues d&rsquo;impl\u00e9menter la m\u00e9thode communiquer, ce qu&rsquo;elles font, chacune \u00e0 leur mani\u00e8re (le chameau blat\u00e8re tandis que la belette&#8230;belote, et oui !).<\/p>\n<p>Nous avons finalement une classe <em>Communicateur<\/em>, dont une variable d&rsquo;instance priv\u00e9e et nomm\u00e9e <em>_animal<\/em> va contenir l&rsquo;instance d&rsquo;Animal sur laquelle nous allons op\u00e9rer. Notez que nous avons forc\u00e9 le type de param\u00e8tre en disant \u00ab\u00a0Nous exigeons une instance de la classe Animal\u00a0\u00bb dans le constructeur de cette classe. C&rsquo;est une bonne chose que de ne pas accepter n&rsquo;importe quoi<\/p>\n<p>Souvenez-vous toujours de cette phrase de feu-<a href=\"http:\/\/www.wired.com\/wiredenterprise\/2012\/10\/joe-postel\/\" target=\"_blank\">Jon Postel<\/a> :<\/p>\n<blockquote><p>Be liberal in what you\u00a0accept, and conservative in what you send<\/p><\/blockquote>\n<p>Vous restez lib\u00e9ral dans ce que vous acceptez (tout en \u00e9tant il faut le dire un peu conservateur aussi, puisque vous contraignez le type malgr\u00e9 tout), vous acceptez tout ce qui est un Animal : donc, tout ce qui dans l&rsquo;arbre d&rsquo;h\u00e9ritage se situe dans les branches (et les feuilles) partant du tronc qui est <em>Animal<\/em>.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\r\nabstract class Animal {\r\n    abstract public function communiquer();\r\n}\r\n\r\nclass Chameau extends Animal{\r\n     public function communiquer() {\r\n         echo &quot;Je blat\u00e8re&quot;, PHP_EOL;\r\n     }\r\n}\r\n\r\nclass Belette extends Animal{\r\n    public function communiquer() {\r\n        echo &quot;Je belote&quot;, PHP_EOL;\r\n    }\r\n}\r\n\r\nclass Communicateur {\r\n\r\n    private $_animal;\r\n\r\n    public function __construct(Animal $animal) {\r\n        $this-&gt;_animal = $animal;\r\n    }\r\n\r\n    public function faireCommuniquer() {\r\n       $this-&gt;_animal-&gt;communiquer();\r\n    }\r\n}\r\n\r\n$communicateur = new Communicateur(new Belette);\r\n$communicateur-&gt;faireCommuniquer();\r\n\r\n$communicateur = new Communicateur(new Chameau);\r\n$communicateur-&gt;faireCommuniquer();\r\n\r\n<\/pre>\n<p>Une instance de la classe <em>Communicateur<\/em> a donc en composition un objet du super-type <em>Animal<\/em>. La seule m\u00e9thode de cette classe est <em>faireCommuniquer<\/em>, qui se base sur la m\u00e9thode <em>communiquer<\/em> de l&rsquo;instance d&rsquo;<em>Animal<\/em> (et classes filles) en composition. Lorsqu&rsquo;on appelle\u00a0<em>faireCommuniquer<\/em>\u00a0de Communicateur, on appelle en fait en coulisses Animal-&gt;communiquer.<\/p>\n<p>Nous garantissons que quelque soit l&rsquo;instance de la sous-classe d&rsquo;<em>Animal<\/em> pass\u00e9e en param\u00e8tre du constructeur de <em>Communicateur<\/em>, le comportement de <em>Communicateur<\/em> sera le m\u00eame&#8230;Cela ne vous rappelle pas un certain<a href=\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-principes-solid-expliquees-a-ma-fille\/\"> principe de substitution de Liskov<\/a> ?<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/chameau.jpg\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-148\" alt=\"chameau\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/chameau.jpg\" width=\"384\" height=\"261\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/chameau.jpg 384w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/chameau-300x203.jpg 300w\" sizes=\"(max-width: 384px) 100vw, 384px\" \/><\/a><\/p>\n<p>Source photo : <a href=\"http:\/\/www.20minutes.fr\/\" target=\"_blank\">20 Minutes<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous allons \u00e9crire un tout petit snippet pour mettre en \u00e9vidence des concepts de base de la programmation orient\u00e9e objet. Le but ici est d&rsquo;utiliser l&rsquo;abstraction, l&rsquo;h\u00e9ritage, le typage (type-hint) et le principe de substitution de Liskov. Le tronc de notre arbre d&rsquo;h\u00e9ritage est ici la classe abstraite Animal; elle ne poss\u00e8de qu&rsquo;une seule fonction [&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>PHP : petit exemple m\u00ealant type-hint, abstraction et h\u00e9ritage. - 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\/php-type-hinting-abstraction-heritage-all-in-one\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PHP : petit exemple m\u00ealant type-hint, abstraction et h\u00e9ritage. - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"Nous allons \u00e9crire un tout petit snippet pour mettre en \u00e9vidence des concepts de base de la programmation orient\u00e9e objet. Le but ici est d&rsquo;utiliser l&rsquo;abstraction, l&rsquo;h\u00e9ritage, le typage (type-hint) et le principe de substitution de Liskov. Le tronc de notre arbre d&rsquo;h\u00e9ritage est ici la classe abstraite Animal; elle ne poss\u00e8de qu&rsquo;une seule fonction [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-type-hinting-abstraction-heritage-all-in-one\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2013-04-08T07:48:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-04-08T07:51:03+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/chameau.jpg\" \/>\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\/php-type-hinting-abstraction-heritage-all-in-one\/\",\"url\":\"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-type-hinting-abstraction-heritage-all-in-one\/\",\"name\":\"PHP : petit exemple m\u00ealant type-hint, abstraction et h\u00e9ritage. - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2013-04-08T07:48:55+00:00\",\"dateModified\":\"2013-04-08T07:51:03+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-type-hinting-abstraction-heritage-all-in-one\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-type-hinting-abstraction-heritage-all-in-one\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-type-hinting-abstraction-heritage-all-in-one\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP : petit exemple m\u00ealant type-hint, abstraction et h\u00e9ritage.\"}]},{\"@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":"PHP : petit exemple m\u00ealant type-hint, abstraction et h\u00e9ritage. - 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\/php-type-hinting-abstraction-heritage-all-in-one\/","og_locale":"fr_FR","og_type":"article","og_title":"PHP : petit exemple m\u00ealant type-hint, abstraction et h\u00e9ritage. - La Fabrique de code - Tech blog","og_description":"Nous allons \u00e9crire un tout petit snippet pour mettre en \u00e9vidence des concepts de base de la programmation orient\u00e9e objet. Le but ici est d&rsquo;utiliser l&rsquo;abstraction, l&rsquo;h\u00e9ritage, le typage (type-hint) et le principe de substitution de Liskov. Le tronc de notre arbre d&rsquo;h\u00e9ritage est ici la classe abstraite Animal; elle ne poss\u00e8de qu&rsquo;une seule fonction [&hellip;]","og_url":"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-type-hinting-abstraction-heritage-all-in-one\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2013-04-08T07:48:55+00:00","article_modified_time":"2013-04-08T07:51:03+00:00","og_image":[{"url":"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/chameau.jpg"}],"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\/php-type-hinting-abstraction-heritage-all-in-one\/","url":"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-type-hinting-abstraction-heritage-all-in-one\/","name":"PHP : petit exemple m\u00ealant type-hint, abstraction et h\u00e9ritage. - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2013-04-08T07:48:55+00:00","dateModified":"2013-04-08T07:51:03+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"breadcrumb":{"@id":"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-type-hinting-abstraction-heritage-all-in-one\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-type-hinting-abstraction-heritage-all-in-one\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-type-hinting-abstraction-heritage-all-in-one\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PHP : petit exemple m\u00ealant type-hint, abstraction et h\u00e9ritage."}]},{"@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\/142"}],"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=142"}],"version-history":[{"count":8,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/142\/revisions"}],"predecessor-version":[{"id":150,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/142\/revisions\/150"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=142"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=142"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=142"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}