在 PHP 的另一个类的方法中有条件地包含一个类文件的优点和缺点是啥?

Posted

技术标签:

【中文标题】在 PHP 的另一个类的方法中有条件地包含一个类文件的优点和缺点是啥?【英文标题】:What are the Advantages and Disadvantages of conditionally including a class file with in a method of another class in PHP?在 PHP 的另一个类的方法中有条件地包含一个类文件的优点和缺点是什么? 【发布时间】:2011-04-15 01:46:58 【问题描述】:

在this question 关于将所有类包含在一个需要所有类的解释器的目录中时,建议处理该问题的更好方法是有条件地仅包含此迭代所需的命令文件的解释器。例如,而不是这个:

require_once('CommandA.php');
require_once('CommandB.php');
require_once('CommandC.php');

class Interpreter 

    public function interpret($action) 
        switch($action) 
            case 'A':
                $c = new A();
                $c->execute();
                break;
        
    

做更多这样的事情:

class Interpreter 

    public function interpret($action) 
        switch($action) 
            case 'A':
                require_once('CommandA.php');
                $c = new A();
                $c->execute();
                break;
        
    

选择第二个选项的优点和缺点是什么 - 动态和有条件地仅加载所需的命令 - 与第一个选项相反 - 包括文件开头的所有文件,C 风格?

在对我上一个问题的回答中,速度、占用空间和易于编写被列为条件加载的优势。在解决此问题的其他问题中,我看到它表明 c 样式加载更具可读性和可维护性。谁能详细说明这些?还有其他优点或缺点吗?

【问题讨论】:

另一种选择是使用自动加载器uk.php.net/manual/en/function.spl-autoload-register.php,这意味着您不需要将 requires 嵌入到您的类代码中或在您的脚本顶部要求所有可能的类 Will reducing number of includes/requires increase performance?的可能重复 @Gordon 我认为这两个问题的范围不同,尽管相似。我问的不仅仅是性能。我想要一般的优点和缺点。包括可读性和可写性、任何范围问题、意外行为等。 @Mark 我一定会调查自动加载器。 将包含放在前面时,可读性和可维护性显然更好,但话又说回来,自动加载将完全消除这种担忧。 IMO 只要文件仅包含类或函数定义(将始终导入全局范围),唯一适用的考虑因素就是性能。但这只是我的 2c。 【参考方案1】:

条件加载的主要优点是每次加载该类时它都不会包含整个 php 文件树。当您使用代码缓存(并且应该)时的事件,每次 vm 遇到 /(include|require)(once)?/ 时都会检查文件的更新,因此包含不必要的 php 文件减慢你的代码。

这种特殊方法的缺点是更难维护,更容易出错。把一件事写两次是一种代码味道。写 My_Class 意味着你需要这个类,写 include "My_Class.php" 也意味着这个。这是不对的。

我建议使用自动加载:http://php.net/manual/en/language.oop5.autoload.php

【讨论】:

以上是关于在 PHP 的另一个类的方法中有条件地包含一个类文件的优点和缺点是啥?的主要内容,如果未能解决你的问题,请参考以下文章

php中依赖注入的问题[关闭]

访问同一类的另一个对象的受保护属性的方法

使用AWK中的另一个文件查询文件的内容

Spring Cache - @CacheEvict,@CachePut 在从同一类的另一个方法调用时不起作用

如何根据 Redux Form 中的另一个输入有条件地显示一个输入?

从具有相同基的另一个派生类调用派生类的非常量方法