Bug #78124 [Opn]: Subclass of an included class not available
| From: | aschmidt at anamera dot net | Date: | Sun, 09 Jun 2019 12:54:11 +0000 |
| Subject: | Bug #78124 [Opn]: Subclass of an included class not available | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-221199@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=78124&edit=1
ID: 78124
User updated by: aschmidt at anamera dot net
Reported by: aschmidt at anamera dot net
Summary: Subclass of an included class not available
Status: Open
Type: Bug
Package: Scripting Engine problem
Operating System: Win x64
PHP Version: 7.2.19
Block user comment: N
Private report: N
New Comment:
Thanks for that test. So in my attempt to strip down the code of my (possibly SECONDARY problem) to
the bare essentials, I unintentionally may have stumbled on the the more generic, primary problem?
Now that it's reproduced in all PHP releases, is this accepted as an unintended behavior/bug?
PS: My ORIGINAL problem occurs in a complex application (a Plug-In file in a WordPress environment),
where the "test script" code itself is part of a deep multi-level code and include
sequence in WordPress.
In my "real" problem, the code that is unable to reference the subclass (demonstrated by
the "class_exists(...);") is actually inside a function that gets called much later by
WordPress in its execution order. Lucky for me in that combination, the PHP parser will have already
parsed the entire script (including subclass that extends an included class) before the function is
ever called, effectively MASKING the above problem.
But, my production code has a "return;" statement BEFORE the subclass definition. I have
the suspicion that given the primary problem you reproduced, there is then a secondary problem when
OPcache is running: With OPcache running, the entire script appears not be parsed unless I remove
the "return;". That then UNmasks the primary problem of extending parent classes that
reside in includes.
Previous Comments:
------------------------------------------------------------------------
[2019-06-08 09:22:05] sjon@php.net
this behavior seems pretty consistent: https://3v4l.org/GnDr2
------------------------------------------------------------------------
[2019-06-07 19:51:22] aschmidt at anamera dot net
I had ASSUMED that to be the case.
But then I reproduced the problem even after I updated the PHP.INI to comment out all caching
includes, and restarting the web server:
;zend_extension=php_opcache.dll
[XDebug]
; Must be loaded after OpCache !
;zend_extension = "C:\Program Files\PHP\v7.2\ext\php_xdebug-2.7.2-7.2-vc15-nts-x86_64.dll"
xdebug.coverage_enable=0
[PHP_WINCACHE]
;extension=php_wincache.dll
------------------------------------------------------------------------
[2019-06-07 19:27:00] nikic@php.net
You likely have opcache enabled on one version and disabled on the other. Is that the case?
------------------------------------------------------------------------
[2019-06-07 19:02:23] aschmidt at anamera dot net
Description:
------------
If a class extends a parent class from an include/require, then the subclass cannot be referenced
until AFTER the class definition.
However, if a class extends a parent class from the SAME script, then the subclass CAN be referenced
anywhere in the code.
I can't tell at what point this broke, but this appears to have worked in earlier 7.2 releases.
Test script:
---------------
<?php
declare(strict_types=1);
require( 'bug2.php' );
// Error: mySubClass2 does NOT exist!
var_dump( class_exists( 'myClass1', FALSE ), class_exists( 'mySubClass1', FALSE
), class_exists( 'myParentClass', FALSE ), class_exists( 'mySubClass2', FALSE )
);
class myClass1 {
const myConst = 'C1';
}
class mySubClass1 extends myClass1 {
const myConst = 'S1';
}
class mySubClass2 extends myParentClass {
const myConst = 'S2';
}
// Correct: Now mySubClass2 DOES exist!
var_dump( class_exists( 'myClass1', FALSE ), class_exists( 'mySubClass1', FALSE
), class_exists( 'myParentClass', FALSE ), class_exists( 'mySubClass2', FALSE )
);
Content of file "bug2.php":
<?php
declare(strict_types=1);
class myParentClass {
const myConst = 'Parent';
}
Expected result:
----------------
subclass_bug.php:7:boolean true
subclass_bug.php:7:boolean true
subclass_bug.php:7:boolean true
subclass_bug.php:7:boolean true
Actual result:
--------------
subclass_bug.php:7:boolean true
subclass_bug.php:7:boolean true
subclass_bug.php:7:boolean true
subclass_bug.php:7:boolean false
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=78124&edit=1