PHP MVC:将实用程序/帮助程序类实例作为依赖项注入基类

PHP MVC:将实用程序/帮助程序类实例作为依赖项注入基类,php,oop,design-patterns,model-view-controller,mvvm,Php,Oop,Design Patterns,Model View Controller,Mvvm,在我的HMVC项目中,我实现了一个Arrays类。它的静态方法总体上用于处理多维数组上的各种操作。除了这个类之外,我也使用类似的类:文件,图像,打印机,消息,类,等等。但我不想在我的项目中再使用任何静态或单例 我将它们视为助手,最终的类具有用于在项目组件上执行特定任务的方法,或者使用它们(合并数组、调整图像大小、上载/打印文件等)。因此,我想。。。尽量减少它们在我的项目中的分布 例如,我发现在每个子控制器中传递Arrays对象并不是最佳选择,因为在基本控制器类的构造函数中,某些数组必须合并 我想

在我的HMVC项目中,我实现了一个
Arrays
类。它的静态方法总体上用于处理多维数组上的各种操作。除了这个类之外,我也使用类似的类:
文件
图像
打印机
消息
,等等。但我不想在我的项目中再使用任何静态或单例

我将它们视为助手,最终的类具有用于在项目组件上执行特定任务的方法,或者使用它们(合并数组、调整图像大小、上载/打印文件等)。因此,我想。。。尽量减少它们在我的项目中的分布

例如,我发现在每个子控制器中传递
Arrays
对象并不是最佳选择,因为在基本控制器类的构造函数中,某些数组必须合并

我想问:

  • 我实际上将数组合并到基本控制器类中是错误的,还是真的会出现这种情况?
  • 如果没有错,那么我只能选择将实用程序类
    Arrays
    作为构造函数依赖项传递,这样就可以优雅地解决静态问题。这是真的,还是有更好的选择?
我很欣赏你的观点

多谢各位


附言:

以下是
数组
类,如果您需要查看:

<?php

namespace MYMVC\Utils;

/**
 * Arrays: utility class to handle operations on multidimensional arrays.
 */
class Arrays {

    /* ------------------------------------------------------------- */
    /* Keypath format: '{key0}/{key1}/{key2}/{key3}/{searched-key}'. */
    /* ------------------------------------------------------------- */

    /** Set the value in array at the specified keypath. [...] */

    public static function setArrayValue(&$array, $keypath, $value, $delimiter = '/') { ... }


    /** Get a tree structure from the specified keypath. [...] */

    public static function buildArrayTree($keypath, $value, $delimiter = '/') { ... }


    /** Check if the specified keypath exists in array. [...] */

    public static function arrayKeyExists(&$array, $keypath, $delimiter = '/') { ... }


    /** Get the array value from the specified keypath. [...] */

    public static function getArrayValue(&$array, $keypath, $delimiter = '/') { ... }


    /** Merge multiple multidimensional arrays. [...] */

    public static function mergeMultipleArrays(/* func_get_args */) { ... }


    /** Merge the top multidimensional array over the base multidimensional array. [...] */

    public static function mergeArrays($base, $top) { ... }

}

类似于
Arrays::mergeArrays
的东西没有错。你不介意在你的类中调用数组中的
或数组合并,不是吗?如果需要,您可以调用
数组
一个“实用程序”类,但我不认为您可以对
文件
这样做

如果您当前的问题是“我不想将xyz对象传递给每个子控制器”,那么通常您会有一些想法:

  • 只需将DIC注入控制器即可。然后从中检索依赖项。这就是所谓的“服务定位器”,它被许多框架广泛使用。它的优点是,您只能在需要依赖关系的地方和需要依赖关系的时候才需要依赖关系。但它有一系列的缺点。没有它,你的对象就不可能存在,你的类也不容易被模仿。这就是为什么它被认为是一种反模式

  • 将依赖项(即:
    文件
    )显式地注入控制器中。为什么要隐藏控制器依赖于
    文件的事实?这里唯一的问题是,特别是对于控制器,很多依赖项并不总是被所有类的方法使用。这更像是一个性能问题,您可以用多种方法来解决它(例如:
    )


选择适合你的药物。

它们真的应该注射吗?-他们为什么要这样做?您是否需要能够用另一个类替换
数组
类型?
数组
是否需要其他依赖项?然后在类中像
Arrays::mergeMultipleArrays
那样使用它。“很好。”费德肯谢谢你的回答。问得好。我编辑了我的问题,以某种方式揭示我想要实现什么以及我是如何看待它的。这些类本身是最终类,甚至不要求任何依赖项。只需将被动块作为其方法的封装。由于您不需要通过注入一些依赖项来自定义助手的使用,因此您只需从类向助手进行一次简单的函数调用即可。您没有任何理由将
数组
对象替换为该类的另一个子类型。@Federkun我刚刚意识到,作为
文件
的实用程序类实际上可以有一个或多个依赖项(文件名、路径、类型等)。因为我不想再使用静态了,所以我必须在需要的地方将其作为依赖项传递。你能根据这些变化给我一个答案吗?我会很感激的。非常感谢。注:不幸的是,我没有具体的例子来说明问题,因为我只使用了之前我在静态系统上开发时的例子。然后我只是静态地给助手打电话,一切都解决了。但是我不想再这样了。我必须说,静态、单例和服务定位器对我来说是不可能的。从来没有:-)但我真的很喜欢这种方式,你如何客观地将它们作为解决方案呈现给我(因为它们确实是一个解决方案),同时你向我展示了它们是一个反模式的事实。这方面的回答很好。Cont…Cont:我真正的问题不是我必须在基类控制器中注入实用程序/助手实例(例如),而是我必须在基类的构造函数中合并数组(例如)。这就是我不确定的地方:我不想仅仅因为在构造函数中合并数组的问题上做出了错误的决定而注入一些东西。请给我几分钟时间阅读“行动物体”文档,我会回来的。你的答案肯定是正确的。您不仅给了我一个可靠的、正确的视角和一个好的recherche资源(我已经读过了),而且您还认识到我的实际问题可能是:“\u此处唯一的问题是,特别是对于控制器,许多依赖项并非总是被所有类的方法使用。”。是的,你说得太对了!这让我更为困扰,但我失去了对它的关注,忙于其他大部件(同时从HMVC中访问多个db服务器)。直到你让我再次意识到。所以,一句话:很好的回答!谢谢你抽出时间!我很感激。祝你好运