php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #79350 Classes with __toString() do not support early binding
Submitted: 2020-03-07 04:12 UTC Modified: 2021-07-23 09:29 UTC
Votes:4
Avg. Score:4.0 ± 0.7
Reproduced:4 of 4 (100.0%)
Same Version:2 (50.0%)
Same OS:2 (50.0%)
From: bugreports at gmail dot com Assigned:
Status: Analyzed Package: Scripting Engine problem
PHP Version: master-Git-2020-03-07 (Git) OS: Linux
Private report: No CVE-ID: None
View Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
If you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: bugreports at gmail dot com
New email:
PHP Version: OS:

 

 [2020-03-07 04:12 UTC] bugreports at gmail dot com
Description:
------------

this is only broken with PHP 8.0-dev for some time now and it's technically not possible that a class defined in the include above the extending definition is not found

require_once __DIR__ . '/PelEntry.php';
class PelEntryUndefined extends PelEntry
{
}


[builduser@testserver:/rpmbuild/SPECS]$ /home/builduser/rpmbuild/BUILD/php-8.0.0/sapi/cli/php -n /www/php-bug/test.php
Fatal error: Uncaught Error: Class 'PelEntry' not found in /Volumes/dune/www-servers/php-bug/pel/PelEntryUndefined.php:59
Stack trace:
#0 /Volumes/dune/www-servers/php-bug/pel/PelIfd.php(44): require_once()
#1 /Volumes/dune/www-servers/php-bug/pel/PelTag.php(45): require_once('/Volumes/dune/w...')
#2 /Volumes/dune/www-servers/php-bug/pel/PelEntry.php(52): require_once('/Volumes/dune/w...')
#3 /Volumes/dune/www-servers/php-bug/pel/PelExif.php(47): require_once('/Volumes/dune/w...')
#4 /Volumes/dune/www-servers/php-bug/pel/PelJpeg.php(49): require_once('/Volumes/dune/w...')
#5 /Volumes/dune/www-servers/php-bug/test.php(2): include_once('/Volumes/dune/w...')
#6 {main}
  thrown in /Volumes/dune/www-servers/php-bug/pel/PelEntryUndefined.php on line 59

Test script:
---------------
tarball with the (i know outdated) pel-library and the simplest reproducer which works in 7.0-7.4 but no longer with HEAD

https://drive.google.com/file/d/1stClmJ92hp1ZbDNbRYOGyu3FXn0ktRbI/view?usp=sharing


Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2020-03-12 10:09 UTC] nikic@php.net
-Status: Open +Status: Verified
 [2020-03-12 10:09 UTC] nikic@php.net
I think something is going wrong with a recursive require_once.
 [2020-03-12 10:22 UTC] nikic@php.net
No, that's not it. I think the issue is that this code is relying on early binding, and early-binding on the PelEntry class is now prevented due to implicit addition of Stringable interface.
 [2020-03-12 10:29 UTC] nikic@php.net
-Status: Verified +Status: Analyzed
 [2020-03-12 10:29 UTC] nikic@php.net
Here's a reduced test case:

<?php
  
echo new Test, "\n";

class Test {
    public function __toString() {
        echo "Early bound!";
    }
}
 [2020-03-12 10:51 UTC] bugreports at gmail dot com
sounds like a terrible BC break and at least the error message is unhelpful nonsense given that even one of the zend engine experts pointed at include at the first try :-)
 [2021-07-23 09:29 UTC] nikic@php.net
-Summary: 8.0-dev: Uncaught Error: Class 'PelEntry' not found +Summary: Classes with __toString() do not support early binding
 [2021-09-26 07:27 UTC] wxiaoguang at gmail dot com
Is it possible to get this bug fixed? It seems breaking the language spec, and trying to bypass the bug makes code messy.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Mon Dec 30 14:01:28 2024 UTC