1

我收到一个致命错误:Fatal error: Class 'Foo1' not found in .../Foo2.php on line 5使用以下文件:

索引.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 {
}

酒吧.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 标准还很远。

在性能方面引入自动加载的成本是多少?

4

3 回答 3

1
  1. 使用自动加载功能。不要在具有类定义的文件中添加任何其他可执行代码(如require/ include)。
  2. 因为在Foo1implements的时候IFoo,php什么都不知道IFoo,所以不能注册class Foo1。由于没有注册自动加载器,php 开始解释代码,省略类声明Foo1.php,直到包含和解析其他文件。当它到达时,Foo2.php它不包括Foo1.php(由于require_once)并开始解释文件 - 在这里它遇到Foo1由于当时不存在接口实现而跳过定义的类。此时 php 不知道 Foo1 是在 already required 中声明的Foo1.php,因为它没有机会完全解释这个文件。
于 2013-09-06T19:58:48.257 回答
0

如果将 Foo1.php 文件修改为此

<?php
require_once('./IFoo.php');

class Foo1 implements IFoo
{
/** @var  Bar */
private $bar;
}

require_once('./Bar.php');

?>

这行得通。

原因是 PHP 是解释型语言(解释器逐行执行脚本)。因此,在您的情况下,解释器错过了 Foo1 声明语句,并在遇到 Foo2.php 中未定义的类 Foo1 时引发错误。

于 2013-09-06T19:50:53.157 回答
0

我建议使用Autoloading Standard PSR-0。它描述了自动装载机互操作性必须遵守的强制性要求。

无论如何,在这种情况下:

Foo1.php

您正在包括Bar.php并且因为这一行:require_once('./Foo2.php');, Class Foo2extends Class Foo1。但是 ClassFoo1还没有定义!只有在它的定义之后,您才能扩展一个类。

所以似乎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');
于 2013-09-06T19:47:58.347 回答