I think adding a magic constant or method for getting the class name would 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 = $this->getMock('\\My\\Custom\\Namespace\\MyClass'); vs. use My\Custom\Namespace\MyClass; $mock = $this->getMock(MyClass::CLASS); On 8 January 2011 11:21, Ben Schmidt <mail_ben_schm...@yahoo.com.au> 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 = __CLASS__; >> } >> } >> >> namespace Buzz { >> use \Bar\Foo as BazFoo; >> >> class Bar extends BazFoo { >> const KLASS = __CLASS__; >> } >> >> $bar = new Bar; >> $baz = 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 and >> 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 sure >> 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 about >> this >> one. >> >> Martin Scotta >> >> >> 2011/1/5 John LeSueur<john.lesu...@gmail.com> >> >> >>> >>> 2011/1/5 Johannes Schlüter<johan...@php.net> >>> >>> On Wed, 2011-01-05 at 21:53 -0300, Martin Scotta wrote: >>>> >>>>> $obj = newInstance( MyClass ); // notice. undefined constant MyClass >>>>> >>>> >>>> This describes the major change with your idea. >>>> >>>> What happens if a constant MyClass exists? >>>> >>>> Another question is something like this: >>>> >>>> <?php >>>> function factory($class) { >>>> return new $class(); >>>> } >>>> >>>> factory( SomeClass ); >>>> ?> >>>> >>>> >>>> To proper support this we'd have to make classes first class elements. >>>> For making this consistent it would make sense to make functions first >>>> 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: >>> >>> >>> <?php >>> >>> 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. >>> >>> <?php >>> class SomeClass { >>> const CLASS = __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 any >>> 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