97

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

script.php

inc/include1.php
inc/include2.php

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

石鹸/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]/"ますか?

4

11 に答える 11

154

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

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

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

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

于 2008-08-07T04:20:47.647 に答える
46

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

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

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

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

于 2008-08-07T05:05:34.093 に答える
6

http://au.php.net/reserved.variablesをご覧ください

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

于 2008-08-07T04:25:22.473 に答える
6

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

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

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

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

于 2008-09-18T14:28:50.463 に答える
5

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

于 2008-08-07T04:04:55.103 に答える
2

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

<?php

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

?>

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

于 2008-09-09T22:49:56.777 に答える
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

于 2008-08-07T19:20:00.933 に答える
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");
于 2015-04-13T14:33:59.720 に答える
0

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

ええ、絶対に。たとえば、サブフォルダーの単一レイヤーを使用します。一般的には次のとおりです。

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

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

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

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

または何でも。

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

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

于 2008-08-08T23:17:12.273 に答える
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";

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

于 2018-05-09T10:10:21.403 に答える