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

Reply via email to