0

インクルードパスに問題があります。私はcmsを構築しようとしていますが、すべてのファイルがインクルードのルートにある必要がないように構築したいと思います。

ファイル構造へのリンク

どこからでも他のファイルにインクルードしようとしています。しかし、問題は、他のファイルにファイルを含めることです。

例:T_ErrorLogにErrorHandlingを含めますが、パスが正しくないようにErrorHandlingのTextfilesでテキストファイルを使用します。

エラー:

Notice: Undefined variable: error in C:\Users\Kevin\Desktop\Dropbox\Programming\Webdesign\Workspace\KLJ Peer\GhostCMS\TestFiles\T_ErrorLog.php on line 7
Test

Warning: fopen(/GhostCMS/Textfiles/ErrorLog.txt) [function.fopen]: failed to open stream: No such file or directory in C:\Users\Kevin\Desktop\Dropbox\Programming\Webdesign\Workspace\KLJ Peer\GhostCMS\Core\ErrorHandling.php on line 15
can't open file

T_ErrorLog.php

<?php

include_once ('../Core/ErrorHandling.php');

use Core\ErrorHandling;

ErrorHandling::HandleError("Test", $error);

ErrorHandling.php

namespace Core;

class ErrorHandling {
    public static function HandleError($errorMessage, $error){
        echo $errorMessage . "<br />";
        echo "Indien dit zicht blijft voor doen.<br />";
        echo "Zal de webmaster dit ontvangen en even kijken naar het probleem!<br />";

        ErrorHandling::WriteToErrorFile($errorMessage, $error);
    }
    public static function WriteToErrorFile($errorMessage, $error){
        $myFile = "/GhostCMS/Textfiles/ErrorLog.txt";
        $fh = fopen($myFile, 'a') or die("can't open file");

        $today = date('j/n/Y - H:i:s');
        fwrite($fh, "Error: \n");
        fwrite($fh, "Date: " . $today . "\n");
        fwrite($fh, "User error message: " . $errorMessage . "\n");
        fwrite($fh, "System error message: " . $error . "\n");
        fwrite($fh, "--------------------------------------------------\n");
        fclose($fh);
    }
}

すべてのディレクトリに対して相対パスを含める方法はありますか?

4

2 に答える 2

1

あなたはあなたのファイル構造をよく知っています、そしてそれは実際には変わらないでしょう。一般的に言えば、いくつかのオプションがあります。ルートディレクトリまたは開始点を記録して、他のファイルを派生させ、DIRFILEPHP マジック定数などのオプションを含めます。

たとえば、インストール時またはブートストラップファイルにFILEを保存し、そのパスから派生するようにディレクトリを調整することもできます。

$myPreviouslySavedPath = __DIR__   // e.g. /home/user/meme/www/
fopen($myPreviouslySavedPath . '/GhostCMS/Textfiles/ErrorLog.txt') // would then be /home/user/meme/www/GhostCMS/Textfiles/ErrorLog.txt 

あるいは、phpインクルードの場合、phpにはオートローダーがあります。これは自分で提供する関数であり、その関数に特定のファイルのロード元を決定させることができます。これは、CMSのエントリポイントに設定するものであり、収集したベースディレクトリと組み合わせる可能性があります。

例えば

spl_autoload_register('myClassLoader');

function myClassLoader($class){
     // << here you'd place logic to decide the best path for your file >>
     include(__DIR__ . "/classes/$class");
}

覚えて使用する主なことは、アプリケーションのエントリポイントが固定されていて、そのファイルの場所がわかっていることです。そこから、他のすべてのファイルの論理パスを推測できます。

于 2012-05-29T11:03:37.500 に答える
0

インクルードまたはrequireが使用されないようにコードを書き直すことをお勧めします。このアプローチは、インクルードパスを正しく設定することで実現できます。http //php.net/set_include_pathおよびhttp://php.net/get_include_pathを参照してください。オートローダーのクラス/関数。

次に、名前空間ベースのクラスを「使用」する場合、オートローダーはインクルードパスを検索し、そのファイルをインクルードしようとします...

これにより、外部ライブラリ、クラスをCMSとは異なる場所に配置できますが、オートローダーと名前空間によってそれらを簡単に含めることができます...

于 2012-05-29T11:09:03.653 に答える