我对在 PHP 中加载依赖类的正确方法/最佳实践有疑问。
我通常将所有依赖项放在每个类的开头,并以类似于 Java 导入的方式使用
include_once
。比如:
include_once 'dto/SomeObjectDTO.php;'
include_once 'dao/SomeObjectDAO.php;'
include_once 'util/SomeObjectUtil.php;'
class SomeObjectService{
#class code here
}
这是加载类的最佳方式?或者也许加载
Bootstrap.php
中的所有类?其他方式?
请注意,我正在谈论加载我自己的类,而不是像框架这样的复杂外部类。
就像Homer6所说,自动加载是php内置的依赖加载机制。
PHP-FIG提出了一系列 PHP 编码标准,称为 PSR。 PSR-0 处理类命名和自动加载。以下是一些链接:
另外,请记住,自动加载是有代价的。在建议的默认自动加载器中,有很多字符串工作和 fs 工作(您可以实现自己的更快的自动加载器,但它不符合标准)。当您需要加载大量类时,这会使自动加载变慢。因此,如果您只需要加载 2 个类,您的方法会更快、更容易理解。
从 5.3 版本开始,PHP 支持命名空间。 这允许您拥有包和类层次结构,就像您从 C++ 或 Java 中了解它们一样。
查看这些资源以了解更多信息:
PHP 你可以注册你的自动加载方法。 Symfony 2 包含一个很好的类来完成它。
http://php.net/manual/en/function.spl-autoload-register.php
我已经对其进行了调整,以便与我们编写的库一起使用。
https://github.com/homer6/altumo/blob/master/source/php/loader.php
https://github.com/homer6/altumo/blob/master/source/php/Utils/UniversalClassLoader.php
此调整允许您拥有不需要顶级命名空间具有相同文件夹名称的命名空间。
set_include_path(get_include_path()
. PATH_SEPARATOR . 'path1'
. PATH_SEPARATOR . 'path2'
);
// auto load classes:
function autoloadClasses($className) {
require_once $className . '.php';
}
spl_autoload_register('autoloadClasses');
有一个 Composer 生成的文件
/vendor/autoload.php
。因此,在 Composer 安装依赖项后,可以执行以下操作:
<?php
require __DIR__ . '/vendor/autoload.php';