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
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
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: Sat Dec 21 17:01:58 2024 UTC