絶対パスを必要とするPHPファイルを含める方法は?


95

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

script.php

inc / include1.php
inc / include2.php

objects /
object1.php objects / object2.php

soap / soap.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]/"?を生成する方法はありますか?

回答:


149

これはうまくいくはずです

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

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

編集: aussievikingによる改善を追加


2
注意してください。これは、作成するWebサーバー経由でスクリプトを実行する場合にのみ機能しますDOCUMENT_ROOT
Phil

質問です。$ _ SERVER ["DOCUMENT_ROOT"]のrealpath()はなぜですか?これは常に標準的なパスを出力しないでしょうか?
ジョアン・ピメンテルフェレイラ

44

相対パスを使用できます。お試しください__FILE__。これは、常にスクリプトが含まれているパス/ファイル名を返すPHP定数です。したがって、ではsoap.php、次のようにすることができます。

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

ファイルの完全パスとファイル名。インクルード内で使用すると、インクルードされたファイルの名前が返されます。PHP 4.0.2以降__FILE__、シンボリックリンクが解決された絶対パスが常に含まれていましたが、古いバージョンでは状況によっては相対パスが含まれていました。 (ソース)

別の解決策は、httpd.confまたは.htaccessファイルにインクルードパスを設定することです。


8
/引用された式の先頭にを追加..して、をFILE名から分離する必要があると思います。
Dunaril、2011

9
PHP 5.3.0以降では、使用する__DIR__代わりにマジック定数を使用できることに注意してくださいdirname(__FILE__)(PHP docs)
アーウィンウェッセルズ2012年

3
include dirname(__FILE__).'/../inc/include.php';相対パスの前の「/」を忘れないでください。
Steven Leimberg、2014年

6

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

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

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

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




2

ケビンに関連する別のオプションはuse __FILE__ですが、代わりにphpファイル名をその中から置き換えます。

<?php

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

?>

私はこれをしばらく使用しています。唯一の問題は$_SERVER['SCRIPT_NAME']、がないこともありますが、同様の別の変数がある場合もあります。


2

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

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');

?>

1

私はあなたのインクルードをあなたの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


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

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

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

domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.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");

0

@Flubba、これにより、インクルードディレクトリ内にフォルダーを作成できますか?フラットインクルードディレクトリは私に悪夢を与えます。オブジェクトディレクトリ全体がincディレクトリにあるはずです。

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

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

phpはファイルがそこにあるかどうかを確認するために現在のディレクトリとインクルードパス上のすべてのディレクトリをハントする必要があるため、インクルードパスに過度に依存することに注意する必要があります。槌で打たれたら

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

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

または何でも。

しかし、一般的に言えば、どこからでも機能するPHPの非常に短いパスで作業できるため、実際のパスのルートマラキーよりもはるかに読みやすくなっています。

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


0

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

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

このグローバル変数 " APPLICATION_PATH」を使用して、新しいファイルを含めるたびにrealpath()を呼び出す代わりに、すべてのファイルを含めることができます。

例:

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.