{"id":285,"date":"2010-06-07T10:42:44","date_gmt":"2010-06-07T08:42:44","guid":{"rendered":"http:\/\/grummfy.be\/blog\/?p=285"},"modified":"2010-06-04T15:22:08","modified_gmt":"2010-06-04T13:22:08","slug":"espace-de-nom-php-et-chargement-automatique","status":"publish","type":"post","link":"https:\/\/grummfy.be\/blog\/285","title":{"rendered":"Espace de nom PHP et chargement automatique"},"content":{"rendered":"<p><a href=\".\/zend-framework\">PHP<\/a> 5.3 ajoute une notion int\u00e9ressante : les espaces de nom (ou namespace en anglais). Les espaces de nom permettent de s\u00e9parer diff\u00e9rents &#8230; \u00ab\u00a0<em>espace<\/em>\u00ab\u00a0, permettant ainsi d&rsquo;avoir deux classe portant le m\u00eame nom. Id\u00e9al pour l&rsquo;utilisation de framework mais aussi de \u00ab\u00a0l&rsquo;isolation\u00a0\u00bb de certains composants. Voyons voir comment cr\u00e9er un chargeur automatique (ou autoloader) comprenant les espaces de nom.<\/p>\n<p>Si vous \u00eates sous Ms Windows, aucun probl\u00e8me un simple <em>spl_autoload_register();<\/em> suffit. Malheureusement, sous *nix un <a href=\"http:\/\/bugs.php.net\/bug.php?id=51991\" target=\"_blank\">bug existe<\/a> il faudra donc impl\u00e9ment\u00e9 une solution maison.<\/p>\n<h2>Le code<\/h2>\n<p>Ce code provient du \u00ab\u00a0<a href=\"http:\/\/groups.google.com\/group\/php-standards\/web\/psr-0-final-proposal\">PHP  Standards Working Group<\/a>\u00a0\u00bb :<\/p>\n<pre lang=\"PHP\">\r\nfunction autoload($className)\r\n{\r\n\t$className = ltrim($className, '\\\\');\r\n\t$fileName  = '';\r\n\t$namespace = '';\r\n\tif ($lastNsPos = strripos($className, '\\\\'))\r\n\t{\r\n\t\t$namespace = substr($className, 0, $lastNsPos);\r\n\t\t$className = substr($className, $lastNsPos + 1);\r\n\t\t$fileName  = str_replace('\\\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;\r\n\t}\r\n\t$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';\r\n\r\n\trequire $fileName;\r\n}\r\n<\/pre>\n<\/p>\n<p>Pour l&rsquo;utiliser, il faut d\u00e9finir deux choses :<\/p>\n<ol>\n<li>Ne pas oublier de modifier l&rsquo;include path si n\u00e9cessaire.<\/li>\n<li>Ajouter cette fonction au chargeur de classes pr\u00e9sent.<\/li>\n<\/ol>\n<h2>L&rsquo;exemple<\/h2>\n<p>Voici un exemple un peu plus complet.<br \/>\nindex.php<\/p>\n<pre lang=\"PHP\">\r\n<?php\r\nset_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '\/lib\/');\/\/on ajoute le dossier lib dans l'include path\r\nspl_autoload_register();\/\/sur windows ceci devrait suffire .\r\n\/\/le code pour les autres\r\n\/\/----------------------------------------------------------\r\nfunction autoload($className)\r\n{\r\n\t$className = ltrim($className, '\\\\');\r\n\t$fileName  = '';\r\n\t$namespace = '';\r\n\tif ($lastNsPos = strripos($className, '\\\\'))\r\n\t{\r\n\t\t$namespace = substr($className, 0, $lastNsPos);\r\n\t\t$className = substr($className, $lastNsPos + 1);\r\n\t\t$fileName  = str_replace('\\\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;\r\n\t}\r\n\t$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';\r\n\r\n\trequire $fileName;\r\n}\r\nspl_autoload_register('autoload');\r\n\/\/----------------------------------------------------------\r\n\/\/fin du code de fix\r\n\r\nuse grummfy\\test\\Test;\r\nTest::sayHello();\r\n\r\n\\grummfy\\std\\Test::sayHello();\r\n\r\n# EOF\r\n<\/pre>\n<p>.\/lib\/grummfy\/test\/Test.php<\/p>\n<pre lang=\"PHP\">\r\n<?php\r\nnamespace grummfy\\test;\/\/pour rappel ceci doit-\u00eatre la premi\u00e8re instruction php (et on ne doit pas avoir de HTML avant)\r\necho 'Je suis inclus (' . __FILE__ . ')!';\r\nclass Test\r\n{\r\n\tpublic static function sayHello()\r\n\t{\r\n\t\techo 'Bonjour depuis ' . __CLASS__;\r\n\t}\r\n}\r\n\r\n# EOF\r\n<\/pre>\n<p>.\/lib\/grummfy\/std\/Test.php<\/p>\n<pre lang=\"PHP\">\r\n<?php\r\nnamespace grummfy\\std;\r\necho 'Je suis inclus (' . __FILE__ . ')!';\r\nclass Test\r\n{\r\n\tpublic static function sayHello()\r\n\t{\r\n\t\techo 'Bonjour depuis ' . __CLASS__;\r\n\t}\r\n}\r\n\r\n# EOF\r\n<\/pre>\n<p>Le r\u00e9sultat devrait \u00eatre :<br \/>\n<code><br \/>\nJe suis inclus (\/...\/lib\/grummfy\/test\/Test.php)!<br \/>\nBonjour depuis grummfy\\test\\Test<br \/>\nJe suis inclus (\/...\/lib\/grummfy\/std\/Test.php)!<br \/>\nBonjour depuis grummfy\\std\\Test<br \/>\n<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP 5.3 ajoute une notion int\u00e9ressante : les espaces de nom. Voyons voir comment cr\u00e9er un chargeur automatique (ou autoloader) comprenant ceux-ci.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[10],"tags":[99,110,24,37],"class_list":["post-285","post","type-post","status-publish","format-standard","hentry","category-php","tag-namespace","tag-php","tag-programmation","tag-web"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/posts\/285","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/comments?post=285"}],"version-history":[{"count":6,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/posts\/285\/revisions"}],"predecessor-version":[{"id":305,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/posts\/285\/revisions\/305"}],"wp:attachment":[{"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/media?parent=285"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/categories?post=285"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/tags?post=285"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}