Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:33392 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 77603 invoked by uid 1010); 23 Nov 2007 13:26:40 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 77588 invoked from network); 23 Nov 2007 13:26:40 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 23 Nov 2007 13:26:40 -0000 Authentication-Results: pb1.pair.com smtp.mail=marco.kaiser@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=marco.kaiser@gmail.com; sender-id=pass; domainkeys=bad Received-SPF: pass (pb1.pair.com: domain gmail.com designates 64.233.182.188 as permitted sender) DomainKey-Status: bad X-DomainKeys: Ecelerity dk_validate implementing draft-delany-domainkeys-base-01 X-PHP-List-Original-Sender: marco.kaiser@gmail.com X-Host-Fingerprint: 64.233.182.188 nf-out-0910.google.com Received: from [64.233.182.188] ([64.233.182.188:1918] helo=nf-out-0910.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id E4/5B-02878-F05D6474 for ; Fri, 23 Nov 2007 08:26:40 -0500 Received: by nf-out-0910.google.com with SMTP id e27so2562524nfd for ; Fri, 23 Nov 2007 05:26:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:from:to:cc:references:in-reply-to:subject:date:mime-version:content-type:content-transfer-encoding:x-mailer:thread-index:content-language:message-id; bh=NBoMzAMOliyzWK/fn1/qz+k3Oq4Gpd2/C5Dgeh8q2Ds=; b=JsL3S7MYhBjR2zanfLQzlyiggqwAxGlhpOh7s068ayEgTZLWAJWuWu8jzA3MDhWO4urgrPv2pMmsvv/2Dn6qmefb2MvfQqzmRwuL3MtlYPSEiLHTKrdLXMSI+r6VXlTWN7RcX0JqhXt24szRnuTjwUNmp9262CSWXi0B2sS2hcg= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:from:to:cc:references:in-reply-to:subject:date:mime-version:content-type:content-transfer-encoding:x-mailer:thread-index:content-language:message-id; b=ejCTFRc7rDxPUhQpI6BrumznEg1IHyppOMUkjk4nf+ZnUK9RgBYnIElYNBpIchsDuRw0l91tOWfOxygAZFryV6uH8GTi1NfFqkFyeqJ5G1ppbZ5XC16mrIGeLY1vToLbBS8LdotsaZ9GKTWIk2bfWdpQl8cSINbQ6CWgyImi860= Received: by 10.82.171.16 with SMTP id t16mr11339799bue.1195824396473; Fri, 23 Nov 2007 05:26:36 -0800 (PST) Received: from think ( [217.7.237.75]) by mx.google.com with ESMTPS id k29sm2967335fkk.2007.11.23.05.26.33 (version=TLSv1/SSLv3 cipher=RC4-MD5); Fri, 23 Nov 2007 05:26:34 -0800 (PST) To: "'Marcus Boerger'" , "'Richard Quadling'" Cc: "'PHP Developers Mailing List'" References: <4740C654.3020302@digitalsandwich.com> <4741DC81.6000506@zend.com> <4741D574.2020800@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> In-Reply-To: <388489975.20071123122230@marcus-boerger.de> Date: Fri, 23 Nov 2007 14:22:32 +0100 MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AcgtwyQ+fHI1wQLrQUCMXCm1GjSKpgAEKOLQ Content-Language: de Message-ID: <4746d50a.1d255e0a.40ab.6e50@mx.google.com> Subject: RE: [PHP-DEV] late static binding php6 From: marco.kaiser@gmail.com ("Marco Kaiser") 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:helly@php.net] > 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: > > 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 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