Hello Richard, what's your point? The output of this script with updated checks and inheritence still gives expected results: <?php abstract class singleton { static private $instances = array(); static final public function getInstance() { $caller = get_called_class(); if (!self::$instances[$caller] instanceof $caller) { self::$instances[$caller] = new $caller; } return self::$instances[$caller]; } }
class foo extends singleton { } class bar extends singleton { } class baz extends bar { } var_dump($u = foo::getInstance()); var_dump($v = bar::getInstance()); var_dump($w = baz::getInstance()); var_dump($x = foo::getInstance()); var_dump($y = bar::getInstance()); var_dump($z = baz::getInstance()); var_dump(array($u, $v, $w, $x, $y, $z)); ?> If you wanted to prevent further inheritance you'd simply mark the class as final. Say 'final class bar' would prevent existance of 'baz'. I wonder if we shouldn't make this somehow into a testcase so that we know the desired behavior stays as development of LSB continues. marcus Friday, November 23, 2007, 1:26:37 PM, you wrote: > On 23/11/2007, Marcus Boerger <[EMAIL PROTECTED]> wrote: >> Hello Richard, >> >> that kind of stuff is the reason we added LSB. There is only one tiny >> thing I am not to happy about. You do not at all have to declare static >> $instance. Simply because you never use it. And for that reason you guys >> have your code worng. Use the following snippet for verification: >> var_dump($u=foo::getInstance()); >> var_dump($v=bar::getInstance()); >> var_dump($w=foo::getInstance()); >> var_dump($x=bar::getInstance()); >> var_dump(array($u,$v,$w,$x)); >> >> When you want to have a factory of singletons that can create one single >> member of every derived class than you need to add an array to store those >> inside the abstract base class. That also allows to make that member >> private and thereby disallowing any derived class to interfere with the >> static member and get rid of them to overthrow the singleton limitation... >> You also have no need for the instanceof operation with the array. See here: >> >> <?php >> abstract class singleton >> { >> static private $instances = array(); >> static final public function getInstance() >> { >> $caller = get_called_class(); >> if (!isset(self::$instances[$caller])) { >> self::$instances[$caller] = new $caller; >> } >> return self::$instances[$caller]; >> } >> } >> >> class foo extends singleton { >> } >> >> class bar extends singleton { >> } >> >> var_dump($u=foo::getInstance()); >> var_dump($v=bar::getInstance()); >> var_dump($w=foo::getInstance()); >> var_dump($x=bar::getInstance()); >> var_dump(array($u,$v,$w,$x)); >> ?> > Changing bar to extend from foo gives the same results. > We have a singleton of the class bar because somewhere in the chain it > has the singleton class. > Excellent. >> >> Friday, November 23, 2007, 10:21:51 AM, you wrote: >> >> > 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!" >> >> >> >> >> Best regards, >> Marcus >> >> > -- > ----- > Richard Quadling > Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731 > "Standing on the shoulders of some very clever giants!" Best regards, Marcus -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php