クラスが再定義されたことを依然として伝えるために require_once を使用する問題について話しました。そこで私は数日前に遭遇した現象を思い出した。今日、調査の具体的な理由を思い出したので、ここで言わせてください。言わなければ忘れてしまうでしょう。私は脳を介さずにすべてを行っているようです。脳の二次キャッシュ、メモリ、さらにはハードドライブさえも哀れなほど小さいです。うーん。
次の 3 つのファイル c.php a.php b.php があり、対応するストレージ ディレクトリが localhost/localhost/localhost/demo であるとします。
コードをコピー | |
require_once("a.php"); require_once("demo/b.php"); B::demo();a.php クラスA { } |
コードをコピー | |
クラス B は A を拡張します { パブリック静的関数demo() { エコー「xx」; } } |
。
警告: require_once(../a.php) [function.require-once]: ストリームを開けませんでした: F:wwwdemob.php の 2 行目にそのようなファイルまたはディレクトリはありません
致命的なエラー: require_once() [function.require]: F:wwwdemob.php の 2 行目で、必要な '../a.php' (include_path='.;C:php5pear') を開くことができませんでした。 b.php の require_once ステートメントを削除すると、正常に実行されるので、定義された require_once ステートメントが多すぎるのでしょうか。理由は、クラス A が 2 回再定義されたためですか?しかし、そうではありません。 c.php に require_once(‘a.php’); を追加するだけなら、2 回書いても正しくなります。
その理由は、b.php で定義されたディレクトリ レベルが c.php 実行ファイルのディレクトリ レベルと一致せず、その結果、c.php に 2 つの require_once ステートメントが発生するためです。
と同等にする
コードをコピー | |
require_once("../a.php"); クラス B は A を拡張します { パブリック静的関数デモ() { エコー「xx」; } } B::デモ(); |
したがって、PHP で require_once を使用する場合、異なる階層関係が存在するため、相対ディレクトリの使用には注意が必要であるという結論になります。