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
>
>

Reply via email to