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