【问题标题】:What is the right way to load dependencies in PHP?在 PHP 中加载依赖项的正确方法是什么?
【发布时间】:2012-11-17 12:31:54
【问题描述】:

我对在 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 中加载所有类?其他方式?

请注意,我说的是加载我自己的类,而不是框架等复杂的外部类。

【问题讨论】:

  • 如今使用自动加载器通常被认为是最佳实践
  • PHP速度很快...你也可以用这个方法....

标签: php include dependencies


【解决方案1】:

就像 Homer6 说的,自动加载是 php 内置的依赖加载机制。

PHP-FIG 提出了一系列称为 PSR 的 PHP 编码标准。 PSR-0 处理类命名和自动加载。以下是一些链接:

另外,请记住,自动加载是有代价的。在建议的默认自动加载器中有很多字符串工作和 fs 工作(您可以实现自己的更快的自动加载器,但它不符合标准)。当您需要加载大量类时,这会使自动加载变慢。因此,如果您只需要加载 2 个类,您的方法会更快、更容易理解。

【讨论】:

    【解决方案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

    这种改编允许您拥有不需要顶级命名空间具有相同文件夹名称的命名空间。

    【讨论】:

      【解决方案3】:

      自 5.3 版起 PHP 支持命名空间。 这允许您拥有一个包和类层次结构,就像您从 C++ 或 Java 中了解它们一样。

      查看这些资源以了解更多信息:

      http://www.php.net/manual/en/language.namespaces.basics.php

      http://php.net/manual/en/language.namespaces.importing.php

      【讨论】:

        【解决方案4】:
        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');
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-12
          • 2016-10-27
          • 2014-08-12
          • 1970-01-01
          • 2019-03-10
          • 1970-01-01
          • 2011-09-14
          相关资源
          最近更新 更多