次のプロジェクト構造を検討してください。
/path/to/projectroot/index.php
header.php
include/inc.php
index.php があった場合
include('include/inc.php');
そしてinc.phpは持っていました
include('header.php');
inc.php の行が探しているため、そのエラーが発生します。
/path/to/projectroot/include/header.php (存在しません)
いいえ
/path/to/projectroot/header.php (存在します)
人々がこれを解決する方法はいくつかあります。
1: 絶対パス
最初の最も簡単な方法は、絶対パスを使用することです。
index.php があった場合
include('include/inc.php');
そしてinc.phpは持っていました
include('/path/to/projectroot/header.php');
これはうまくいくでしょう。
2: 定義付きの絶対パス
#1 と同様、index.php が
define('PROJECT_ROOT', '/path/to/projectroot/');
include(PROJECT_ROOT.'include/inc.php');
そしてinc.phpは持っていました
include(PROJECT_ROOT.'header.php');
これはうまくいくでしょう。
更新: pichanのコメントに記載されているように、index.php で「魔法の」定数の 1 つを使用できます。
index.php
define('PROJECT_ROOT', __DIR__.'/');
include(PROJECT_ROOT.'include/inc.php');
および inc.php
include(PROJECT_ROOT.'header.php');
__DIR__
次の理由から、ここに末尾のスラッシュを追加することに注意してください。
ルート ディレクトリでない限り、このディレクトリ名には末尾のスラッシュはありません。
3: 両方を含めてエラーを非表示にする
inc.php があった場合
@include('header.php'); # Try this directory
@include('../header.php'); # Try parent directory
これは機能します。[1]
4: 特に指定がない限り、現在のディレクトリを想定
index.php があった場合
$rel_prefix_to_root = '../';
include('include/inc.php');
そしてinc.phpは持っていました
if(!isset($rel_path_to_root)){ $rel_path_to_root = ''; }
include($rel_path_to_root . 'header.php');
これはうまくいくでしょう。
これらの方法に対する私の見解
1 と 2 は基本的に同じですが、1 つの定数定義を作成してサイト全体で使用できるため、2 の方が少し簡単で、大きなプロジェクトではより一般的です。また、プロジェクトを複数のサーバー (複数のパスに配置) にデプロイすることもでき、オプション 1 の各ファイルで 1 行を変更するのとは対照的に、プロジェクト全体で 1 行を変更するだけで済みます。
3 ひどいです、やらないでください。時々あなたはそれを見るでしょう、オンラインのチュートリアルでさえそれを見るかもしれません. やらないでください。
4 はおそらく 1 または 2 を優先して避けるべきです。ただし、複雑な一連のインクルードがある場合は、このアプローチが必要になる場合があります。
いくつかのメモ:
[1] これはひどい考えです。動作しますが、実行しないでください。