2011-08-16 15 views
1

を含ん私previous questionは、私は問題はパス

require_once($_SERVER['DOCUMENT_ROOT'] . '/proj/database/database-common.php'); 

の同類を使用して間違っていると、代わりに

require_once(dirname(__FILE__) . '/database/database-common.php'); 

を使用する必要がありますが、私はマルチを持っていることが示唆されたいくつかの議論をアップbroghtどのレベルからでも呼び出すことができるいくつかの一般的な機能(データセット、エラー処理など) - どのようにすればよいのでしょうか?たとえば、エラー処理に$ _SERVER ['DOCUMENT_ROOT'] \ css \ my.cssのCSSファイルが必要です

アンカーポイントとして$_SERVER['DOCUMENT_ROOT']がない場合は、何か別のものを使用できますか?そうでない場合は、共通のファイルに別のファイルを含めることはできますが、それ自体がどのレベルに含まれているかはわかりません。

例:

root 
    `- databse 
     `- validation 

検証/ common.phpのは、データベース/ database_common.php thhenを含めることを希望する場合は、アンカーなしで、検証/ common.phpのは、それをdatabase_common.phpへのパスを知ることができないがではありません..\database/database_common.phpルートディレクトリのファイルから検証/ common.phpが含まれている場合(これは単純化された例です)

私の理念は、ファイルを使用するファイルに常に必要とすることですルートディレクトリファイルにすべてを含めます....

私はこれについてベストプラクティスを明確にすることはできますか?ありがとう

答えて

2

は、あなたが使用されているブートストラップファイルを使用することができますあなたの次のことが必要となりますので、他のすべての間で、ファイルとそこにすべてのグローバルパラメータを定義し、何かを

# bootstrap.php 
// Define path to application directory 
defined('APPLICATION_PATH') 
    || define('APPLICATION_PATH', realpath(dirname(__FILE__))); 

のようにして他のファイルをインクルードする必要があるすべてのファイルで、このマスターファイルを必要と

require 'path/to/bootstrap.php'; 
require APPLICATION_PATH . '/database/common.php'; 

これは部分的にあなたの問題を解決しますが、物事は一貫しています。変更する部分は最初のものですが、相対パスを使用してコードを移植可能にすることができます。

phpがインクルードパスのすべてのディレクトリを検索し、statが最も高価なシステムコールの1つなので、パスの解像度が遅くなるため、私はinclude_pathの変更を使用しません。例:あなたは、あなたがこのパス .:/dir1:/dir2:/dir3が含まれていて、あなたはdir3 PHPであるfoo.phpという名前のファイルには、次の4つのstatの呼び出しになります必要な場合:ファイルを必要とするときは、必ず、絶対パスを使用する必要があります。このような理由から

./foo.php 
/dir1/foo.php 
/dir2/foo.php 
/dir3/foo.php 

をインクルードパスを1つまたは2つのパスに制限しておく必要があります。

また、OOPを使用している場合は、いつでもファイルを要求する必要性を排除し、かなりうまく動作するautoloading for your classesを使用できます。このテクニックの良い例は、Zend Framework autoloader

+0

+1私はこの考えが好きです。これは本当にeveryneがそれをする方法ですか? – Mawg

+1

@Mawg誰もがこのアプローチを使用しているかどうかわかりません。私は3年前に自作のコード(スパゲッティコードにつながることが多い)を残し、コードの再利用と大部分はコンベンション上の慣例のためにフレームワークとRoRをzendに移しました。私の主な目標の1つは、この種の問題を避けることです。私は多くの良い習慣を学びました。これは、異なるプロジェクト間で再利用され、共通言語を話すことによって他の同僚と共有できるかなり標準的なものです。 – Fabio

0

あなたのinclude_pathをphp.iniに設定してください。これはインクルードが検索されます。インクルードされたファイルが上書きされるように、ディレクトリ構造を適切に定義します。あなたのphp.iniで

は、次のように設定します。

include_path=".:/dir/first:/dir/second" 

含まれてファイルがで検索されている必要がこの手段を。 (カレントディレクトリは、/ DIR /最初と最後に/ DIR /秒

そうするrequire_once「データベース/ common.phpのは、」で見つけることができます。

/dir/first/database/common.php 
/dir/second/database/common.php 
+0

で与えられていますが、私は別のディレクトリを追加するまで恥知らずにリストすると動作するかもしれませんが、PHPのインクルードファイルはどこからわからないのでしょうか?が含まれていたので、サイトのいくつかの異なるレベルから含めると、どのように有効な相対パスを作ることができますか? – Mawg