PHP 8.1.1 的 __toString() 方法问题 - 如果在声明类本身之前创建实例,则导致找不到类

Cha*_*ada 4 php methods class tostring php-8.1

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

未捕获错误:在 C:\xampp81\htdocs\helpdesk811\test81\index.php:2 中找不到类“TestC”:2 堆栈跟踪:#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";
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我稍后定义类并创建实例,它会起作用,但我找不到此行为的任何文档。它与静态方法相同(public static function foo(){echo "bar";})。

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

小智 7

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

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