php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #78124 Subclass of an included class not available
Submitted: 2019-06-07 19:02 UTC Modified: 2019-06-09 12:54 UTC
Votes:1
Avg. Score:4.0 ± 0.0
Reproduced:0 of 0 (0.0%)
From: aschmidt at anamera dot net Assigned:
Status: Open Package: Scripting Engine problem
PHP Version: 7.2.19 OS: Win x64
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2019-06-07 19:02 UTC] 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

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2019-06-07 19:27 UTC] nikic@php.net
-Status: Open +Status: Feedback
 [2019-06-07 19:27 UTC] nikic@php.net
You likely have opcache enabled on one version and disabled on the other. Is that the case?
 [2019-06-07 19:51 UTC] aschmidt at anamera dot net
-Status: Feedback +Status: Open
 [2019-06-07 19:51 UTC] 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-08 09:22 UTC] sjon@php.net
this behavior seems pretty consistent: https://3v4l.org/GnDr2
 [2019-06-09 12:54 UTC] aschmidt at anamera dot net
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.
 
PHP Copyright © 2001-2019 The PHP Group
All rights reserved.
Last updated: Thu Nov 21 11:01:21 2019 UTC