PHP自动加载器功能 - 仍然需要require_once?

时间:2013-01-27 02:40:52

标签: php class autoloader

我正在围绕PHP自动加载器。如果我有以下代码:

  function __autoload($class) {require_once('scripts/classes/' . $class . '.class.php');}

只要我的类被命名为适合上面的路径,我仍然需要使用require_once

  require_once('scripts/classes/session.class.php');

注意:我在网站的header()中加入了__autoloading(第一页加载。我是否需要将它包含在每个加载的页面上以使其功能正常工作?我会假设是的但是我不确定......

谢谢

3 个答案:

答案 0 :(得分:2)

您需要在浏览器中加载的每个页面上定义__autoload或调用spl_autoload_register。因此,如果您的所有网页都使用相同的"标题",那么将它放在那里就足够了。

完成上述操作后,您无需在其他地方使用includerequire:只需提及课程Session,PHP就会使用自动加载功能查找它的定义是否还不知道。

答案 1 :(得分:1)

不,你应该使用include()。如果该类尚未加载,则该类将仅包含

从PHP手册:

  

您可以定义一个自动调用的__autoload()函数   如果您正在尝试使用尚未使用的类/接口   已定义。

不,您可以在整个应用程序中只包含一次自动加载器功能。

最好使用spl_autoload_register()代替__autoload()

答案 2 :(得分:0)

您可以将此文件包含在脚本的开头,然后只需设置目录级别 而不是此常量:WP_CONTENT_DIR 这将自动包括所需的任何文件

<?php

class autoload
{

    private static function updatePhpFiles($dir_level, $php_files_json_name)
    {
        /**Get all files and directory using iterator.*/
        $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir_level));
        $filePaths = array();

        /**Get all php files in this directory level.*/
        foreach ($iterator as $path) {
            if (is_string(strval($path)) and pathinfo($path, PATHINFO_EXTENSION) == 'php') {
                $filePaths[] = strval($path);
            }
        }

        /**Encode and save php files dir in a local json file */
        $fileOpen = fopen($dir_level . DIRECTORY_SEPARATOR . $php_files_json_name, 'w');
        fwrite($fileOpen, json_encode($filePaths));
        fclose($fileOpen);
    }

    private static function includeMatchingFiles($dir_level, $php_files_json_name, $class_file_name)
    {
        $files = json_decode(file_get_contents($dir_level . DIRECTORY_SEPARATOR . $php_files_json_name), true);
        $inc_is_done = false;

        /**Include matching files here.*/
        foreach ($files as $path) {
            if (stripos($path, $class_file_name)) {
                require_once $path;
                $inc_is_done = true;
            }
        }
        return $inc_is_done;
    }

    public static function include_system_files($dir_level, $class_name)
    {
        $php_files_json = 'phpfiles.json';
        $class_file_name = $class_name . '.php';

        /**Include required php files.*/
        if (is_file($dir_level . DIRECTORY_SEPARATOR . $php_files_json)) {

            if (self::includeMatchingFiles($dir_level,$php_files_json, $class_file_name)) {
                return true;
            } else {
                self::updatePhpFiles($dir_level, $php_files_json);
                return self::includeMatchingFiles($dir_level, $php_files_json, $class_file_name);
            }

        } else {

            self::updatePhpFiles($dir_level, $php_files_json);
            return self::includeMatchingFiles($dir_level, $php_files_json, $class_file_name);

        }

    }

}

/**
 * Register autoloader.
 */
spl_autoload_register(function ($className) {
    autoload::include_system_files(WP_CONTENT_DIR, $className);
});