Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:33390 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 62136 invoked by uid 1010); 23 Nov 2007 12:26:47 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 62120 invoked from network); 23 Nov 2007 12:26:47 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 23 Nov 2007 12:26:47 -0000 Authentication-Results: pb1.pair.com smtp.mail=rquadling@googlemail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=rquadling@googlemail.com; sender-id=pass; domainkeys=bad Received-SPF: pass (pb1.pair.com: domain googlemail.com designates 209.85.146.181 as permitted sender) DomainKey-Status: bad X-DomainKeys: Ecelerity dk_validate implementing draft-delany-domainkeys-base-01 X-PHP-List-Original-Sender: rquadling@googlemail.com X-Host-Fingerprint: 209.85.146.181 wa-out-1112.google.com Received: from [209.85.146.181] ([209.85.146.181:36727] helo=wa-out-1112.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 0D/59-02878-507C6474 for ; Fri, 23 Nov 2007 07:26:46 -0500 Received: by wa-out-1112.google.com with SMTP id l24so3856948waf for ; Fri, 23 Nov 2007 04:26:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:reply-to:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; bh=/grtcs7/iACBYetzP1v1ORs1W0nTmbZdtrfcQhEKDAE=; b=DdNAl9k6fkqhXcd31r6wDWSsi7Y9K0pj07ADl0VaA9KNtOKN9hyel848DV7kShS7DYyp+Bmqo+FetW3lpOHM6jYp2KviCznNjIR/tPAKIgzWsZjvhIr7Juwz2dRcDBRQGUsHf3XXqmpnZf5KmdhIEzCZ0vb78ECT4/RWFg7VHOU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlemail.com; s=beta; h=received:message-id:date:from:reply-to:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; b=idxdnu2+mR0u4NbaV5txWzTEggQcYihCPx6sqB8O8Ilb1oHPtGq1fgH0uOFxElV6y0xyDbjOkFtdGVVWWwN7ceovbYHqG1NMN2f5x9x0SquxiVNR/jVu89tySvjNitH5KFItTT1VU6AwGz+tuWTut8ODnsxTd3It0I9HljFgG1o= Received: by 10.114.167.2 with SMTP id p2mr628101wae.1195820802727; Fri, 23 Nov 2007 04:26:42 -0800 (PST) Received: by 10.114.210.8 with HTTP; Fri, 23 Nov 2007 04:26:37 -0800 (PST) Message-ID: <10845a340711230426g106caeb5w930179959dbacc1d@mail.gmail.com> Date: Fri, 23 Nov 2007 12:26:37 +0000 Reply-To: RQuadling@GoogleMail.com To: "Marcus Boerger" Cc: "Marco Kaiser" , "PHP Developers Mailing List" In-Reply-To: <388489975.20071123122230@marcus-boerger.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-Disposition: inline References: <4740C654.3020302@digitalsandwich.com> <474247A2.5050301@zend.com> <4741D9D1.6030106@digitalsandwich.com> <47424B4F.2@zend.com> <4743CED7.5050402@avalon.aut.bme.hu> <10845a340711230118t6c19243cg812f22858e3a3c75@mail.gmail.com> <10845a340711230121j1e06040bw15953d02330b622@mail.gmail.com> <388489975.20071123122230@marcus-boerger.de> Subject: Re: [PHP-DEV] late static binding php6 From: rquadling@googlemail.com ("Richard Quadling") On 23/11/2007, Marcus Boerger 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: > > 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 wrote: > >> On 22/11/2007, Marco Kaiser 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? > >> > > >> > >> > 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 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. > >> > > > >> > > >> > > 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 > >> > >> >> 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... > > > > 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!"