关于我的问题的简要背景:
我将开始一个具有各种功能的新项目。我需要组织基于模块的功能。例如,成员相关函数进入member.php
中的成员类,而库相关函数进入gallery.php
中的库类。这些文件将位于文件夹root/modules/
中。此文件夹下将有许多文件代表每个模块。
我将使用htaccess
将任何请求重定向到index.php
,此文件将执行显示页面所需的所有操作。
基于上面的内容(重定向并使用单个文件来处理所有请求)我将使用PHP include
函数来包含所有模块。
我不确定是否包含所有模块会导致任何问题。
需要建议:
答案 0 :(得分:1)
有spl_autoload_register()
个功能允许您指定自定义自动加载功能。从PHP 5.3.0开始,您甚至可以指定一个闭包。
使用自动加载器的一个很酷的事情是,它会按需加载所请求的文件,因此您不会有任何开销,包括您请求中的所有文件。
这意味着当一个类因为找不到而无法实例化而不是抛出错误时,它会激活你的自动加载函数并传递所请求的类。然后你的自动加载器当然需要加载正确的文件。
<强>示例强>
/autoloadsample.php
<?php
spl_autoload_register(function($class){
include 'classes/' . $class . '.php';
});
$user = new User();
$user->test();
/classes/User.php
<?php
class User {
public function test()
{
echo "Hello World";
}
}
如您所见,我们未手动包含 /classes/User.php 文件。仍然一切都会在这里工作。
尽管SPL-Autoloader适用于小型项目,但它不一定是最佳解决方案。如果您有一个复杂的项目结构,则需要关心您要加载的文件在整个项目中的位置。
幸运的是我们得到了Composer。它是一个整洁的PHP包/依赖项管理器,它还为您提供了一个自动加载器。
一旦你安装了作曲家,就很容易引导自动加载。
在项目根目录中创建composer.json
。
{
"autoload": {
"classmap": [
"ProjectDomain"
]
}
}
这只是一个普通的旧json文件。 classmap数组采用您想要自动加载的目录字符串。
然后使用命令行切换到项目工作目录和
composer install
或composer.phar install
(如果您尚未全局安装作曲家)
Composer将为您创建一个vendor/
目录,该目录通常包含您在composer.json
中所需的依赖项,但由于我们不需要任何依赖项,我们将跳过该目录。
在该目录中,您将找到一个autoload.php
文件,您现在可以从前端控制器请求该文件。
index.php
<?php
include 'vendor/autoload.php';
$user = new User();
$user->test();
Composer还支持PSR-X自动加载。这样你就可以使用命名空间类,而composer将处理所有的自动加载。例如,这可能是这样的。
composer.json
{
"autoload": {
"psr-4": {
"Project\\": "ProjectDomain"
}
}
}
ProjectDomain / user.php的
<?php namespace Project;
class User {
public function test()
{
echo "Hello World!";
}
}
的index.php
<?php
include 'vendor/autoload.php';
$user = new Project\User();
$user->test();
每当您对composer.json文件进行与自动加载相关的更改时,请务必运行composer dump-autoload
。