PHP:不能在定义接口之前引用实现接口的类(但可以没有接口)



当谈到"定义之前的访问类":为什么php对待独立类与实现接口的类不同?我认为下面的代码应该可以工作,但它不起作用。(尝试使用php 7.3.9和8.1.11,带或不带命名空间…(我知道接口和类定义的顺序在";扩展";以及";实现";,但这是一个不同的问题。

这是php的"bug"/不一致,还是我忽略的特定语言规则?

<?php
// This works fine:
$a1 = new A();
// The following line causes error:
$b1 = new B();
// Fatal error: Uncaught Error: Class "B" not found in D:CodingPHPstrange.php:6
class A {}
interface I {}
class B implements I {}
// After the class definitions everything is fine (after commenting out line #6 of course)
$a2 = new A();
$b2 = new B();

注意:这个旧线程有点相似,但不完全相同。

PHP原则上是一种顺序语言,这意味着一切都按照开发人员编写的顺序执行(当您需要/包含文件时,实际上是在准备代码(。PHP在实际代码执行之前处理函数和类,这是为了加快速度,在继续执行之前进行检查,准备函数符号,并可能添加一些针对旧编程语言的高级语言便利功能,但不是为了让开发人员始终能够忽略顺序。

PHP在解析文件时实际上会在后台创建函数声明,就像在C/C++(过程编程(中手动执行一样,允许在定义之前进行调用。然而,类继承、接口实现和条件定义是在运行时执行的,因此将这些类排除在早期声明过程之外。发生这种情况是因为必须检查许多事情,例如:一个类实际上实现了一个接口,并遵循了后者中定义的规范,该规范将被执行。因此,您不能调用以前既没有声明也没有定义的函数或类,因为PHP解释器没有其他方法可以知道它的存在。

在我看来,最好保持代码文件、文件夹结构和定义的良好层次结构,和/或尽可能使用自动加载来避免这种奇怪的情况。

相关内容

最新更新