1

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標準からはほど遠いです。

オートローディングを導入すると、パフォーマンスの観点からどのくらいのコストがかかりますか?

4

3 に答える 3

1
  1. 自動読み込み機能を使用します。クラス定義を含むファイルには、他の実行可能コード ( require/など) を使用しないでください。include
  2. Foo1実装するIFooと、php は について何も知らないIFooため、クラスを登録できませんFoo1Foo1.phpオートローダーが登録されていないため、他のファイルが含まれて解析されるまで、php は からクラス宣言を省略してコードの解釈を開始します。に到達Foo2.phpすると、Foo1.php( が原因でrequire_once) インクルードされず、ファイルの解釈が開始されます。ここでFoo1、その時点でインターフェース実装が存在しないために定義がスキップされたクラスに遭遇します。Foo1.phpこの時点では、このファイルを完全に解釈する機会がなかったため、php は Foo1 が既に required で宣言されていることを認識していません。
于 2013-09-06T19:58:48.257 に答える