Hi Marcus, ahh now i know whats my thinking problem. :) the new introduced function get_called_class() function gives me the information how to work around my problem. :) static isnt really required. :)
-- Marco > -----Original Message----- > From: Marcus Boerger [mailto:[EMAIL PROTECTED] > Sent: Friday, November 23, 2007 12:23 PM > To: Richard Quadling > Cc: Marco Kaiser; PHP Developers Mailing List > Subject: Re: [PHP-DEV] late static binding php6 > > 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)); > ?> > > 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 -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php