【问题标题】:Class definitions in the same file cause fatal error同一文件中的类定义导致致命错误
【发布时间】:2017-01-17 21:39:55
【问题描述】:

我知道在 PHP 中您可以定义一个类,并且无论它在文件中的位置如何,您都可以使用该类。例如,看看下面的代码:

<?php 

//First case. No errors.
class Second extends First{}
class First{};

//Second case. Still nothing.
abstract class B extends A{};
class C extends B{};
class A{};

//Fatal error!
class C1 extends B1 { };
abstract class B1 extends A1{ };
class A1 { };
?>

前两种情况很好,但不是最后一种。为什么?有什么规律吗?

附:我正在使用 PHP 5.6.25、Apache 2.4、CentOS 6.7。

【问题讨论】:

  • class B1?它在哪里?你必须有一个类来扩展它。
  • @PHPglue 第 14 行。
  • @PHPglue 1. 不要感到震惊。 2. 我在问为什么前两个很好,而第三个是NOT
  • @PHPglue 我使用自动加载器来加载我的类。我只是想知道它为什么会这样。

标签: php class


【解决方案1】:

我找不到这方面的书面规则,但看到了这个结果:

<?php
//A1 Exists
echo class_exists("A1")?"A1 Exists<br>":"A1 Not exists<br>";
//B1 Not exists
echo class_exists("B1")?"B1 Exists<br>":"B1 Not exists<br>";
//C1 Not exists
echo class_exists("C1")?"C1 Exists<br>":"C1 Not exists<br>";
class C1 extends B1 {};
class B1 extends A1{ };
class A1 { };
?>

我可以弄清楚解释器可以向后和向前寻找父类,但是当您链接第三级继承时,它无法预测 B1 将存在。

如果你这样做:

<?php
//A1 Exists
echo class_exists("A1")?"A1 Exists<br>":"A1 Not exists<br>";
//B1 Not exists
class B1 extends A1{ };
class A1 { };
?>

它说'好的,我之前没有看到 A1 类声明,但我看到它在前面'。

【讨论】:

  • 我验证了这个“问题”在 PHP 7.0 中仍然存在,并且很想说你的解释是正确的。看起来解析器使用整个文件的标记化结果来“修补”由于遗留原因不正确的声明顺序,但实际上只在一个直接的继承链中解析它们。因此,它在多个场景中始终在 3 级或更高级别失败。
【解决方案2】:

我很抱歉,但这不是真的,尽管看起来是这样:

我知道在 PHP 中你可以定义一个类,不管它在文件中的位置如何,你都可以使用这个类。

让我们检查documentation

注意: 类必须在使用前定义!如果您希望 Named_Cart 类扩展 Cart 类,则必须首先定义 Cart 类。如果要基于 Named_Cart 类创建另一个名为 Yellow_named_cart 的类,则必须先定义 Named_Cart。简而言之:定义类的顺序很重要。

【讨论】:

  • 但是前两个没问题。我在定义之前扩展了 First 类。
猜你喜欢
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多