Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与PHP Pimple的接口冲突_Php_Design Patterns_Pimple - Fatal编程技术网

与PHP Pimple的接口冲突

与PHP Pimple的接口冲突,php,design-patterns,pimple,Php,Design Patterns,Pimple,我有一个扩展Pimple\Container的自定义类。在我看来,这个想法是为了包装访问已定义服务的丑陋方法(见下文): 这个想法对我想做的事情很有效。然后,我继续创建了一个应用程序类,我选择继承而不是聚合,这似乎是出于逻辑原因 现在的问题是,我有一个ServiceProvider,它接受应用程序实例而不是Pimple\Container,因为我创建了自己的ServiceProviderInterface来定义这个契约 我现在意识到,假设应用程序过去是,现在仍然是一种容器类型,并让它使用与父类不

我有一个扩展Pimple\Container的自定义类。在我看来,这个想法是为了包装访问已定义服务的丑陋方法(见下文):

这个想法对我想做的事情很有效。然后,我继续创建了一个应用程序类,我选择继承而不是聚合,这似乎是出于逻辑原因

现在的问题是,我有一个ServiceProvider,它接受应用程序实例而不是Pimple\Container,因为我创建了自己的ServiceProviderInterface来定义这个契约

我现在意识到,假设应用程序过去是,现在仍然是一种容器类型,并让它使用与父类不同的契约类型,这不是一个好主意。然而,在我的概念上,应用程序实例是某种容器,因为在其中我存储了一些key=>value对数据

我原以为界面隔离原则可以挽救我的生命,但我不确定

  • 我的假设是否违反了Liskorv替换原则,与应用程序扩展的Pimple\Container关系有关

  • 我是否可以使用自己的接口注册我的服务提供商,但遇到了一个错误,即我通过的任何服务都不符合pimple\ServiceProvider合同

  • 简单地说,是否可以扩展Pimple的容器而忽略库的服务提供商,并使用定义了相同合同但参数不同的服务提供商?

    首先

    在我看来,这个想法是为了包装访问已定义服务的丑陋方法

    丑陋的方法来自
    ArrayAccess
    界面,该界面允许您以类似数组的形式访问属性:

    $container = new Pimple();
    $container['session_storage'] = function ($c) {
        return new SessionStorage('SESSION_ID');
    };
    
    $container['session'] = function ($c) {
        return new Session($c['session_storage']);
    };
    
    然后,我继续创建了一个应用程序类,我选择继承而不是聚合,这并不是出于逻辑上的任何特殊原因

    这是错误的。如果可能,您应该始终选择聚合而不是继承

    继承是一种静态紧耦合关系,在PHP中仅限于一种。您不能在运行时更改继承

    另一方面,组合是一个动态的过程,如果遵循坚实的原则来实现,那么它可能是紧密耦合的。在使用组合时,您可以在运行时完美地切换关系

    现在的问题是当我有一个接受 应用程序实例,而不是我创建的Pimple\容器 我自己的ServiceProviderInterface定义了此合同

    这毫无意义!为什么服务提供商会依赖于您的应用程序?难道不是相反吗?提供程序是一个自包含的模块。您的应用程序有几个依赖项

    关于你的问题

  • 了解您是否违反LSP的最好方法是问问自己:
    我可以用
    应用程序
    对象替换
    容器
    对象而不损失任何功能吗

  • 没有。接口是合同,应遵守合同


  • 感谢您对此问题的详细解释。我刚刚花了一些时间研究了坚实的原则,可悲的是,当我们在学校被介绍到面向对象编程时,我们被教导以糟糕的方式编程,然后在高级阶段,你被教导设计模式和原则,这可能会帮助你成为一名更好的程序员。我会重新考虑我的设计,也许会去掉粉刺,但保留它背后的想法来建造我自己的容器。我会回来解决这个问题。再次感谢。
    $container = new Pimple();
    $container['session_storage'] = function ($c) {
        return new SessionStorage('SESSION_ID');
    };
    
    $container['session'] = function ($c) {
        return new Session($c['session_storage']);
    };