{"id":1027,"date":"2015-09-02T14:58:24","date_gmt":"2015-09-02T12:58:24","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=1027"},"modified":"2015-09-02T14:58:24","modified_gmt":"2015-09-02T12:58:24","slug":"php-7-le-typage-strict","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/","title":{"rendered":"PHP 7 : le typage strict"},"content":{"rendered":"<p>Une des grandes forces de PHP &#8211; qui est aussi, h\u00e9las !, une de ses plus grandes faiblesses &#8211; est l&rsquo;absence de <strong>typage<\/strong> <strong>fort<\/strong> comme c&rsquo;est le cas en Java, en C#, C++ ou dans bien d&rsquo;autres langages dits \u00ab\u00a0orient\u00e9s objet\u00a0\u00bb. PHP s&rsquo;occupe de faire les conversions de type qui l&rsquo;arrangent, notamment lorsque l&rsquo;on effectue des comparaisons entre des types diff\u00e9rents (voil\u00e0 pourquoi les op\u00e9rateurs stricts ont \u00e9t\u00e9 introduits qui comparent en valeur et surtout en type). Tout \u00e7a est d\u00e9cid\u00e9 de fa\u00e7on dynamique au <em>runtime<\/em> (\u00e0 l&rsquo;ex\u00e9cution, en bon fran\u00e7ais) et non pas de fa\u00e7on statique, \u00e0 la compilation.<\/p>\n<div id=\"attachment_1033\" style=\"width: 560px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/09\/Future-Gen-Z-coder.jpg\"><img aria-describedby=\"caption-attachment-1033\" loading=\"lazy\" class=\"size-full wp-image-1033\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/09\/Future-Gen-Z-coder.jpg\" alt=\"Une nouveaut\u00e9 qui fait des heureuses !\" width=\"550\" height=\"366\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/09\/Future-Gen-Z-coder.jpg 550w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/09\/Future-Gen-Z-coder-300x200.jpg 300w\" sizes=\"(max-width: 550px) 100vw, 550px\" \/><\/a><p id=\"caption-attachment-1033\" class=\"wp-caption-text\">Une nouveaut\u00e9 qui fait des heureuses !<\/p><\/div>\n<p>Depuis les versions 5.X, on pouvait d\u00e9j\u00e0 typer des param\u00e8tres de fonction avec certains types non-scalaires : <em>objet<\/em> depuis 5.0 et <em>array<\/em> depuis 5.1 (et <em>callable<\/em> par la suite, mais passons&#8230;). Dans des temps recul\u00e9s (avant 5.X), on n&rsquo;avait pas trop le choix:<br \/>\n<code>function peuimporte ($param, $reparam) {<br \/>\nvar_dump($param);<br \/>\nvar_dump($reparam);<br \/>\n}<br \/>\n<\/code><\/p>\n<p>L&rsquo;appel de cette fonction pouvait se faire avec des arguments de divers types : entiers, flottants, tableaux, objets, cha\u00eenes de caract\u00e8res&#8230;Pour faire court, on pouvait un peu passer tout et (surtout) n&rsquo;importe quoi !<br \/>\n<code><br \/>\npeuimporte (1, 1.23);<br \/>\npeuimporte (\"a\", 1);<br \/>\npeuimporte (array(), new StdClass());<br \/>\n<\/code><\/p>\n<blockquote><p>Un type scalaire est un type qui ne contient qu&rsquo;une valeur \u00e0 la fois: un entier, une chaine de caract\u00e8res, un bool\u00e9en etc. Un type non scalaire peut contenir plusieurs valeurs; un tableau, un objet&#8230;ce sont des types composites &#8211; ou des collections de valeurs.<\/p><\/blockquote>\n<p>Depuis PHP 5.1 disais-je, on pouvait forcer le typage des param\u00e8tres des fonctions avec des types non scalaires comme un tableau:<\/p>\n<p><code><br \/>\nfunction peuimporte (Array $param) {<br \/>\n\/\/ faites ce que bon vous semble<br \/>\n}<br \/>\n<\/code><\/p>\n<p>ou bien un objet d&rsquo;un type particulier:<\/p>\n<p><code><br \/>\nclass UnTypeAuPif {}<br \/>\nfunction peuimporte (UnTypeAuPif $param) {<br \/>\n\/\/ faites ce que bon vous semble<br \/>\n}<br \/>\n<\/code><\/p>\n<p>ou encore d&rsquo;un super-type, comme une interface:<\/p>\n<p><code><br \/>\ninterface Bidon {}<br \/>\nclass UnTypeAuPif implements Bidon {}<br \/>\nclass UnAutreTypeAuPif implements Bidon {}<br \/>\nfunction peuimporte (Bidon $param) {<br \/>\n\/\/ faites ce que bon vous semble<br \/>\n}<br \/>\n<\/code><\/p>\n<p>Il suffit alors de passer en argument une instance qui ne se conforme pas aux sp\u00e9cifications que constitue la signature de notre fonction et VLAN!<\/p>\n<p><code><br \/>\nCatchable fatal error: Argument 1 passed to peuimporte() must be an instance of UnTypeAuPif, instance of stdClass given<br \/>\n<\/code><\/p>\n<p>Ici j&rsquo;ai tent\u00e9 de r\u00e9aliser l&rsquo;invocation suivante :<code><br \/>\npeuimporte(new StdClass);<br \/>\n<\/code><\/p>\n<p>J&rsquo;ai all\u00e9grement viol\u00e9 le contrat qui me lie \u00e0 cette fonction et qui stipule qu&rsquo;il ne faut passer que des instances de UnTypeAuPif (dans le premier exemple).<\/p>\n<p>Depuis mars 2015 (et une RFC qui a fait l&rsquo;objet d&rsquo;un d\u00e9bat, puis d&rsquo;un vote) il est donc pr\u00e9vu que PHP 7 nous donne la possibilit\u00e9 de sp\u00e9cifier des types scalaires pour nos arguments&#8230;ENFIN ! Il deviendra donc possible d&rsquo;\u00e9crire:<\/p>\n<p><code><br \/>\nfunction peuimporte (<strong>int<\/strong> $param) {<br \/>\n\/\/ faites ce que bon vous semble<br \/>\n}<br \/>\n<\/code><\/p>\n<p>ou bien:<\/p>\n<p><code><br \/>\nfunction peuimporte (<strong>string<\/strong> $param) {<br \/>\n\/\/ faites ce que bon vous semble<br \/>\n}<br \/>\n<\/code><\/p>\n<p>ou encore:<\/p>\n<p><code><br \/>\nfunction peuimporte (<strong>float<\/strong> $param) {<br \/>\n\/\/ faites ce que bon vous semble<br \/>\n}<br \/>\n<\/code><\/p>\n<p>Le fait de passer en argument d&rsquo;un appel une variable du mauvais type provoque une erreur fatale, par exemple:<\/p>\n<p><code><br \/>\nFatal error: Uncaught TypeError: Argument 1 passed to peuimporte() must be of the type float, string given<br \/>\n<\/code><\/p>\n<p>Pour activer ce typage strict sous PHP 7, il faut utiliser <em>declare<\/em> que l&rsquo;on connait depuis 5.3 et qui sert lors de la compilation du fichier. Ce <em>language construct<\/em> sera plac\u00e9 en tout d\u00e9but de fichier (sous peine de provoquer une erreur fatale)\u00a0 comme suit:<\/p>\n<p><code><br \/>\ndeclare(strict_types = 1);<br \/>\nfunction peuimporte (float $param) {<br \/>\n\/\/ TODO<br \/>\n}<br \/>\npeuimporte(1.23);<\/code><\/p>\n<p>Notez que le mode bloc, originellement propos\u00e9 pour <code>strict_types<\/code> , a \u00e9t\u00e9 interdit dans PHP 7. Cette fonctionnalit\u00e9 n&rsquo;est pas forc\u00e9e par d\u00e9faut, nul risque donc de <em>BC break<\/em> dans le code existant. L&rsquo;aspect l\u00e2che du typage en PHP reste encore la r\u00e8gle (pour combien de temps ?), ce qui continuera de faciliter l&rsquo;int\u00e9gration des gens qui ne sont pas des d\u00e9veloppeurs de formation.<\/p>\n<p>Pour les d\u00e9veloppeurs qui viennent du monde des langages fortement typ\u00e9s et qui se sentent frustr\u00e9s par le typage faible de PHP, c&rsquo;est une bonne nouvelle et sans doute une raison de plus de cesser de prendre PHP pour un langage de seconde zone.<\/p>\n<p>Il me tarde que PHP 7 fasse l&rsquo;objet d&rsquo;une <em>release<\/em> officielle pour b\u00e9n\u00e9ficier de cette tant attendue fonctionnalit\u00e9 !<\/p>\n<p>Test\u00e9 avec un PHP7 b\u00eata compil\u00e9 sur Debian Jessie&#8230;et approuv\u00e9 !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Une des grandes forces de PHP &#8211; qui est aussi, h\u00e9las !, une de ses plus grandes faiblesses &#8211; est l&rsquo;absence de typage fort comme c&rsquo;est le cas en Java, en C#, C++ ou dans bien d&rsquo;autres langages dits \u00ab\u00a0orient\u00e9s objet\u00a0\u00bb. PHP s&rsquo;occupe de faire les conversions de type qui l&rsquo;arrangent, notamment lorsque l&rsquo;on effectue [&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":[40,14,3,29],"tags":[4,86],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PHP 7 : le typage strict - La Fabrique de code - Tech blog<\/title>\n<meta name=\"description\" content=\"Le typage strict est une des nouveaut\u00e9s qui figurera dans la version 7 de PHP et aidera les programmeurs venant des langages fortement typ\u00e9s \u00e0 l&#039;adopter.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PHP 7 : le typage strict - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"Le typage strict est une des nouveaut\u00e9s qui figurera dans la version 7 de PHP et aidera les programmeurs venant des langages fortement typ\u00e9s \u00e0 l&#039;adopter.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-09-02T12:58:24+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/09\/Future-Gen-Z-coder.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=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/\",\"name\":\"PHP 7 : le typage strict - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2015-09-02T12:58:24+00:00\",\"dateModified\":\"2015-09-02T12:58:24+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"description\":\"Le typage strict est une des nouveaut\u00e9s qui figurera dans la version 7 de PHP et aidera les programmeurs venant des langages fortement typ\u00e9s \u00e0 l'adopter.\",\"breadcrumb\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP 7 : le typage strict\"}]},{\"@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 7 : le typage strict - La Fabrique de code - Tech blog","description":"Le typage strict est une des nouveaut\u00e9s qui figurera dans la version 7 de PHP et aidera les programmeurs venant des langages fortement typ\u00e9s \u00e0 l'adopter.","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":"http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/","og_locale":"fr_FR","og_type":"article","og_title":"PHP 7 : le typage strict - La Fabrique de code - Tech blog","og_description":"Le typage strict est une des nouveaut\u00e9s qui figurera dans la version 7 de PHP et aidera les programmeurs venant des langages fortement typ\u00e9s \u00e0 l'adopter.","og_url":"http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2015-09-02T12:58:24+00:00","og_image":[{"url":"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/09\/Future-Gen-Z-coder.jpg"}],"author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/","url":"http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/","name":"PHP 7 : le typage strict - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2015-09-02T12:58:24+00:00","dateModified":"2015-09-02T12:58:24+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"description":"Le typage strict est une des nouveaut\u00e9s qui figurera dans la version 7 de PHP et aidera les programmeurs venant des langages fortement typ\u00e9s \u00e0 l'adopter.","breadcrumb":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2015\/09\/php-7-le-typage-strict\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PHP 7 : le typage strict"}]},{"@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\/1027"}],"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=1027"}],"version-history":[{"count":7,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/1027\/revisions"}],"predecessor-version":[{"id":1035,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/1027\/revisions\/1035"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=1027"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=1027"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=1027"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}