On Tue, Nov 10, 2015 at 11:04 PM, Steven Hilder <
steven.hilder@sevenpercent.solutions> wrote:

On Mon, 09 Nov 2015 16:48:57, Leigh <lei...@gmail.com> wrote:
>
>> On 9 November 2015 at 15:27, Steven Hilder
>> Can you share your patch?
>>
>
> See
> https://github.com/php/php-src/compare/master...stevenhilder:hide-anon-class-suffix
>
> Feedback very welcome :)
>
> It should be possible to return the sanitised name without removing it
>> internally.(would have to cover the get_parent_class and getParentClass
>> versions too, and have a quick audit of other places class names can be
>> spat out.)
>>
>
> Yes, that's what I had in mind. The class names are sanitised only for
> display in userland; I haven't changed the way that the names are generated
> or stored internally.
>
> I've applied the change to `get_parent_class()` and `get_called_class()`.
> Nothing needed to be done for `ReflectionClass::getParentClass()` because
> it
> returns another `ReflectionClass` object, not the parent's name.
>
> The `__CLASS__` magic constant and `::class` syntax also needed changes.
> The
> patch includes a test which shows all of the scenarios that I've accounted
> for. Please do let me know if you can think of any others.
>
> I've also implemented the change to `class_alias()` as I described in my
> previous email.
>

I'd like to clarify some things here from the perspective of the people who
implemented this naming scheme.

The naming was chosen to be this way intentionally, to combine two
behaviors we would like to have:

a) Things like get_class() MUST return a class name that uniquely
identifies the anonymous class. You should be able to instantiate a new
instance of the same class based on it, etc. Having these return truncated
names is an absolute no-go, because it would require people to explicitly
handle anonymous classes in many context that currently "just work".

b) We do not want to display the fully mangled name of an anonymous class
in error messages or debug dumps. While the information contained there can
be useful, it also significantly bloats outputs. Furthermore we will likely
change the exact naming structure in the future, in which case the
anonymous class name will no longer contain any directly useful information
(maybe some hash).

Using a NUL byte conveniently achieves both of these goals. We did not
however take into account that this would cause issues with 3rd party
tooling that does not support binary data.

As such, we may have to change the naming. However we must retain goal a)
and would like to retain b). To do this we could use names along the lines
of class@anonymous$1, where the uniquely-identifying information is short
enough to be no bother when displayed. Generating these kinds of names is
non-trivial if you consider caching and may require some changes to the way
we perform class bindings. (As a side bonus, depending on how this is done,
we might fix https://bugs.php.net/bug.php?id=64291 as well.)

Not sure if this is still in scope for PHP 7.0.

Nikita

Reply via email to