Bug #75943 [Nab]: autoload trying load existing class when it extends not existing class
| From: | requinix@php.net | Date: | Fri, 09 Feb 2018 12:43:40 +0000 |
| Subject: | Bug #75943 [Nab]: autoload trying load existing class when it extends not existing class | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-213888@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=75943&edit=1
ID: 75943
Updated by: requinix@php.net
Reported by: akademic at hub dot sknt dot ru
Summary: autoload trying load existing class when it extends
not existing class
Status: Not a bug
Type: Bug
Package: Class/Object related
Operating System: Ubuntu 16.04.3 LTS
PHP Version: 7.2.2
Block user comment: N
Private report: N
New Comment:
Think about this.
1. PHP cannot have class_one defined without knowing what class_two is, right? Obviously.
2. If class_two does not exist when the file is compiled then class_one cannot be available yet when
it's done.
3. So when PHP starts executing the file, class_one does not exist. It will be only when those lines
of code execute.
4. If you try to use class_one before those lines of code get executed then PHP will do what
it's supposed to do and call the autoloader.
Do you think that this code should work?
echo $x;
$x = 1;
Yeah, refactoring your code has given you more work to do. Welcome to the world of software
development.
Previous Comments:
------------------------------------------------------------------------
[2018-02-09 12:26:54] akademic at hub dot sknt dot ru
This is so different behavior in almost the same situation.
This is extreamly confusing.
Imagine that you've just written class and it works.
Than you refactor your class and move some functions in parent.
Now all things are broken. And you can't undestand why.
I believe this need to be fixed in PHP.
------------------------------------------------------------------------
[2018-02-09 08:42:15] requinix@php.net
You've encountered an edge case when it comes to defining classes after they're used.
PHP runs files in two steps: a compilation phase where it tries to understand what's in a file,
and an execution phase where it actually runs the code. If a class can be fully understood during
the first phase then you can use it at any place in the file regardless of whether it comes before
or after the definition, but if not then class definition has to be "executed" during the
second phase.
Since class_two is not defined, class_one cannot be loaded during the first phase. In the second
phase, since test() executes before the class_one definition, PHP will not know the class exists yet
and thus will try to autoload it.
If you want PHP to try to autoload class_two then class_one has to be defined before test() tries to
use it.
https://3v4l.org/Ei3Ek
------------------------------------------------------------------------
[2018-02-09 08:22:52] akademic at hub dot sknt dot ru
Description:
------------
In example below I expect that autoload call back will try to load class_two.
But it try to load existing class_one.
If you comment out 'extends class_two', autoload callback will not start.
Test script:
---------------
spl_autoload_register(function($class) {
var_dump('autoload '.$class);
});
test();
function test() {
$m = new class_one();
}
class class_one extends class_two {
function __construct() {
var_dump('I am '.__CLASS__);
}
}
Expected result:
----------------
string(18) "autoload class_two"
Actual result:
--------------
string(18) "autoload class_one"
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=75943&edit=1