Bug #70135 [Opn]: class alias conflict with class defined in another file with the same namespace
| From: | php at lvht dot net | Date: | Mon, 27 Jul 2015 15:25:23 +0000 |
| Subject: | Bug #70135 [Opn]: class alias conflict with class defined in another file with the same namespace | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-194760@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=70135&edit=1
ID: 70135
User updated by: php at lvht dot net
Reported by: php at lvht dot net
Summary: class alias conflict with class defined in another
file with the same namespace
Status: Open
Type: Bug
Package: Scripting Engine problem
Operating System: linux & mac os x
PHP Version: 5.6.11
Block user comment: N
Private report: N
New Comment:
If we first make an instance of Lv\Bar, and then Lv\Foo, the script runs happily. Surprise!!!
see also: http://3v4l.org/5NF4Y
I think the alias name generated by the use statement should only take effect in the source file
canting the statement.
In our case, we put 'use Lv\Common\Foo' in the Bar.php, and then we define a Bar class
extends the Foo *Alias*. In my opinion, the alias of use statement in on script file should only not
to conflict with the symbol defined in the same file.
If an alias defined in specific file will conflict with class in other file, the programmer should
take extra burden to avoid the collision when import symbol using use statement.
In my opinion, what we want the use statement to do is not defined the alias as a symbol the current
namespace, but just as an "Shortcut" of the original class. When PHP execute this code,
the engine should be replace the "shortcut" by the original class, like C's macro.
Thanks.
Previous Comments:
------------------------------------------------------------------------
[2015-07-27 14:12:14] laruence@php.net
actually, this is quite confused one.
since you are trying to use \Lv\Common\Foo as \Lv(current_namespace)\Foo
but you already have one \Lv\Foo defined in Foo.php,
so when you try to refer "Foo" in namespace Lv(Bar.php), which Foo should be used?
thanks
------------------------------------------------------------------------
[2015-07-27 13:59:58] laruence@php.net
see also : http://3v4l.org/Ootud
------------------------------------------------------------------------
[2015-07-25 16:08:30] php at lvht dot net
Description:
------------
In one file with a namespace(eg, Lv), we define a class named Foo.
In another with a subnamespace(eg, Lv\Common), we define another class with the *same* name Foo.
In the third file with the same namespace(Lv), we first "import" Lv\Common\Foo using
"use Lv\Common\Foo" and then define a class named Bar that extends Foo(the Lv\Common\Foo).
In a test file, we first make an instance of Lv\Foo, and then try to make an instance of Lv\Bar,
which will failed with a fatal error.
Test script:
---------------
We need four files in the same directory.
1. In Foo.php,
<?php namespace Lv;
class Foo{}
2. In CommonFoo.php,
<?php namespace Lv\Common;
class Foo{}
3. In Bar.php,
<?php namespace Lv;
require 'CommonFoo.php';
use Lv\Common\Foo;
class Bar extends Foo {}
4. Finally, in app.php,
<?php
require 'Foo.php';
$foo = new Lv\Foo;
require 'Bar.php';
$bar = new Lv\Bar; # error will trigged by this line
Just run php app.php, you will see a fatal error.
Expected result:
----------------
The app.php should run without any error.
Actual result:
--------------
The error given,
PHP Fatal error: Cannot use Lv\Common\Foo as Foo because the name is already in use in ...Bar.php
on line 3
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=70135&edit=1