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

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

Reply via email to