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

From: Date: Fri, 09 Feb 2018 13:43:58 +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-213896@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: Oh. I missed out on this reply: > Your example (echo $x; $x = 1;) is about _execution_. "No, I say that $x=1 is a declaration. I'm declaring $x to be a variable with the initial value of 1. PHP should recognize this and allow me to use the variable in the echo statement, and the fact that it does not is a bug." Tomato, tomato. Previous Comments: ------------------------------------------------------------------------ [2018-02-09 13:40:45] requinix@php.net > the *real* problem anyways is that it behaves different at all Of course. I was addressing the (unasked) question of which of the two behaviors was correct. You say one, I say the other. But it's ultimately about opcache, which I am certainly not an expert of. > Your example is about _execution_. My example is about _declaration_. At first glance yes, because as PHP developers we have the ingrained belief that class and function definitions are separate from the execution of the script. But that is not entirely true. Sometimes there is overlap. This is one of those times. I think I've made my point clear enough that I can't really add anything more to it, so unless a dev comes and says I'm incorrect then this report is not a bug and is simply a misunderstanding of some of the PHP internals. These sorts of things are often hidden to userland developers anyways. Unless you want to make this a feature request. Do you believe that PHP should change how it deals with classes (and functions) to suit your needs? ------------------------------------------------------------------------ [2018-02-09 13:20:56] akademic at hub dot sknt dot ru I've understood your first comment completly. And now I know what happens under the rug. And I've fixed my code now. I appreciate your help. Your example (echo $x; $x = 1;) is about _execution_. My example (class class_one extends class_two) is about _declaration_. I believe there is the difference. I understand technical reasons. But take a look on this case from PHP-user point. I have a class: class class_one {} And it works perfectly. Now I change it to class class_one extends class_two {} My thoughts: I don't have class_two in this file, but I have autoload function, which knows where class_two is located. So that's ok. Reality: Fatal error: Class 'class_one' not found. WTF? I haven't changed the names. I haven't moved code blocks around. I've simply added a little bit of inheritance and things have gone wrong. It shouldn't be that. Both situations (with and without inheritance) should fail or both situations should success. ------------------------------------------------------------------------ [2018-02-09 13:14:39] spam2 at rhsoft dot net no, the bug is clearly that it don't work without because at *compile time* there is no reason that order matters - that's what compilers are about the *real* problem anyways is that it behaves different at all while a cache/optimizer should be fully transparent and not change basic behavior ------------------------------------------------------------------------ [2018-02-09 13:10:32] requinix@php.net As far as I'm concerned, the bug in your report is that the code works with opcache, not that it doesn't without. Frankly I wish we could get rid of the whole "functions/classes can be used before they're defined" feature. ------------------------------------------------------------------------ [2018-02-09 12:58:56] spam2 at rhsoft dot net > edge case when it comes to defining classes after they're used there are a lot of more edge-cases like https://bugs.php.net/bug.php?id=75542 where obviously opcache takes over way to much of what the compiler should do "PHP runs files in two steps: a compilation phase where it tries to understand what's in a file" is skipped in the bugreport above and we talk about just a single file ------------------------------------------------------------------------ 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=75943 -- Edit this bug report at https://bugs.php.net/bug.php?id=75943&edit=1

« previous php.bugs (#213896) next »