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

Reply via email to