Bug #68485 [Nab]: late namespace resolution with cross-namespace inheritance missing

From: Date: Mon, 24 Nov 2014 08:32:47 +0000
Subject: Bug #68485 [Nab]: late namespace resolution with cross-namespace inheritance missing
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-188772@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=68485&edit=1

 ID:                 68485
 Updated by:         requinix@php.net
 Reported by:        llmll at gmx dot de
 Summary:            late namespace resolution with cross-namespace
                     inheritance missing
 Status:             Not a bug
 Type:               Bug
 Package:            Class/Object related
 Operating System:   any
 PHP Version:        5.5.19
 Block user comment: N
 Private report:     N

 New Comment:

Hmm. Compile-time for imports and HHVM seems to do it at compile-time regardless <http://3v4l.org/Ec0jL/bytecode#tabs>. I guess I
assumed it was compile-time for everything.

Regardless, the class name still isn't resolved that way. Did you see the next line? "It
looks for a class from the current namespace: A\B\C."
- It had just said that A\B was where the "call" was
- There is no mention of any other code anywhere else - including code calling the code being
executed

Now, can we call this resolved? I'm sorry about the mix-up but it simply does not work the way
you thought it did. And frankly I'm glad it doesn't because such a scheme would be very
confusing and awkward.


Previous Comments:
------------------------------------------------------------------------
[2014-11-24 07:29:37] llmll at gmx dot de

Sorry, but you are wrong again. Please double check your own PHP documentation, where it says:

"Inside namespace (say A\B), calls to **unqualified** or qualified class names (not fully
qualified class names) are resolved at **run-time**. ".

This describes exactly what I am expecting.

------------------------------------------------------------------------
[2014-11-24 00:51:13] requinix@php.net

There is no inheritance in the first place. "Helper::$Value" does not work as a relative
path but is merely shorthand for writing "\Alpha\Helper::$Value", and was resolved as such
at compile-time.

The feature you're trying to report a bug for *does not exist*.

------------------------------------------------------------------------
[2014-11-23 23:59:53] llmll at gmx dot de

The example shows a clear breach in namespace/inheritance logic - this qualifies as bug.

As you explain a mere c&p of the method to the new class would resolve the issue. I remeber
reading nearly the same tips here, when LSB wasn't there and people claimed __CLASS__ was
sufficient for everything and for everything else just c&p. I personally stay away from hackish
tricks, the important namespace functionality should be consistent. So my suggestion is focusing on
the problem not the alternatives.

------------------------------------------------------------------------
[2014-11-23 23:43:11] requinix@php.net

That may be but it's still not a bug. There is no such feature like what you're
describing; the closest is LSB which is why I brought it up.

Your options include
a) Beta\Base redefining Write() to use the Helper class that it wants to use.
b) (Ab)using get_called_class() to extract the called namespace, test that the corresponding Helper
class exists, and use its $Value.
c) Dependency injection, which sounds like the best solution to whatever you're trying to do.

------------------------------------------------------------------------
[2014-11-23 23:03:31] llmll at gmx dot de

Sorry to say, but you did not understand the example provided. Please go through it again and find
that it has nothing to do with late static binding.

Your suggestion is invalid. A static::$Value is not defined, as we want the $Value property of a
different class: \Alpha\Helper. So we access it as Helper::$Value.

And here comes the problem. When later both classes are inherited / copied to \Beta namespace, the
Helper::$Value readout still accesses \Alpha\Helper::$Values, but it should be using
\Beta\Helper::$Value.

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=68485


--
Edit this bug report at https://bugs.php.net/bug.php?id=68485&edit=1


Thread (10 messages)

« previous php.bugs (#188772) next »