{"id":755,"date":"2010-03-30T14:38:49","date_gmt":"2010-03-30T12:38:49","guid":{"rendered":"http:\/\/www.davidrojas.net\/?p=755"},"modified":"2013-11-23T19:12:03","modified_gmt":"2013-11-23T18:12:03","slug":"screencast-patrones-de-diseno-en-php-singleton-pattern","status":"publish","type":"post","link":"https:\/\/www.davidrojas.net\/index.php\/desarrollo-web\/screencast-patrones-de-diseno-en-php-singleton-pattern\/","title":{"rendered":"Videotutorial: Patrones de dise\u00f1o en PHP &#8211; Singleton Pattern"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"derecha alignright size-full wp-image-774\" title=\"screencast_php_patterns\" src=\"http:\/\/www.davidrojas.net\/wp-content\/uploads\/2010\/03\/screencast_php_patterns.png\" alt=\"\" width=\"163\" height=\"104\" \/>Hoy os traigo el primero de una serie de videos cortos en los que voy a explicar algunos de los patrones dise\u00f1o OOP m\u00e1s comunes en PHP. Un patr\u00f3n de dise\u00f1o consiste en una soluci\u00f3n a un problema com\u00fan en el desarrollo de software. En el caso de PHP, estos patrones son los que nos permiten aprovechar realmente toda la potencia de orientaci\u00f3n a objetos de PHP5. Estos videos no pretenden ser tutoriales exhaustivos, sino simplemente una visi\u00f3n general y r\u00e1pida de en qu\u00e9 consiste cada patr\u00f3n, para aquellos que no est\u00e9n familiarizados con esta metodolog\u00eda.<\/p>\n<p>Empezaremos con el patr\u00f3n <em>Singleton<\/em>, ya que es el m\u00e1s f\u00e1cil de entender y utilizar. Hay varias maneras de implementar una clase singleton, pero aqu\u00ed os voy a mostrar la forma m\u00e1s sencilla.<br \/>\n<!--more--><\/p>\n<h3>Ver screencast (duraci\u00f3n: 6:00)<\/h3>\n<div class=\"video\"><iframe loading=\"lazy\" src=\"\/\/player.vimeo.com\/video\/80137243?portrait=0&amp;color=c00202\" width=\"490\" height=\"368\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen><\/iframe><\/div>\n<ul>\n<li><a title=\"Descargar versi\u00f3n alta calidad\" href=\"https:\/\/mega.co.nz\/#!SR1SHJiQ!XnBP_mQWHUqDjrcyimIdN3n7lsQS7ea70k8cJYvh08w\">Descargar videotutorial en alta calidad &#8211; MOV (12 MB)<\/a><\/li>\n<li><a title=\"Descargar versi\u00f3n iPod\/iPhone\" href=\"https:\/\/mega.co.nz\/#!uMUBHYRC!Es7d9CuOXwpBlZLzYSLEty8ztKQ3uC4yIwvpXFcsqrw\">Descargar videotutorial optimizado para iPod\/iPhone &#8211; M4V (7 MB)<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Pod\u00e9is ver el resto de screencasts en la <a title=\"Videotutoriales de dise\u00f1o, desarrollo web, codeigniter, CSS3\" href=\"http:\/\/www.davidrojas.net\/index.php\/category\/screencasts\/\">p\u00e1gina de videotutoriales<\/a>, o suscribiros al <a title=\"Enlace a videopodcast de David Rojas en iTunes\" href=\"http:\/\/itunes.apple.com\/WebObjects\/MZStore.woa\/wa\/viewPodcast?id=326994250\">podcast de iTunes<\/a>.<\/p>\n<h3>\u00bfQu\u00e9 es un Singleton?<\/h3>\n<p>Un singleton consiste en una clase que solo puede tener una instancia y provee de un punto global de acceso a ella. Para ello se crea una instancia de la clase la primera vez que se referencia, y se devuelve \u00e9sta en posteriores llamadas. Esto ayuda a crear clases reusables y no depender de variables globales.<\/p>\n<p>Un claro ejemplo de uso es cuando dise\u00f1amos una clase para gestionar la conexion y querys con la base de datos. A lo largo de nuestro script crearemos instancias de esa clase, pero nos interesa que siempre sea la misma ya que todas las conexiones compartir\u00e1n los mismos par\u00e1metros y solo cambiar\u00e1 el contenido del query, por lo que no necesitamos una nueva instancia cada vez, consiguiendo con ello una mejora en el rendimiento.<\/p>\n<h3>Ejemplo de implementaci\u00f3n<\/h3>\n<pre lang=\"php\">class Singleton\r\n{\r\n\tprivate static $singleInstancia;\r\n\r\n\tprivate function __construct(){ }\r\n\r\n\tpublic static function getInstancia(){\r\n\t\tif(!self::$singleInstancia){\r\n\t\t\tself::$singleInstancia = new self();\r\n\t\t}\r\n\t\treturn self::$singleInstancia;\r\n\t}\r\n\r\n        \/* A partir de aqu\u00ed vamos a\u00f1adiendo los m\u00e9todos la clase *\/\r\n\tfunction Metodo(){\r\n\t\tvar_dump(self::$singleInstancia);\r\n\t}\r\n\r\n}<\/pre>\n<p>Usaremos la clase de esta manera:<\/p>\n<pre lang=\"php\">$mysingleton = Singleton::getInstancia();\r\n$mysingleton->Metodo();<\/pre>\n<p>Para hacer nuestro singleton m\u00e1s robusto podr\u00edamos definir algunos de los <a href=\"http:\/\/php.net\/manual\/en\/language.oop5.magic.php\">met\u00f3dos &#8216;m\u00e1gicos&#8217;<\/a> de PHP para evitar el clonado y manejar la serializaci\u00f3n, pero los he omitido para mantener la sencillez del ejemplo.<\/p>\n<p>Relacionados:<\/p>\n<ul>\n<li><a title=\"Videotutorial: Patrones de dise\u00f1o en PHP \u2013 Factory Pattern\" href=\"http:\/\/www.davidrojas.net\/index.php\/desarrollo-web\/screencast-patrones-de-diseno-en-php-factory-pattern\/\">Videotutorial: Patrones de dise\u00f1o en PHP \u2013 Factory Pattern<\/a><\/li>\n<li><a title=\"Videotutorial: Patrones de dise\u00f1o en PHP \u2013 Observer Pattern\" href=\"http:\/\/www.davidrojas.net\/index.php\/desarrollo-web\/videotutorial-patrones-de-diseno-en-php-observer-pattern\/\">Videotutorial: Patrones de dise\u00f1o en PHP \u2013 Observer Pattern<\/a><\/li>\n<li><a title=\"Videotutorial: Patrones de dise\u00f1o en PHP \u2013 Chain-of-command\" href=\"http:\/\/www.davidrojas.net\/index.php\/desarrollo-web\/videotutorial-patrones-de-diseno-en-php-chain-of-command\/\">Videotutorial: Patrones de dise\u00f1o en PHP \u2013 Chain-of-command Pattern<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Hoy os traigo el primero de una serie de videos cortos en los que voy a explicar algunos de los patrones dise\u00f1o OOP m\u00e1s comunes en PHP. Un patr\u00f3n de dise\u00f1o consiste en una soluci\u00f3n a un problema com\u00fan en el desarrollo de software. En el caso de PHP, estos patrones son los que nos [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,11,12],"tags":[],"class_list":["post-755","post","type-post","status-publish","format-standard","hentry","category-desarrollo-web","category-php","category-screencasts"],"_links":{"self":[{"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/posts\/755","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/comments?post=755"}],"version-history":[{"count":35,"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/posts\/755\/revisions"}],"predecessor-version":[{"id":982,"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/posts\/755\/revisions\/982"}],"wp:attachment":[{"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/media?parent=755"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/categories?post=755"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/tags?post=755"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}