繁体   English   中英

PHP-require_once和类继承问题

[英]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
{
}

问题:

  1. 如何解决这种情况?
  2. 为什么当我取消implements IFoo语句时,此代码有效?

更新建议的大多数解决方案,包括自动加载 不幸的是,我的问题是在一个有很多现有代码和很多不良实践的旧项目上。 我们真的离PSR-0标准还很远。

就性能而言,引入自动加载的成本是多少?

  1. 使用自动加载功能。 请勿在具有类定义的文件中include任何其他可执行代码(例如require / include )。
  2. 因为当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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM