Bug #66773 [Com]: Autoload with Opcache allows importing conflicting class name to namespace
| From: | nikic@php.net | Date: | Thu, 23 Oct 2014 10:07:34 +0000 |
| Subject: | Bug #66773 [Com]: Autoload with Opcache allows importing conflicting class name to namespace | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-188274@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=66773&edit=1
ID: 66773
Comment by: nikic@php.net
Reported by: carl dot vuorinen at w3 dot fi
Summary: Autoload with Opcache allows importing conflicting
class name to namespace
Status: Assigned
Type: Bug
Package: opcache
Operating System: Linux (Ubuntu)
PHP Version: 5.5.9
Assigned To: dmitry
Block user comment: N
Private report: N
New Comment:
I agree with Dmitry, it would be best to allow shadowing class definitions with imports in PHP 7.
The current behavior is pretty weird, especially as it depends on the order in which classes are
loaded.
Previous Comments:
------------------------------------------------------------------------
[2014-10-23 09:17:47] dmitry@php.net
Unfortunately, the patch is wrong.
Opcache compiles each script separately by design.
Otherwise, it'll may make dependencies on other scripts.
And later to unpredictable behavior, if some of those scripts are changed and recompiled but
depended is not.
The patch breaks this rule.
Actually, the behavior with opcache seems better :)
May be it makes sense switching to it in PHP7.
------------------------------------------------------------------------
[2014-10-22 09:41:14] jpauli@php.net
I got a patch at https://github.com/jpauli/ZendOptimizerPlus/compare/66773
I compiles and works just fine for 5.5, shouldn't diff for other versions.
Dmitry, this needs review
------------------------------------------------------------------------
[2014-06-23 16:17:26] devosc at gmail dot com
I prefer the new behaviour and would like it to be kept/maintained.
------------------------------------------------------------------------
[2014-06-23 12:30:38] jpauli@php.net
Reproduced.
Seems like a bug.
@dmitry: any idea ? I found that the compiler class_table is reseted between each compilation by
opcache (https://github.com/zendtech/ZendOptimizerPlus/blob/master/ZendAccelerator.c#L1411), thus
the class can't be found and detected as already used.
------------------------------------------------------------------------
[2014-05-27 01:11:55] adrien dot crivelli at gmail dot com
Same issue here. The test script could be reproduced:
$ lsb_release -a
LSB
Version: core-2.0-amd64:core-2.0-noarch:core-3.0-amd64:core-3.0-noarch:core-3.1-amd64:core-3.1-noarch:core-3.2-amd64:core-3.2-noarch:core-4.0-amd64:core-4.0-noarch
Distributor ID: Ubuntu
Description: Ubuntu 14.04 LTS
Release: 14.04
Codename: trusty
$ php -v
PHP 5.5.9-1ubuntu4 (cli) (built: Apr 9 2014 17:11:57)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
$ php -i | grep opcache.enable_cli
opcache.enable_cli => On => On
$ php execute.php
self: Some\Bar
parent: Other\Bar
$ php -i | grep opcache.enable_cli
opcache.enable_cli => Off => Off
$ php execute.php
PHP Fatal error: Cannot use Other\Bar as Bar because the name is already in use in
/tmp/a/some_foo.php on line 5
PHP Stack trace:
PHP 1. {main}() /tmp/a/execute.php:0
PHP 2. spl_autoload_call() /tmp/a/execute.php:13
PHP 3. {closure:/tmp/a/execute.php:6-8}() /tmp/a/execute.php:0
PHP 4. spl_autoload() /tmp/a/execute.php:7
Fatal error: Cannot use Other\Bar as Bar because the name is already in use in /tmp/a/some_foo.php
on line 5
Call Stack:
0.0002 235776 1. {main}() /tmp/a/execute.php:0
0.0005 242720 2. spl_autoload_call() /tmp/a/execute.php:13
0.0005 242752 3. {closure:/tmp/a/execute.php:6-8}() /tmp/a/execute.php:0
0.0005 242880 4. spl_autoload() /tmp/a/execute.php:7
------------------------------------------------------------------------
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=66773
--
Edit this bug report at https://bugs.php.net/bug.php?id=66773&edit=1