1

从 PHP 7.3 升级到 8.1.1 后我遇到了一个问题 当然还有很多工作要做,但这有点奇怪。此示例不适用于我的错误致命错误:

未捕获的错误:在 C:\xampp81\htdocs\helpdesk811\test81\index.php:2 中找不到类“TestC”堆栈跟踪:#0 {main} 在 C:\xampp81\htdocs\helpdesk811\test81\index.php 中抛出在第 2 行

<?php
$a = new TestC;
echo $a->a;
class TestC
{
    public $a = "a_value";
    public $b;
    public function __toString()
    {
        return "string";
    }
}

如果我稍后定义类并创建实例,它可以工作,但我无法找到任何有关此行为的文档。静态方法(公共静态函数 foo(){echo "bar";})也是如此。

我尝试了 3v4l.org 沙箱,它适用于 >5.0 && <8.0 的版本

4

2 回答 2

2

您可以在定义类之前使用它,但前提是允许提前绑定。如果某些依赖项尚不可用,如果类使用特征或实现接口,则早期绑定不起作用。由于 PHP 8 有一个新Stringable接口,并且每个定义__toString()函数的类都隐式地实现了该接口,从而防止了早期绑定。

Nikita Popov (nikic) 写了一篇关于PHP 中的早期绑定的文章,其中他提到这种行为确实没有得到很好的记录。

于 2022-02-13T18:58:51.780 回答
1

我正在深入挖掘,看起来它真的是BUG。 https://bugs.php.net/bug.php?id=79350

于 2022-01-07T18:24:28.510 回答