2

PHPで、次のような初期化子を使用してファイルをインクルードまたは必要とする場合。サブディレクトリまたは別の場所に同じ初期化子を含める場合に発生するファイルパスの問題をどのように克服できますか。

<?php

// settings
$settings = array('config');

foreach ($settings as $setting) {
    require_once "../system/settings/{$setting}.php";
}

// neutrals
$neutrals = array('functions');

foreach ($neutrals as $neutral) {
    require_once "../system/neutrals/{$neutral}.php";
}

// helpers
$helpers = array('database', 'file', 'logger', 'user', 'session', 'database');

foreach ($helpers as $helper) {
    require_once "../system/helpers/{$helper}.php";
}

// models
$models = array('test');

foreach ($models as $model) {
    require_once "../system/models/{$model}.php";
}

?>

上記のスクリプトは、all_initializer.phpファイルにあります。ここでのハードルは、パブリックサブディレクトリまたは他の場所で同じ初期化子を使用できないことです。ファイルが見つからないという致命的なエラー(必要なファイルの場合)が発生するためです。

編集

たとえば、index.phpファイルのパブリックフォルダでこのイニシャライザを使用している場合、パブリックフォルダpublic/subにサブディレクトリがあります。public / sub /index.phpで使用したのと同じ初期化子をpublic/sub / index.php使用するにはどうすればよいですか?

4

4 に答える 4

0

ほとんどのphpフレームワークの動作は次のようになり、zendフレームワークは次のように動作します。

定数APPLICATION_PATHを宣言してから、このパスに関連するすべてのパスを作成します。

define("APPLICATION_PATH", "/var/www/mysite");

そして、必要なものはすべてAPPLICATION_PATHに関連します。

require_once APPLICATION_PATH ."/system/helpers/{$helper}.php";

*このアプローチでは、どのスクリプトのファイルでも問題なく含めることができます。すべてのパスがAPPLICATION_PATHに相対的であるためです。

于 2012-10-29T12:52:17.600 に答える
0

単純です..相対パスを使用しないでください...foreachループでは、次のことができます。

require($_SERVER['DOCUMENT_ROOT'].'/system/thing.php');
于 2012-10-29T12:49:23.563 に答える
0

file_exists致命的なエラーを回避するためにを使用できます

// neutrals
$neutrals = array('functions');

foreach ($neutrals as $neutral) {
    if (file_exists("../system/neutrals/{$neutral}.php") 
    {
        require_once "../system/neutrals/{$neutral}.php";
    }
    else
    {
        // Do some logging here so as to know that something went wrong
    }
}

参照しているパスの問題については、操作に適切なベースパスを指定する限り、どこからでもこのファイルを含めることができます。ファイルにを定義するROOT_PATHindex.php、スクリプトがどこにあり、何をロードする必要があるかを検出するのに役立ちます。

したがって、たとえば、この構造がある場合:

/system
/system/neutrals
/system/models
/public
/public/index.php

で、アプリケーション全体で使用され、参照ポイントとして機能する定数をindex.php定義できます。ROOT_PATH

// this points to the folder that has /public and /system
define('ROOT_PATH', dirname(dirname(__FILE__)))); 

システムフォルダ専用の定数を設定することもできます

define('SYSTEM_PATH', ROOT_PATH . '/system'); 

そして、すべてのrequire_once宣言は次のようになります。

require_once SYSTEM_PATH ."/neutrals/{$neutral}.php";

編集:質問の追加情報に基づく

Structure:
/all_includes.php
/system
/system/neutrals
/system/models
/public
/public/index.php
/public/sub/index_sub.php

index.phpで定義します

// this points to the folder that has /public and /system
define('ROOT_PATH', dirname(dirname(__FILE__)))); 

その後:

require_once ROOT_PATH . '/all_includes.php';

初期化を行います。同じことが。でも起こりpublic/sub/index_sub.phpます。

あなたは次のall_includes.phpようになります:

// neutrals
$neutrals = array('functions');

foreach ($neutrals as $neutral) {
    if (file_exists(ROOT_PATH . "/system/neutrals/{$neutral}.php") 
    {
        require_once ROOT_PATH . "/system/neutrals/{$neutral}.php";
    }
    else
    {
        // Do some logging here so as to know that something went wrong
    }
}
于 2012-10-29T12:58:19.610 に答える
-2

パスの問題はこの方法で解決できます。常に同じ場所にある1つのファイルがあります。たとえば、あなたは持っています(これはあなたの公開HTMLです)

.
..
folder/subfolder/filetoinclude.php
folder2/includein.php
thefilefolder/thefile.php

さて、ファイルphpに変数があります

$path=dirname(__FILE__);

これにより、常にそのファイルへの絶対パスが得られます。次に、この$ path変数を使用して、その周りにインクルードパスを作成できます。この例では、$path。'../ folder / subfolder/filetoinclude.php'を含める必要があります。パイントは常に同じ原点を使用し、相対パスを使用しないことです。次に、thefile.phpでカスタムインクルード関数を作成すると、作業が非常に簡単になります。

于 2012-10-29T12:53:00.840 に答える