2011-12-02 43 views
12

絶対パスを使用すると、ディレクトリ全体を新しい場所に移動することはできません。 相対パスを使用すると、個別のファイルを新しい場所に移動することはできません。絶対パスと絶対パスの比較

ここで解決策はありますか?あなたは、ルートパスを保持し、そこから行く設定ファイルを設定しますか?あるいは、あなたは次のようなルールを持っていますか?

私はいくつかのプロジェクトで、人々がdirname(FILE)を使用しているのを見ました。そのポイントは何ですか、私は、単にファイル名が相対的なので(ファイルがどこに置かれているかに依存して)、単にファイル名を省略しないでください。

+0

dirnameは 'の使用( __FILE __) 'または' __DIR__'は、ファイルがインクルードされていても、現在のスクリプトのディレクトリを返します。 dir/script.phpを含むファイルがある場合、script.phpのデフォルトのインクルードパスはdir /ではなくルートになります。 – Kokos

+1

@Frank Vilea:*ルートパスを保持し、そこから移動する設定ファイルを設定していますか?* **はい** –

+0

これはかなり悪いですが、これらの2つを混ぜ合わせることが考えられます。主スクリプトに絶対パスを追加し、スクリプトに含まれて使用されているファイルへの相対パスを追加します。もちろん、相対パス宣言で何かを変更することなく、相対パスを使ってファイルを移動することはできません。 – OptimusCrime

答えて

14

あなたは、たとえば、あなたのアプリがあなたのルートディレクトリ内

このようなルート/アプリケーション/プラグインに

を見て、各ファイルの最初の行に含まれる設定ファイルを使用する必要があります:app-config.php

if (!defined('ABSPATH')) 
    define('ABSPATH', dirname(__FILE__) . '/'); 

、あなたのプラグインディレクトリ内ので

、あなたはプラグインファイルを含めるためにあるとしますmy-plugin.php

require_once '../../app-config.php'; 

今、この線より下のすべては、あなたが今、画像

<img src='".ABSPATH."Public/images/demo.png' alt=''/> 

をロードしたいですが、事はアプリが自動的に一部をロードするように設計されている場合、よりシンプルである ABSPATH

例を使用することができます

plugin-widget-1.php 

のように、このファイル内のすべてまたは他のファイルmy-plugin.phpファイルで読み込まれたファイルは、app-config.phpファイルを毎回インクルードせずにABSPATHを使用できます。これで

心の中で、あなたがファイルを移動する必要がある場合、今あなたがすべて定義されていること、の1つのフォルダを言わせて、そのapp-config.php例に

define('UPLOAD_PATH', ABSPATH. 'Public/uploads/'); 
define('IMAGES_PATH', ABSPATH. 'Public/images/'); 
define('HELPERS_PATH', ABSPATH. 'App/helpers/'); 
... 

をしたいすべての短手を持つことができます前方例:

ルート/アプリケーション/プラグイン/ Utilsの

だけrequire_once '../../../app-config.php';

inlucde明らかに私は股関節を想定あなたは毎回パスを変更していません)もしそうする必要があれば、何百ものではなく一つのファイルインクルージョンを変更する方がずっと簡単です。

希望あなたにこのメイク感覚=)

+0

私は今このソリューションを実装しています。ありがとう。 –

1

は、アプリケーションのパスを保持するための定数を定義し、使用状況により異なり、それはどこかのアプリケーションで上書きしてしまうかもしれませんし、アプリケーション

を破ることができるよう変数を使用しないでください一般的な慣行

の一つであります> /ホーム/ 20111202000000が安定版を維持しながら -

application dirs 
=============================== 
/home/latest   -> symlink 
/home/testing  -> symlink 
/home/20111202000000 -> latest development version 
/home/20111201000000 -> yesterday stable release 

だから、あなたはシンボリックリンク
/ホーム/テストすることができます(シンボリックブランチを作成する)シンボリックリンクと結合するより良いですシオン、
/ホーム/最新 - > /ホーム/これにより20111201000000

、あなたはいくつかのテスト/開発をしている間、あなたの生産現場を破るために危険にさらす必要はありません、そして、あなたは簡単に自分の開発ディレクトリ

をシフトすることができます
+0

私はこのソリューションが本当に好きです。シンボリックリンクの使用については決して考えなかった。 –

2

私はいくつかのプロジェクトで、人々がdirname(FILE)を使用するのを見ました。そのポイントは何ですか、私は、単にファイル名が相対的なので(ファイルがどこに置かれているかに依存して)、単にファイル名を省略しないでください。

これは、とにかくインクルードパスに関連しています。 dirname(__FILE__)(または、PHP> = 5.3の場合は__DIR__)がありますので、すべての場所からファイルを実行できます。相対パスを使用している場合、値 "。"変更することがあります。参照:

ベリー@ベリー-PC:〜%猫so.php

<?php 
var_dump(realpath('.')); 
var_dump(realpath(__DIR__)); 

ベリー@ベリー-PC:〜%PHP

string(11) "/home/berry" 
string(11) "/home/berry" 

so.phpベリー@ベリーPC:〜%cd foo

ベリー@ベリーPC:〜/ foo%php .. /so.php

string(15) "/home/berry/foo" 
string(11) "/home/berry" 

だから、それは相対的であるが、それは、ファイルが置かれていないディレクトリに、現在の作業ディレクトリからの相対です。あなたは、このために__DIR__を使用したいと思う理由です。ところで;はい、私はひどくたくさんの周りのファイルを移動しません。私がしている場合、私はAutoloaderを使用しているので、私はそれ以上のものを必要としません。

私が参照しているその他のファイル(テンプレートファイルなど)については、手動でパスを設定しますが、は一度です。私は$path . '/filename.php';を参照するので、後で変更する方が簡単です。

+2

この非常に詳細なポストをありがとう。今それは理にかなっています。また、オートロード機能も非常にきれいです。 –

+0

@FrankVilea大歓迎です。 –

0

オペコードキャッシュやたくさんのrequire/includeステートメントを使用すると、絶対パスはパフォーマンスの点で優れています(ただし、数百ものファイルをインクルードするときに目立ちますが、Zend/Symfony/etcなど)。

相対パスを使用すると、opcodeキャッシュとphpは、ファイルについて既に知っている場合、またファイルを再度ロードする必要がある場合に、動作する前にファイルのrealpathを処理する必要があります。 PHPは内部的にファイルのハッシュマップをファイル位置に保持していますが、これは毎回上記の計算を行う必要がない限り非常に高速です。

0

私は常に絶対パスを使用しますが、私もから抽出された値に基づいて、私は定数として最も一般的に使用されるパスを定義ブートストラップファイルを任意のカスタムPHPプロジェクトを開始$_SERVER

これは私が私のルートパスを定義する方法である:

define("LOCAL_PATH_ROOT", $_SERVER["DOCUMENT_ROOT"]); 
define("HTTP_PATH_ROOT", isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : (isset($_SERVER["SERVER_NAME"]) ? $_SERVER["SERVER_NAME"] : '_UNKNOWN_')); 

パスLOCAL_PATH_ROOTは、ドキュメントルートです。 HTTP_PATH_ROOTのパスは、HTTP経由で同じパスにアクセスする場合と同等です。その時点で

、HTTPパスに任意のローカルパスを変換することは、次のコードで行うことができます。

str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, $my_path) 

は、Windowsベースのサーバーとの互換性を確保したい場合は、ディレクトリを交換する必要がありますが同様URLの区切り文字と区切り文字:

str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, str_replace(DIRECTORY_SEPARATOR, '/', $my_path)) 

は、ここで私はPHP PowerTools boilerplateのために使っている完全なブートストラップコードです:

defined('LOCAL_PATH_BOOTSTRAP') || define("LOCAL_PATH_BOOTSTRAP", __DIR__); 

// ----------------------------------------------------------------------- 
// DEFINE SEPERATOR ALIASES 
// ----------------------------------------------------------------------- 
define("URL_SEPARATOR", '/'); 
define("DS", DIRECTORY_SEPARATOR); 
define("PS", PATH_SEPARATOR); 
define("US", URL_SEPARATOR); 

// ----------------------------------------------------------------------- 
// DEFINE ROOT PATHS 
// ----------------------------------------------------------------------- 
define("RELATIVE_PATH_ROOT", ''); 
define("LOCAL_PATH_ROOT", $_SERVER["DOCUMENT_ROOT"]); 
define("HTTP_PATH_ROOT", 
     isset($_SERVER["HTTP_HOST"]) ? 
     $_SERVER["HTTP_HOST"] : (
     isset($_SERVER["SERVER_NAME"]) ? 
     $_SERVER["SERVER_NAME"] : '_UNKNOWN_')); 

// ----------------------------------------------------------------------- 
// DEFINE RELATIVE PATHS 
// ----------------------------------------------------------------------- 
define("RELATIVE_PATH_BASE", 
     str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, getcwd())); 
define("RELATIVE_PATH_APP", dirname(RELATIVE_PATH_BASE)); 
define("RELATIVE_PATH_LIBRARY", RELATIVE_PATH_APP . DS . 'vendor'); 
define("RELATIVE_PATH_HELPERS", RELATIVE_PATH_BASE); 
define("RELATIVE_PATH_TEMPLATE", RELATIVE_PATH_BASE . DS . 'templates'); 
define("RELATIVE_PATH_CONFIG", RELATIVE_PATH_BASE . DS . 'config'); 
define("RELATIVE_PATH_PAGES", RELATIVE_PATH_BASE . DS . 'pages'); 
define("RELATIVE_PATH_ASSET", RELATIVE_PATH_BASE . DS . 'assets'); 
define("RELATIVE_PATH_ASSET_IMG", RELATIVE_PATH_ASSET . DS . 'img'); 
define("RELATIVE_PATH_ASSET_CSS", RELATIVE_PATH_ASSET . DS . 'css'); 
define("RELATIVE_PATH_ASSET_JS", RELATIVE_PATH_ASSET . DS . 'js'); 

// ----------------------------------------------------------------------- 
// DEFINE LOCAL PATHS 
// ----------------------------------------------------------------------- 
define("LOCAL_PATH_BASE", LOCAL_PATH_ROOT . RELATIVE_PATH_BASE); 
define("LOCAL_PATH_APP", LOCAL_PATH_ROOT . RELATIVE_PATH_APP); 
define("LOCAL_PATH_LIBRARY", LOCAL_PATH_ROOT . RELATIVE_PATH_LIBRARY); 
define("LOCAL_PATH_HELPERS", LOCAL_PATH_ROOT . RELATIVE_PATH_HELPERS); 
define("LOCAL_PATH_TEMPLATE", LOCAL_PATH_ROOT . RELATIVE_PATH_TEMPLATE); 
define("LOCAL_PATH_CONFIG", LOCAL_PATH_ROOT . RELATIVE_PATH_CONFIG); 
define("LOCAL_PATH_PAGES", LOCAL_PATH_ROOT . RELATIVE_PATH_PAGES); 
define("LOCAL_PATH_ASSET", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET); 
define("LOCAL_PATH_ASSET_IMG", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_IMG); 
define("LOCAL_PATH_ASSET_CSS", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_CSS); 
define("LOCAL_PATH_ASSET_JS", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_JS); 

// ----------------------------------------------------------------------- 
// DEFINE URL PATHS 
// ----------------------------------------------------------------------- 
if (US === DS) { // needed for compatibility with windows 
    define("HTTP_PATH_BASE", HTTP_PATH_ROOT . RELATIVE_PATH_BASE); 
    define("HTTP_PATH_APP", HTTP_PATH_ROOT . RELATIVE_PATH_APP); 
    define("HTTP_PATH_LIBRARY", false); 
    define("HTTP_PATH_HELPERS", false); 
    define("HTTP_PATH_TEMPLATE", false); 
    define("HTTP_PATH_CONFIG", false); 
    define("HTTP_PATH_PAGES", false); 
    define("HTTP_PATH_ASSET", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET); 
    define("HTTP_PATH_ASSET_IMG", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_IMG); 
    define("HTTP_PATH_ASSET_CSS", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_CSS); 
    define("HTTP_PATH_ASSET_JS", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_JS); 
} else { 
    define("HTTP_PATH_BASE", HTTP_PATH_ROOT . 
      str_replace(DS, US, RELATIVE_PATH_BASE)); 
    define("HTTP_PATH_APP", HTTP_PATH_ROOT . 
      str_replace(DS, US, RELATIVE_PATH_APP)); 
    define("HTTP_PATH_LIBRARY", false); 
    define("HTTP_PATH_HELPERS", false); 
    define("HTTP_PATH_TEMPLATE", false); 
    define("HTTP_PATH_CONFIG", false); 
    define("HTTP_PATH_PAGES", false); 
    define("HTTP_PATH_ASSET", HTTP_PATH_ROOT . 
      str_replace(DS, US, RELATIVE_PATH_ASSET)); 
    define("HTTP_PATH_ASSET_IMG", HTTP_PATH_ROOT . 
      str_replace(DS, US, RELATIVE_PATH_ASSET_IMG)); 
    define("HTTP_PATH_ASSET_CSS", HTTP_PATH_ROOT . 
      str_replace(DS, US, RELATIVE_PATH_ASSET_CSS)); 
    define("HTTP_PATH_ASSET_JS", HTTP_PATH_ROOT . 
      str_replace(DS, US, RELATIVE_PATH_ASSET_JS)); 
} 

// ----------------------------------------------------------------------- 
// DEFINE REQUEST PARAMETERS 
// ----------------------------------------------------------------------- 
define("REQUEST_QUERY", 
     isset($_SERVER["QUERY_STRING"]) && $_SERVER["QUERY_STRING"] != '' ? 
     $_SERVER["QUERY_STRING"] : false); 
define("REQUEST_METHOD", 
     isset($_SERVER["REQUEST_METHOD"]) ? 
     strtoupper($_SERVER["REQUEST_METHOD"]) : false); 
define("REQUEST_STATUS", 
     isset($_SERVER["REDIRECT_STATUS"]) ? 
     $_SERVER["REDIRECT_STATUS"] : false); 
define("REQUEST_PROTOCOL", 
     isset($_SERVER["HTTP_ORIGIN"]) ? 
     substr($_SERVER["HTTP_ORIGIN"], 0, 
     strpos($_SERVER["HTTP_ORIGIN"], '://') + 3) : 'http://'); 
define("REQUEST_PATH", 
     isset($_SERVER["REQUEST_URI"]) ? 
     str_replace(RELATIVE_PATH_BASE, '', 
     $_SERVER["REQUEST_URI"]) : '_UNKNOWN_'); 
define("REQUEST_PATH_STRIP_QUERY", 
     REQUEST_QUERY ? 
     str_replace('?' . REQUEST_QUERY, '', REQUEST_PATH) : REQUEST_PATH); 

// ----------------------------------------------------------------------- 
// DEFINE SITE PARAMETERS 
// ----------------------------------------------------------------------- 
define("PRODUCTION", false); 
define("PAGE_PATH_DEFAULT", US . 'index'); 
define("PAGE_PATH", 
     (REQUEST_PATH_STRIP_QUERY === US) ? 
     PAGE_PATH_DEFAULT : REQUEST_PATH_STRIP_QUERY); 

あなたはこのようにやや見える結果を与える必要がありますget_defined_constants(true)で行うことができ、この時点(ですべてのユーザー定数を出力し、あなた自身のプロジェクトに上記のコードを追加した場合:

array (
    'LOCAL_PATH_BOOTSTRAP' => '/var/www/libraries/backend/Data/examples', 
    'URL_SEPARATOR' => '/', 
    'DS' => '/', 
    'PS' => ':', 
    'US' => '/', 
    'RELATIVE_PATH_ROOT' => '', 
    'LOCAL_PATH_ROOT' => '/var/www', 
    'HTTP_PATH_ROOT' => 'localhost:8888', 
    'RELATIVE_PATH_BASE' => '/libraries/backend/Data/examples', 
    'RELATIVE_PATH_APP' => '/libraries/backend/Data', 
    'RELATIVE_PATH_LIBRARY' => '/libraries/backend/Data/vendor', 
    'RELATIVE_PATH_HELPERS' => '/libraries/backend/Data/examples', 
    'RELATIVE_PATH_TEMPLATE' => '/libraries/backend/Data/examples/templates', 
    'RELATIVE_PATH_CONFIG' => '/libraries/backend/Data/examples/config', 
    'RELATIVE_PATH_PAGES' => '/libraries/backend/Data/examples/pages', 
    'RELATIVE_PATH_ASSET' => '/libraries/backend/Data/examples/assets', 
    'RELATIVE_PATH_ASSET_IMG' => '/libraries/backend/Data/examples/assets/img', 
    'RELATIVE_PATH_ASSET_CSS' => '/libraries/backend/Data/examples/assets/css', 
    'RELATIVE_PATH_ASSET_JS' => '/libraries/backend/Data/examples/assets/js', 
    'LOCAL_PATH_BASE' => '/var/www/libraries/backend/Data/examples', 
    'LOCAL_PATH_APP' => '/var/www/libraries/backend/Data', 
    'LOCAL_PATH_LIBRARY' => '/var/www/libraries/backend/Data/vendor', 
    'LOCAL_PATH_HELPERS' => '/var/www/libraries/backend/Data/examples', 
    'LOCAL_PATH_TEMPLATE' => '/var/www/libraries/backend/Data/examples/templates', 
    'LOCAL_PATH_CONFIG' => '/var/www/libraries/backend/Data/examples/config', 
    'LOCAL_PATH_PAGES' => '/var/www/libraries/backend/Data/examples/pages', 
    'LOCAL_PATH_ASSET' => '/var/www/libraries/backend/Data/examples/assets', 
    'LOCAL_PATH_ASSET_IMG' => '/var/www/libraries/backend/Data/examples/assets/img', 
    'LOCAL_PATH_ASSET_CSS' => '/var/www/libraries/backend/Data/examples/assets/css', 
    'LOCAL_PATH_ASSET_JS' => '/var/www/libraries/backend/Data/examples/assets/js', 
    'HTTP_PATH_BASE' => 'localhost:8888/libraries/backend/Data/examples', 
    'HTTP_PATH_APP' => 'localhost:8888/libraries/backend/Data', 
    'HTTP_PATH_LIBRARY' => false, 
    'HTTP_PATH_HELPERS' => false, 
    'HTTP_PATH_TEMPLATE' => false, 
    'HTTP_PATH_CONFIG' => false, 
    'HTTP_PATH_PAGES' => false, 
    'HTTP_PATH_ASSET' => 'localhost:8888/libraries/backend/Data/examples/assets', 
    'HTTP_PATH_ASSET_IMG' => 'localhost:8888/libraries/backend/Data/examples/assets/img', 
    'HTTP_PATH_ASSET_CSS' => 'localhost:8888/libraries/backend/Data/examples/assets/css', 
    'HTTP_PATH_ASSET_JS' => 'localhost:8888/libraries/backend/Data/examples/assets/js', 
    'REQUEST_QUERY' => false, 
    'REQUEST_METHOD' => 'GET', 
    'REQUEST_STATUS' => false, 
    'REQUEST_PROTOCOL' => 'http://', 
    'REQUEST_PATH' => '/', 
    'REQUEST_PATH_STRIP_QUERY' => '/', 
    'PRODUCTION' => false, 
    'PAGE_PATH_DEFAULT' => '/index', 
    'PAGE_PATH' => '/index', 
)