30

したがって、このディレクトリ構造を調べます

  • /include_one.php
  • /include_two.php
  • /directory/main_file.php

私が/directory/main_file.phpにいてinclude('../include_one.php');、include_one.php内を呼び出して、 include_two.phpをインクルードするとします。電話する必要がありますinclude('include_two.php);include('../include_two.php');

だから私の質問は:ファイルをインクルードするとき、「相対インクルードパス」はインクルードされたファイルにシフトされますか、それともメインのインクルードファイルに残りますか?

最善の代替策は、root_pathを含むconfig.phpを使用することですが、この段階ではこれは不可能です。


更新:
だから、ここに私のテストがあるので、誰が正しいのかわかりません

ディレクトリ構造

/include.php
/start/start.php
/folder1/includeone.php
/folder1/folder2/includetwo.php

これが各ファイルの内容です

start.php

<?php 
  echo 'including ../include.php<br />';
  include('../include.php');
?>

include.php

<?php 
  echo 'including folder1/includeone.php<br />';
  include('folder1/includeone.php');
?>

includeone.php

<?php 
  echo 'including folder2/includetwo.php<br />';
  include('folder2/includetwo.php');
?>

includetwo.php

<?php 
  echo 'done<br />';
?>

出力は

../include.php
を含むfolder1/includeone.php
を含むfolder2 /includetwo.phpを含む
完了

4

4 に答える 4

59

「相対パス」はインクルードファイルにシフトされません...これは、相対パスの使用が一般的に正しく終了しないことを意味します。

私がほとんどいつも使用しているより良い解決策は、常に絶対パスを使用__DIR__することです。これを書き込むファイルを含むディレクトリを取得するには、を使用して相対パスと絶対パスを混在させることができます。


たとえば、ではinclude_one.php、次を使用します。

require_once __DIR__ . '/include_two.php';

include_two.phpと同じディレクトリにあるファイルを含めるためinclude_one.php


そして、でmain_file.php、あなたは使用するでしょう:

require_once __DIR__ . '/../include_one.php';

include_one.php1つ上のディレクトリにあるファイルを含める。


これにより、どのファイルから呼び出されても、インクルードは機能します。

于 2010-07-26T10:42:17.367 に答える
2

インクルードパスは、インクルードチェーンの最初のファイルからの相対パスです。

正しいインクルードパスを確認する良い方法は、常にドキュメントルートからインクルードすることです。

これは次のように行われます。

include $_SERVER['DOCUMENT_ROOT'] . '/folder1/folder2/includetwo.php';

于 2019-06-03T08:15:04.590 に答える
1

私はこのコードを使用しています:

if(!isset($TO_HOME_DIR)) $TO_HOME_DIR="../"; 

そして私はファイルを含めます:

include_once($TO_HOME_DIR."common/include_one.php");

を使用if(!isset($TO_HOME_DIR))すると、ファイルをインクルードファイルにインクルードファイルにインクルードファイルにインクルードするかどうかは重要ではありません。最初のファイルとメインファイルの$TO_HOME_DIR宣言のみが使用されます。

このアプローチの2番目の利点は、ファイルのディレクトリを変更する場合、1行のコードを変更するだけでよいことです。$TO_HOME_DIR宣言。:)

于 2017-04-03T21:03:17.983 に答える
0

インクルードがPHPでどのように機能するかの2つのデモ

2010年のImで、著者は彼の質問に次のように書いています。

だから、ここに私のテストがあるので、誰が正しいのかわかりません...

そしてコメントでも:

まだ私の更新への答えはありません...

したがって、PHPにどのように機能するかを理解するためのテストをお勧めします。結果はバージョン5と7で同じでした。

テスト1

ファイルとディレクトリ:

  1. /index.php
    <?php
    include 'subdirectory/index.php';
  1. /subdirectory/index.php
    <?php
    include 'test.php';
  1. /subdirectory/test.php
    <?php
    echo __FILE__;

出力:

/subdirectory/test.php

インクルードごとに候補が1つしかないため、このテストはうまく機能します。

この要件は、更新された質問からのテストでも満たされます。これが、それもうまく機能する理由です。

テスト2

test.phpメインルートにコピーしましょう。したがって、新しいプロジェクト構造は次のとおりです。

/index.php
/test.php
/subdirectory/index.php
/subdirectory/test.php

これで出力が異なります::

/test.php

2番目のテストには別の結果があります。これは、命令の候補が2つありinclude 'test.php';PHPが含めるファイルを単独で選択したためです。

これが、受け入れられた回答の作成者によって提案された実践がプロジェクトを驚きから救う理由です。

于 2021-08-31T12:05:15.440 に答える