高效的PHP自动加载和命名策略

2020/12/31 16:21 · php ·  · 0评论

像当今大多数Web开发人员一样,我非常享受Web应用程序和网站的可靠MVC架构的好处。使用PHP进行MVC时,自动加载显然非常方便。

我非常喜欢spl_autoload_register简单地定义一个__autoload()函数,因为如果您要合并不同的基本模块(每个模块各自使用各自的自动加载功能),这显然会更加灵活。但是,我从未对编写的加载函数感到满意。它们涉及大量的字符串检查和目录扫描,以查找可能要加载的类。

例如,假设我有一个应用程序,该应用程序的基本路径定义为PATH_APP,并且结构简单,目录名为modelsviewscontrollers我经常采用一种命名结构,通过该结构命名文件IndexView.phpIndexController.php在适当的目录内,默认情况下,模型通常没有特定的方案。我可能对此结构有一个加载器功能,该结构已向以下位置注册spl_autoload_register

public function MVCLoader($class)
{
    if (file_exists(PATH_APP.'/models/'.$class.'.php')) {
        require_once(PATH_APP.'/models/'.$class.'.php');
        return true;
    }
    else if (strpos($class,'View') !== false) {
        if (file_exists(PATH_APP.'/views/'.$class.'.php')) {
            require_once(PATH_APP.'/views/'.$class.'.php');
            return true;
        }
    }
    else if (strpos($class,'Controller') !== false) {
        if (file_exists(PATH_APP.'/controllers/'.$class.'.php')) {
            require_once(PATH_APP.'/controllers/'.$class.'.php');
            return true;
        }
    }
    return false;
}

如果此后未找到,则可能还有另一个功能可以扫描models目录中的子目录。但是,所有的if / else-ing,字符串检查和目录扫描对我来说似乎效率都不高,我想对其进行改进。

我很好奇其他开发人员可能会采用哪种文件命名和自动加载策略。我正在专门寻找可用于有效自动加载的好的技术,而不是自动加载的替代方法。

这是我在所有项目中一直使用的(从上一个项目的源头直接摘录):

public static function loadClass($class)
{
    $files = array(
        $class . '.php',
        str_replace('_', '/', $class) . '.php',
    );
    foreach (explode(PATH_SEPARATOR, ini_get('include_path')) as $base_path)
    {
        foreach ($files as $file)
        {
            $path = "$base_path/$file";
            if (file_exists($path) && is_readable($path))
            {
                include_once $path;
                return;
            }
        }
    }
}

如果我寻找SomeClass_SeperatedWith_Underscores,它将寻找SomeClass_SeperatedWith_Underscores.php,然后寻找根于当前包含路径中每个目录的SomeClass / SeperatedWith / Underscores.php。

编辑:我只是想提出来,我用它来提高开发效率,而不必处理时间。如果您的路径上有PEAR,那么您可以使用这些类,而不必在需要它们时将它们包括在内。

我倾向于将我的类保留在目录的层次结构中,下划线会破坏名称空间...如果需要,此代码可以使文件结构保持整洁,或者如果需要,可以插入没有嵌套目录的快速类文件(用于将一个或两个或两个以上的类添加到要维护的库中,但不属于我当前正在研究的项目。

我找到了这个解决方案:

我创建了一个遍历类库文件夹的脚本(该脚本包含用于单独模块/系统的子文件夹),并解析文件内容以查找类定义。如果在php文件中找到类定义(非常简单的正则表达式模式),则会创建一个符号链接:

class_name.php -> actual/source/file.php

这使我可以使用一个简单的自动加载功能,该功能仅需要类名和主symlink文件夹的路径,而无需执行任何路径/字符串操作。

最好的部分是我可以完全重新排列源代码或添加新的子系统,然后运行链接生成脚本以自动加载所有内容。

如果您想提高效率,则根本不应该使用自动加载功能。自动加载功能是懒惰的。包含文件时,应提供包含文件的显式路径。如果您的自动加载功能可以找到这些文件,则可以编写代码以明确地找到它们。当您处理代码的视图部分并要加载新的视图类时,通过让autoload函数处理它,它首先假定您的类是模型类?效率低下。相反,您的代码应该只是:

include_once $this->views_path . $class . '.php';

如果您需要多个“视图”路径,请创建一个加载视图的函数:

public function load_view($class) {
    // perhaps there's a mapping here instead....
    foreach ($this->views_paths as $path) {
        $filename = $path . $class . '.php';
        if (file_exists($filename)) {
            include_once $filename;
        }
    }
    throw ....
}

无论如何,在包含发生的那一刻,您可以获得关于要加载的类的最大/最准确的信息。使用该信息完全加载类是唯一有效的类加载策略。是的,您最终可能会获得更多的类变量或(禁止使用天堂)某些全局变量。但是,这比懒惰和扫描类的文件系统的一部分要好得多。

本文地址:http://php.askforanswer.com/gaoxiaodephpzidongjiazaihemingmingcelue.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!