絶対パスを必要とする PHP ファイルをインクルードするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/4369

  •  08-06-2019
  •  | 
  •  

質問

次のようなディレクトリ構造があります。

スクリプト.php

inc/include1.php
inc/include2.php

オブジェクト/object1.php
オブジェクト/object2.php

石鹸/石鹸.php

現在、これらのオブジェクトを両方で使用しています script.php そして /soap/soap.php, 、移動することもできますが、特別な理由からそのようなディレクトリ構造が必要です。実行時 script.php インクルードパスは inc/include.php そして実行するとき /soap/soap.php その ../inc, 、絶対パスは機能します、 /mnt/webdev/[project name]/inc/include1.php... しかし、ディレクトリを別の場所に移動したい場合、これは醜い解決策です。

それで、相対パスを使用する方法、またはプログラムで "/mnt/webdev/[project name]/"?

役に立ちましたか?

解決

これは機能するはずです

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

編集: 追加の改善 オージーバイキング

他のヒント

相対パスを使用できます。試す __FILE__. 。これは、常にそれが含まれるスクリプトのパス/ファイル名を返す PHP 定数です。それで、 soap.php, 、次のようにすることができます:

include dirname(__FILE__).'/../inc/include.php';

ファイルのフルパスとファイル名。includeに含まれる場合、付属のファイルの名前が返されます。PHP4.0.2以降、 __FILE__ 古いバージョンでは、状況によっては相対パスが含まれていたのに対し、常にシンリンクが解決された絶対パスが含まれています。 (ソース)

別の解決策は、 パスを含める httpd.conf または .htaccess ファイル内。

見て http://au.php.net/reserved.variables

あなたが探している変数は次のとおりだと思います: $_SERVER["DOCUMENT_ROOT"]

プロジェクトのルート ディレクトリへのパスを含む定数を定義し、それをパスの先頭に置くことができます。

これを処理するもう 1 つの方法は、インクルードの必要性をまったく排除することです。 オートロード 特徴。「念のため」スクリプトに必要なものをすべて含めると、パフォーマンスが低下する可能性があります。インクルードがすべてクラス定義またはインターフェイス定義であり、必要な場合にのみそれらをロードしたい場合は、 __autoload() 関数を独自のコードで使用して、適切なクラス ファイルを見つけ、呼び出されたときにのみそれをロードします。マニュアルの例は次のとおりです。

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

include_path 変数を適切に設定している限り、クラス ファイルを再度インクルードする必要はありません。

Kevin に関連するもう 1 つのオプションは、 __FILE__, ですが、代わりにその中の php ファイル名を置き換えます。

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

しばらくこれを使っています。唯一の問題は、時々あなたが持っていないことです $_SERVER['SCRIPT_NAME'], 、ただし、同様の別の変数が存在する場合もあります。

これは非常にうまく機能することがわかりました。

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

使用:

<?php

function findRoot() {
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');

include(findRoot() . 'includes/head.php');

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
    $posts[$i]->displayArticle();
}

include(findRoot() . 'includes/footer.php');

?>

最良の方法は、インクルードを PHP インクルード パスに入れることだと思います。これを行うには、設定に応じてさまざまな方法があります。

その後、単に参照できます

require_once 'inc1.php';

インクルード内、Web アクセス可能なファイル内、またはネストされたサブディレクトリの任意のレベルのどこにあるかに関係なく、任意のファイル内から。

これにより、インクルード ファイルを Web サーバーのルートの外部に置くことができます。これがベスト プラクティスです。

例えば

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

また、クラスファイルの遅延ロードについては __autoload をチェックしてください。

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__autoload

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");

このコード行を使用します。サイト ツリーの「先頭」に戻り、目的のファイルに移動します。

たとえば、次のファイル ツリーがあるとします。

ドメイン.com/aaa/index.php
ドメイン.com/bbb/ccc/ddd/index.php
ドメイン.com/_resources/functions.php

どこにいても、コピーして貼り付けるだけで、functions.php ファイルをインクルードできます。

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");

このコードを何度も使用する必要がある場合は、 str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1)) 一部。次に、インクルードする最初のファイルにこの関数を挿入するだけです。各PHPページの一番上に「initialize.php」ファイルがあり、この関数が含まれています。次回ファイルをインクルードする必要があるときは、実際には関数 (名前付き) を使用するだけです。 path_back):

require(path_back()."/_resources/another_php_file.php");

@Flubba、これにより、インクルードディレクトリ内にフォルダーを含めることができますか?フラットなインクルードディレクトリは悪夢を見ます。オブジェクトディレクトリ全体が inc ディレクトリにある必要があるためです。

ああ、そうです、絶対に。したがって、たとえば、通常はサブフォルダーの単一レイヤーを使用します。

require_once('library/string.class.php')

非常にトラフィックの多いサイトでは、インクルード パスに依存しすぎないように注意する必要があります。php は、ファイルが存在するかどうかを確認するために、現在のディレクトリを検索し、次にインクルード パス上のすべてのディレクトリを検索する必要があり、これにより速度が低下する可能性があります。殴られたら大変だ。

たとえば、MVC を実行している場合は、アプリケーション ディレクトリへのパスをインクルード パスに入れて、次の形式で参照を指定します。

'model/user.class'
'controllers/front.php'

または何でも。

しかし一般的に言えば、どこからでも機能する非常に短いパスを PHP 内で操作できるだけであり、リアルパス ドキュメントのルート マラキーよりもはるかに読みやすいです。

他の人が提案したスクリプトベースの代替案の利点は、共有ボックス上であっても、どこでも機能することです。インクルード パスの設定にはもう少し考えと努力が必要ですが、前述したように、最もクールな __autoload の使用を開始できます。

アプリケーション内のほとんどのファイルに特定のパスを含める場合は、ルート フォルダーにグローバル変数を作成します。

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

さて、このグローバル変数は「アプリケーションパス" を使用すると、新しいファイルをインクルードするたびに realpath() を呼び出す代わりに、すべてのファイルをインクルードできます。

元:

include(APPLICATION_PATH ."/config/config.ini";

それが役に立てば幸い ;-)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top