1

我使用 spl_autoloader_register 函数制作了一个简单的自动加载器,它在我的虚拟服务器上运行良好,但在服务器中我只得到“致命错误:找不到类'X'”。我在带有 PHP 5.4 的 mac 上运行它,但它也可以在带有 5.3 版本的 windows/ubuntu 中运行,这与我的物理服务器相同。我没有 SSH 访问权限。这是我的自动加载代码:

class Load
{   
    public static function autoload($class)
    {    
        $class = strtolower($class);        
        $lib =  $_SERVER['DOCUMENT_ROOT'] . BASENAME . "/libs/{$class}.php";        
        $model =  $_SERVER['DOCUMENT_ROOT'] . BASENAME . "/models/{$class}.class.php";  
        $controller =  $_SERVER['DOCUMENT_ROOT'] . BASENAME . "/controllers/{$class}.php";  

        if(is_readable($lib)){
            require_once $lib;  
        }elseif (is_readable($model)) {
            require_once $model;        
        }elseif (is_readable($controller)){
            require_once $controller;
        }
    }

}
spl_autoload_register("Load::autoload");

我总是将 spl 用于本地应用程序,但这是我第一次在服务器上尝试它。任何有关更好做法的建议都会有所帮助。谢谢

4

1 回答 1

4

一个好的做法是添加您自己的包含路径。然后你可以放弃 $_SERVER['DOCUMENT_ROOT']。例如..

// Define path to library
define('MY_LIBRARY_PATH', realpath(dirname(__FILE__) . '/../insert_path_here_relativly'));

// Ensure library is on include_path
set_include_path(
    get_include_path() . PATH_SEPARATOR . MY_LIBRARY_PATH
);

然后你的自动加载器..

class Load
{   
    public static function autoload($class)
    {    
        $class = strtolower($class);        
        $lib =  MY_LIBRARY_PATH . "/libs/{$class}.php";        
        $model = MY_LIBRARY_PATH . "/models/{$class}.class.php";  
        $controller = MY_LIBRARY_PATH . "/controllers/{$class}.php";  

        if(is_readable($lib)){
            require_once $lib;  
        }elseif (is_readable($model)) {
            require_once $model;        
        }elseif (is_readable($controller)){
            require_once $controller;
        }
    }

}
spl_autoload_register("Load::autoload");
于 2013-09-17T21:14:49.330 回答