我对在PHP中加载依赖类的正确方法/最佳实践存有疑问。
我通常使用include_once
以类似于Java导入的方式将所有依赖项放在每个类的开头。类似的东西:
include_once 'dto/SomeObjectDTO.php;'
include_once 'dao/SomeObjectDAO.php;'
include_once 'util/SomeObjectUtil.php;'
class SomeObjectService{
#class code here
}
这是加载类的最佳方法吗?或者可以在Bootstrap.php
中加载所有课程?其他方式?
请注意,我正在谈论加载我自己的类,而不是像框架那样复杂的外部类。
答案 0 :(得分:2)
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
此自适应允许您使不需要顶级命名空间的命名空间具有相同的文件夹名称。
答案 1 :(得分:2)
从版本5.3开始,PHP支持名称空间。 这允许您拥有一个包和类层次结构,就像您从C ++或Java中了解它们一样。
查看这些资源以了解更多信息:
答案 2 :(得分:2)
像Homer6所说,自动加载是一种内置的依赖加载机制。
PHP-FIG提出了一系列称为PSR的PHP编码标准。 PSR-0处理类命名和自动加载。以下是一些链接:
此外,请记住,自动加载需要付出代价。有很多字符串工作,并在建议的默认自动加载器中使用fs(您可以实现自己的更快的自动加载器,但它不符合标准)。当您需要加载大量类时,这会使自动加载变慢。因此,如果您只需要加载2个类,那么您的方法将更快,更容易理解。
答案 3 :(得分:1)
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');