0

我的包含路径有问题。我正在尝试构建一个 cms,但我想构建它,以便并非所有文件都需要位于根目录中。

链接到文件结构

我试图从任何地方包含到另一个文件。但问题是我在其他文件中包含文件。

喜欢:我在 T_ErrorLog 中包含 ErrorHandling 但我在 ErrorHandling 的 Textfiles 中使用了 A 文本文件,因此路径不正确。

错误:

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);

错误处理.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

那么你知道你的文件结构,它不会真正改变。一般来说,您有几个选项:记录根目录或从中派生其他文件的起点,以包含DIRFILE PHP 魔术常量等选项

例如,您可以在安装时或在引导文件中保存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 有一个autoloader,这只是您自己提供的一个函数,您让该函数决定从哪里加载特定文件。这是您在 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

我建议重写代码,以便不使用包含或要求,并且可以通过正确设置您的包含路径来实现此方法 - 请参阅http://php.net/set_include_pathhttp://php.net/get_include_path并使用一个自动加载器类/函数。

然后,当“使用”基于命名空间的类时,您的自动加载器将搜索包含路径并尝试包含该文件...

通过这种方式,您可以在与您的 CMS 不同的地方拥有外部库、类,但仍然可以通过自动加载器和命名空间轻松地包含它们......

于 2012-05-29T11:09:03.653 回答