高效PHP自动加载和命名策略
-
16-09-2019 - |
题
最喜欢的Web开发人员,这些天,我彻底享受固体MVC架构的Web应用程序和网站的好处。当PHP做MVC,自动加载明显进来非常方便。
我已经成为 spl_autoload_register
风扇过简单地定义一个单一的__autoload()
功能,因为这是显然如果你正在将各自使用自己的自动加载不同的基础模块更加灵活。但是,我从来没有觉得了不起,我写的装载功能。它们涉及了很多字符串检查和目录的扫描,以寻找可能的类加载。
例如,让我们说我有一个具有定义为PATH_APP
碱路径的应用程序,和与名为models
,views
和controllers
目录的简单结构。我经常采用的命名结构,其中文件被命名为IndexView.php
和IndexController.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;
}
如果它没有后发现,我可能有另一个功能来扫描车型目录的子目录。然而,所有的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
这让我使用只需要类名和路径主要符号链接文件夹中的单一,简单的自动加载功能,并没有做任何的路径/字符串操作。
在最好的部分是我可以完全重新安排我的源代码或添加新的子系统和公正运行链接生成脚本拥有一切自动加载。
如果你想效率,那么你不应该使用自动加载功能的全部。自动加载功能是懒惰。您的包含文件,当你有他们,你应该提供一个明确的路径。如果你的自动加载功能可以找到这些文件,那么你可以编写明确地找到它们。当你的代码,并即将加载新的视图类,通过让自动加载功能,处理它的视图部分工作时,先承担你的类是模型类?这是低效的。相反,你的代码应该仅仅是:
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 ....
}
在任何情况下,在其中包括的发生点,你对你要加载的类的最大/最准确的信息。利用这些信息完全加载的类是唯一有效的类加载策略。是的,你可能有多个类变量或(但愿)一些全局变量结束。但是,这并非只是文件系统的懒惰和扫描件为您的类更好的平衡。