Bug #70135 [Opn]: class alias conflict with class defined in another file with the same namespace

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

« previous php.bugs (#194760) next »