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

Reply via email to