[英]PHP - require_once and class inheritance issue
我收到致命错误: Fatal error: Class 'Foo1' not found in .../Foo2.php on line 5
带有以下文件的Fatal error: Class 'Foo1' not found in .../Foo2.php on line 5
:
index.php文件:
<?php
require_once("./Foo1.php");
?>
<h1>Success</h1>
Foo1.php:
<?php
require_once('./IFoo.php');
require_once('./Bar.php');
class Foo1 implements IFoo
{
/** @var Bar */
private $bar;
}
IFoo.php:
<?php
interface IFoo {
}
Bar.php:
<?php
require_once('./Foo2.php');
class Bar {
/** @var Foo2 */
private $foo;
}
Foo2.php:
<?php
require_once("./Foo1.php");
class Foo2 extends Foo1
{
}
问题:
implements IFoo
语句时,此代码有效? 更新建议的大多数解决方案,包括自动加载 。 不幸的是,我的问题是在一个有很多现有代码和很多不良实践的旧项目上。 我们真的离PSR-0标准还很远。
就性能而言,引入自动加载的成本是多少?
include
任何其他可执行代码(例如require
/ include
)。 Foo1
实现IFoo
,php对IFoo
一无所知,因此它无法注册类Foo1
。 由于未注册任何自动装带器,因此php开始使用解释代码,从Foo1.php
省略类声明,直到包括并解析了其他文件。 当到达Foo2.php
它不包括Foo1.php
(由于require_once
)并开始解释该文件-此处遇到的是类Foo1
,由于当时接口实现不存在,该类的定义已被跳过。 到目前为止,php还不知道已经在必需的Foo1.php
声明了Foo1.php
,因为它没有机会完全解释该文件。 我建议使用自动加载标准PSR-0 。 它描述了自动装带器互操作性必须遵守的强制性要求。
无论如何在这种情况下:
Foo1.php
您包括Bar.php
并因为这一行: require_once('./Foo2.php');
, Class Foo2
扩展了Class Foo1
。 但是尚未定义Foo1
类! 您只能在定义后扩展类。
因此,似乎require_once('./Foo2.php');
不应该在Bar.php
。 或者您应该移动require_once('./Bar.php');
在class Foo1
定义之后。
<?php
require_once('./IFoo.php');
class Foo1 implements IFoo
{
/** @var Bar */
private $bar;
}
require_once('./Bar.php');
如果您将Foo1.php文件修改为此
<?php
require_once('./IFoo.php');
class Foo1 implements IFoo
{
/** @var Bar */
private $bar;
}
require_once('./Bar.php');
?>
这可行。
原因是PHP是解释性语言(解释器逐行执行脚本)。 因此,在您的情况下,解释器会错过Foo1声明语句,并在Foo2.php中遇到未定义的类Foo1时引发错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.