Bug #75943 [Nab]: autoload trying load existing class when it extends not existing class

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

« previous php.bugs (#213888) next »