On 23/11/2007, Richard Quadling <[EMAIL PROTECTED]> wrote: > On 22/11/2007, Marco Kaiser <[EMAIL PROTECTED]> wrote: > > Hi again, > > > > to explain the main idea a bit more, the code below work and moves the > > main getInstance function from the class and its possible to abstract > > this. > > it would be cool to get the protected property also into the abstract > > class. Any idea or maybe a solution in the near future? > > > > <?php > > abstract class singleton > > { > > static public function getInstance() > > { > > $caller = get_called_class(); > > if (!static::$_instance instanceof $caller) { > > static::$_instance = new $caller; > > } > > > > return static::$_instance; > > } > > } > > > > class foo extends singleton { > > static protected $_instance = null; > > } > > > > class bar extends singleton { > > static protected $_instance = null; > > } > > > > var_dump(foo::getInstance()); > > var_dump(bar::getInstance()); > > var_dump(foo::getInstance()); > > var_dump(bar::getInstance()); > > ?> > > > > On Nov 22, 2007 9:29 PM, Marco Kaiser <[EMAIL PROTECTED]> wrote: > > > Hi List, > > > > > > just to drop my note here, i asked (i think) 2 years ago for such a > > > feature to automate my singleton pattern. Not with late static > > > bindings this is possible. > > > > > > <?php > > > class singleton > > > { > > > static protected $_instance = null; > > > > > > static public function getInstance() > > > { > > > $caller = get_called_class(); > > > if (!static::$_instance instanceof $caller) { > > > static::$_instance = new $caller; > > > } > > > > > > return static::$_instance; > > > } > > > } > > > > > > class foo extends singleton > > > { > > > } > > > > > > var_dump(foo::getInstance()); > > > var_dump(foo::getInstance()); > > > ?> > > > > > > i think this will also drop much redundant code from some frameworks. :) > > > So this is one of my examples that helps much. > > > > > > > > > -- > > > Marco Kaiser > > > > > > > > > > > -- > > Marco Kaiser > > <?php > abstract class singleton > { > static protected $_instance = null; > static public function getInstance() > { > $caller = get_called_class(); > if (!static::$_instance instanceof $caller) { > static::$_instance = new $caller; > } > > return static::$_instance; > } > } > > class foo extends singleton { > } > > class bar extends singleton { > } > > var_dump(foo::getInstance()); > var_dump(bar::getInstance()); > var_dump(foo::getInstance()); > var_dump(bar::getInstance()); > ?> > > returns ... > > object(foo)#1 (0) { > } > object(bar)#2 (0) { > } > object(foo)#1 (0) { > } > object(bar)#2 (0) { > } > > in PHP 5.3.0-dev (cli) (built: Nov 20 2007 08:19:12) > > I think this is great! Well done everyone. Unless I've completely > missed the point.
Also, you can make the getInstance() method final so it cannot be overridden in sub-classes... <?php abstract class singleton { static protected $_instance = null; static final public function getInstance() { $caller = get_called_class(); if (!static::$_instance instanceof $caller) { static::$_instance = new $caller; } return static::$_instance; } } class foo extends singleton { public function getInstance() { return 'foobar'; } } class bar extends singleton { } var_dump(foo::getInstance()); var_dump(bar::getInstance()); var_dump(foo::getInstance()); var_dump(bar::getInstance()); ?> returns ... Fatal error: Cannot override final method singleton::getInstance() in C:\sing.php on line 18 So, a very useful addition to the language. -- ----- Richard Quadling Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731 "Standing on the shoulders of some very clever giants!" -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php