Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:51263 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 30937 invoked from network); 13 Jan 2011 15:22:24 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 13 Jan 2011 15:22:24 -0000 Authentication-Results: pb1.pair.com smtp.mail=martinscotta@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=martinscotta@gmail.com; sender-id=pass; domainkeys=bad Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.216.42 as permitted sender) DomainKey-Status: bad X-DomainKeys: Ecelerity dk_validate implementing draft-delany-domainkeys-base-01 X-PHP-List-Original-Sender: martinscotta@gmail.com X-Host-Fingerprint: 209.85.216.42 mail-qw0-f42.google.com Received: from [209.85.216.42] ([209.85.216.42:36135] helo=mail-qw0-f42.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id D5/54-01677-FA81F2D4 for ; Thu, 13 Jan 2011 10:22:23 -0500 Received: by qwj8 with SMTP id 8so1846562qwj.29 for ; Thu, 13 Jan 2011 07:22:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=qHfjE+U3nKC6/JTieWPgYhP5RSo6LYocBXuarSOCQpk=; b=geJhyLtxR3AAyRRBm1ds74Hm/yNhgP2M12mxU11XQTGZ3LdQ1YqrmVW9skptlbXXmc Q95eK1Mll0FXj50MaRsVpCNJURwBXHmxhOqyTTFpCGtmcVoT90B23+4mi3crnW5djCIj TtcNgqDi/fdCS4qga9Qj7142vD0KzWJM6nVzg= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=oZVdLVtwKbJKcRlUuv+wICJ5u1GRFA85cO/gLh6oQPP2p6nm56cGgKTKR/SNcKZZop LRMBJJKCtpMKX8JocU4siTwYm5aAxGXK+eLoneOF1HDyQNXPKw8fvgQOYhZhe+LGf87m 0WSOZaMAAjFb3u2Ugcg2yumW5E+AiOpY0dFbs= MIME-Version: 1.0 Received: by 10.224.80.136 with SMTP id t8mr2291591qak.113.1294932140860; Thu, 13 Jan 2011 07:22:20 -0800 (PST) Received: by 10.220.179.136 with HTTP; Thu, 13 Jan 2011 07:22:20 -0800 (PST) In-Reply-To: References: <1294276068.10675.3.camel@guybrush> <4D283A96.3090908@yahoo.com.au> Date: Thu, 13 Jan 2011 12:22:20 -0300 Message-ID: To: Martin Vium Cc: Ben Schmidt , internals@lists.php.net Content-Type: multipart/alternative; boundary=0015175cd59843a51c0499bbe261 Subject: Re: [PHP-DEV] RFC: about class names as values From: martinscotta@gmail.com (Martin Scotta) --0015175cd59843a51c0499bbe261 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi all, I don't know how the internal development process of PHP works. First at all: was this feature approved? if that is a "yes"... is this feature going to be scheduled for some release? Is it supposed that I will submit a patch? Thanks you all, Martin Scotta On Sun, Jan 9, 2011 at 11:07 AM, Martin Vium wrote: > I think adding a magic constant or method for getting the class name woul= d > be usefull in many scenarios, when referencing a specific class (e.g. > factories, configurations). It would also work well with namespaces and > refactoring tools e.g.: > > $mock =3D $this->getMock('\\My\\Custom\\Namespace\\MyClass'); > > vs. > > use My\Custom\Namespace\MyClass; > $mock =3D $this->getMock(MyClass::CLASS); > > On 8 January 2011 11:21, Ben Schmidt > wrote: > > > I think doing something like this is a good idea for classes and > > interfaces. > > > > Ben. > > > > > > > > > > On 7/01/11 1:16 AM, Martin Scotta wrote: > > > >> Yes, my intention was to only add a magic constant with the class, > similar > >> to this > >> > >> namespace Bar { > >> class Foo { > >> const KLASS =3D __CLASS__; > >> } > >> } > >> > >> namespace Buzz { > >> use \Bar\Foo as BazFoo; > >> > >> class Bar extends BazFoo { > >> const KLASS =3D __CLASS__; > >> } > >> > >> $bar =3D new Bar; > >> $baz =3D new BazFoo; > >> > >> var_dump( get_class($baz), BazFoo::KLASS); > >> var_dump( get_class($bar), Bar::KLASS ); > >> } > >> > >> This is 100% valid PHP 5.3.3 code, but that includes a lot of effort > from > >> the developer. Someone miss to include the KLASS constant on a class a= nd > >> the > >> result is undefined. > >> > >> If that PHP could add a magic constant --named CLASS or whatever you > >> like-- > >> to each class it will reduce the amount of class names hardcoded onto > >> strings, probably to zero. > >> > >> The only issue that I found today is related to interfaces. I'm not su= re > >> if > >> they should include this sort of magic constant, but I would rather > >> include > >> them just for consistency but, as I previously said, I'm not sure abou= t > >> this > >> one. > >> > >> Martin Scotta > >> > >> > >> 2011/1/5 John LeSueur > >> > >> > >>> > >>> 2011/1/5 Johannes Schl=FCter > >>> > >>> On Wed, 2011-01-05 at 21:53 -0300, Martin Scotta wrote: > >>>> > >>>>> $obj =3D newInstance( MyClass ); // notice. undefined constant MyCl= ass > >>>>> > >>>> > >>>> This describes the major change with your idea. > >>>> > >>>> What happens if a constant MyClass exists? > >>>> > >>>> Another question is something like this: > >>>> > >>>> >>>> function factory($class) { > >>>> return new $class(); > >>>> } > >>>> > >>>> factory( SomeClass ); > >>>> ?> > >>>> > >>>> > >>>> To proper support this we'd have to make classes first class element= s. > >>>> For making this consistent it would make sense to make functions fir= st > >>>> class elements. And best drop the $ in front of variables and create= a > >>>> new language. Everything else becomes a mess. > >>>> > >>>> johannes > >>>> > >>>> > >>>> > >>>> -- > >>>> PHP Internals - PHP Runtime Development Mailing List > >>>> To unsubscribe, visit: http://www.php.net/unsub.php > >>>> > >>>> > >>>> I think he's actually proposing creating for each class the magic > class > >>> constant CLASS, so your example becomes: > >>> > >>> > >>> >>> > >>> function factory($class) { > >>> return new $class(); > >>> } > >>> > >>> factory( SomeClass::CLASS ); > >>> > >>> ?> > >>> > >>> This is actually doable without a magic class constant, but requires = a > >>> function or class constant to be declared in each class. > >>> > >>> >>> class SomeClass { > >>> const CLASS =3D __NAMESPACE__ . '\' . __CLASS__; > >>> static function getNameWithNSPath() > >>> { > >>> return __NAMESPACE__ . '\' . __CLASS__; > >>> } > >>> } > >>> > >>> > >>> factory( SomeClass::getNameWithNSPath() ); > >>> ?> > >>> > >>> Perhaps this could be simplified with traits, if __NAMESPACE__ and > >>> __CLASS__ work in traits that way. In fact, that's an interesting > >>> question, > >>> what is __NAMESPACE__ in a trait defined in one namespace, then used = in > a > >>> class in a different namespace? > >>> > >>> I think the point is that the factory function could exist without an= y > >>> knowledge of the namespaces of the classes it would work on. Then, > >>> somewhere > >>> else where the class has been aliased or is otherwise accessible > without > >>> the > >>> full namespace path, the developer wouldn't need to specify the full > >>> namespace path to the factory, but could ask the class itself what it= 's > >>> full > >>> namespace path was. I don't know that I agree with the idea, but I > don't > >>> think it requires making classes first class elements. > >>> > >>> John > >>> > >>> > >>> > >> > > -- > > PHP Internals - PHP Runtime Development Mailing List > > To unsubscribe, visit: http://www.php.net/unsub.php > > > > > > > > > -- > Mvh > Martin Vium > Senior System Arkitekt > Sitevision > --0015175cd59843a51c0499bbe261--