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!"

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to