{"id":94,"date":"2017-05-03T16:25:39","date_gmt":"2017-05-03T14:25:39","guid":{"rendered":"http:\/\/blog.lab3216.com\/?p=94"},"modified":"2018-11-06T13:09:31","modified_gmt":"2018-11-06T12:09:31","slug":"les-singletons-design-pattern","status":"publish","type":"post","link":"https:\/\/blog.scribter.com\/?p=94","title":{"rendered":"Les singletons : design pattern"},"content":{"rendered":"<p>Un singleton est un design pattern dont l&rsquo;objet consiste \u00e0 avoir\u00a0une classe qui ne peut \u00eatre instanci\u00e9e\u00a0qu&rsquo;une seule fois.<\/p>\n<p>Ce serait\u00a0le cas typique de la configuration d&rsquo;un site web. Il serait\u00a0absurde de cr\u00e9er plusieurs objets configuration s&rsquo;agissant d&rsquo;un seul et m\u00eame site web.<\/p>\n<p>A chaque instanciation de Config, on ferait par exemple:<\/p>\n<div class=\"codecolorer-container bash default\" style=\"overflow:auto;white-space:nowrap;width:650px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/><\/div><\/td><td><div class=\"bash codecolorer\"><span class=\"re1\">$config1<\/span> = new Config<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<br \/>\n...<br \/>\n<br \/>\n<span class=\"re1\">$config2<\/span> = new Config<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>Un nouvel objet Config est cr\u00e9\u00e9 \u00e0 chaque fois. Ce qui nous arrange pas vraiment.<\/p>\n<p>Une solution \u00e0 ce probl\u00e8me serait de de cr\u00e9er une\u00a0classe statique. Celle-ci n&rsquo;ayant pas besoin d&rsquo;\u00eatre instanci\u00e9e. Il s&rsquo;av\u00e8re cependant que ces classe statiques ne peuvent pas disposer de constructeur, de plus g\u00e9rer l&rsquo;h\u00e9ritage des classes statiques est assez complexe. (voir\u00a0<a href=\"http:\/\/php.net\/manual\/fr\/language.oop5.late-static-bindings.php\">Late Static Bindings<\/a>).<\/p>\n<p>La solution consiste donc \u00e0 cr\u00e9er une nouvelle instance de la classe seulement si aucune\u00a0instance de cette classe n&rsquo;a d\u00e9j\u00e0 \u00e9t\u00e9\u00a0cr\u00e9\u00e9e.<\/p>\n<p>Supposons que notre classe Config soit charg\u00e9e de g\u00e9rer\u00a0la configuration de notre application qui se trouve dans un fichier config\/config.php.<\/p>\n<div class=\"codecolorer-container php default\" style=\"overflow:auto;white-space:nowrap;width:650px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/><\/div><\/td><td><div class=\"php codecolorer\"><span class=\"kw2\">&lt;?php<\/span><br \/>\n<br \/>\n<span class=\"kw2\">class<\/span> Config <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$settings<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"kw2\">private<\/span> static <span class=\"re0\">$_instance<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"kw2\">public<\/span> static <span class=\"kw2\">function<\/span> getInstance<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.php.net\/is_null\"><span class=\"kw3\">is_null<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"kw2\">self<\/span><span class=\"sy0\">::<\/span><span class=\"re0\">$_instance<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw2\">self<\/span><span class=\"sy0\">::<\/span><span class=\"re0\">$_instance<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> Config<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw2\">self<\/span><span class=\"sy0\">::<\/span><span class=\"re0\">$_instance<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> __construct<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">settings<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">require<\/span> dirnam<span class=\"br0\">&#40;<\/span>__DIR__<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">.<\/span> <span class=\"st_h\">'config\/config.php'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>C&rsquo;est donc dans la m\u00e9thode :<\/p>\n<div class=\"codecolorer-container php default\" style=\"overflow:auto;white-space:nowrap;width:650px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/><\/div><\/td><td><div class=\"php codecolorer\"><span class=\"kw2\">public<\/span> static <span class=\"kw2\">function<\/span> getInstance<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.php.net\/is_null\"><span class=\"kw3\">is_null<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"kw2\">self<\/span><span class=\"sy0\">::<\/span><span class=\"re0\">$_instance<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw2\">self<\/span><span class=\"sy0\">::<\/span><span class=\"re0\">$_instance<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> Config<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw2\">self<\/span><span class=\"sy0\">::<\/span><span class=\"re0\">$_instance<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>que l&rsquo;instance de Config est cr\u00e9\u00e9e. On voit bien ici, que\u00a0Config n&rsquo;est instanci\u00e9\u00a0que s&rsquo;il\u00a0n&rsquo;existe pas encore\u00a0d&rsquo;objet.<\/p>\n<p>A chaque endroit o\u00f9 j&rsquo;ai besoin de ma configuration, je l&rsquo;appelle de cette mani\u00e8re<\/p>\n<div class=\"codecolorer-container bash default\" style=\"overflow:auto;white-space:nowrap;width:650px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/><\/div><\/td><td><div class=\"bash codecolorer\"><span class=\"co4\">$<\/span>config = Config::getInstance<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>De cette fa\u00e7on, l&rsquo;objet Config n&rsquo;est cr\u00e9\u00e9 que s&rsquo;il n&rsquo;a pas d\u00e9j\u00e0 \u00e9t\u00e9 pr\u00e9alablement instanci\u00e9 .<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un singleton est un design pattern dont l&rsquo;objet consiste \u00e0 avoir\u00a0une classe qui ne peut \u00eatre instanci\u00e9e\u00a0qu&rsquo;une seule fois. Ce serait\u00a0le cas typique de la configuration d&rsquo;un site web. Il serait\u00a0absurde de cr\u00e9er plusieurs objets configuration s&rsquo;agissant d&rsquo;un seul et m\u00eame site web. A chaque instanciation de Config, on ferait par exemple: 12345$config1 = new &hellip; <a href=\"https:\/\/blog.scribter.com\/?p=94\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Les singletons : design pattern<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ub_ctt_via":"","footnotes":""},"categories":[9,6],"tags":[],"class_list":["post-94","post","type-post","status-publish","format-standard","hentry","category-design-patterns","category-development-web"],"featured_image_src":null,"author_info":{"display_name":"metouisa","author_link":"https:\/\/blog.scribter.com\/?author=1"},"_links":{"self":[{"href":"https:\/\/blog.scribter.com\/index.php?rest_route=\/wp\/v2\/posts\/94","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.scribter.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.scribter.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.scribter.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.scribter.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=94"}],"version-history":[{"count":12,"href":"https:\/\/blog.scribter.com\/index.php?rest_route=\/wp\/v2\/posts\/94\/revisions"}],"predecessor-version":[{"id":100,"href":"https:\/\/blog.scribter.com\/index.php?rest_route=\/wp\/v2\/posts\/94\/revisions\/100"}],"wp:attachment":[{"href":"https:\/\/blog.scribter.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=94"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.scribter.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=94"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.scribter.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=94"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}