PHP文件包含不完全在LINUX机器上运行的脚本

mat*_*thy 4 php linux windows automation file

我有很多功能和课程,我已经包含在我的网站上.在stackoverflow的帮助下,我收到了一个自动包含文件夹及其子文件夹中所有文件的脚本:PHP:Automatic Include

在测试脚本时,它始终有效,我从来没有遇到任何问题.但是最近从Windows服务器切换到Linux服务器时,它会产生类扩展的问题.

PHP致命错误:在第3行的路径/函数/类/ Acumulus/AcumulusExportWorkshop.php中找不到类'AcumulusExportBase',引用:pagesite /?page_id = 346

AcumulusExportWorkshop从AcumulusExportBase扩展而来.这一切都完全适用于Windows,但拒绝在Linux上工作.

我可以解决这个问题,创建一个include_once'AcumulusExportBase.php'; 但如果有一个更好的解决方案,那么这一切似乎都是不必要的,并且正在努力.

我使用的代码如下:

load_folder(dirname(__FILE__));

function load_folder($dir, $ext = '.php') {
    if (substr($dir, -1) != '/') { $dir = "$dir/"; }
    if($dh = opendir($dir)) {
        $files = array();
        $inner_files = array();
        while($file = readdir($dh)) {
            if($file != "." and $file != ".." and $file[0] != '.') {
                if(is_dir($dir . $file)) {
                    $inner_files = load_folder($dir . $file);
                    if(is_array($inner_files)) $files = array_merge($files, $inner_files); 
                } else {
                    array_push($files, $dir . $file);
                }
            }
        }
        closedir($dh);
        foreach ($files as $file) {
            if (is_file($file) and file_exists($file)) {
                $lenght = strlen($ext);
                if (substr($file, -$lenght) == $ext && $file != 'loader.php') { require_once($file); }
            }
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我,如何扩展类和Linux没有问题吗?还有一个问题的解决方案,而不必手动包括基类?

Mar*_*her 6

你有没有证实AcumulusExportBase之前包括AcumulusExportWorkshop Linux下?PHP对导入顺序很敏感.


Rob*_*bie 5

其他两个答案都是正确的(我已经对它们进行了投票).您的问题将是文件加载的顺序(请参阅Mark的响应),并且递归也是错误的(请参阅KIKO).

但是,有一种更好的方法可以做你想要的:使用自动加载器.http://php.net/manual/en/language.oop5.autoload.php

第一次令人困惑,但一旦你掌握了它,它是一种加载文件的可爱方式.

基本上你说"如果我需要X类并且它没有加载,那么加载文件Y.php".

如果你是超级懒惰并且不想指定每个类,那么你可以说"如果我需要X类并且它没有被加载,运行目录结构寻找一个被调用的文件X.php并加载它,我的类将是在那里." 你可以混合上面的内容来做到这一点.

这样,您可以先加载AcumulusExportWorkshop,然后查找AcumulusExportBase并快乐地运行.

更有益的是,您只需加载您需要的东西.如果你从不需要这个类,它永远不会被加载.