与PHP Pimple的接口冲突
我有一个扩展Pimple\Container的自定义类。在我看来,这个想法是为了包装访问已定义服务的丑陋方法(见下文): 这个想法对我想做的事情很有效。然后,我继续创建了一个应用程序类,我选择继承而不是聚合,这似乎是出于逻辑原因 现在的问题是,我有一个ServiceProvider,它接受应用程序实例而不是Pimple\Container,因为我创建了自己的ServiceProviderInterface来定义这个契约 我现在意识到,假设应用程序过去是,现在仍然是一种容器类型,并让它使用与父类不同的契约类型,这不是一个好主意。然而,在我的概念上,应用程序实例是某种容器,因为在其中我存储了一些key=>value对数据 我原以为界面隔离原则可以挽救我的生命,但我不确定与PHP Pimple的接口冲突,php,design-patterns,pimple,Php,Design Patterns,Pimple,我有一个扩展Pimple\Container的自定义类。在我看来,这个想法是为了包装访问已定义服务的丑陋方法(见下文): 这个想法对我想做的事情很有效。然后,我继续创建了一个应用程序类,我选择继承而不是聚合,这似乎是出于逻辑原因 现在的问题是,我有一个ServiceProvider,它接受应用程序实例而不是Pimple\Container,因为我创建了自己的ServiceProviderInterface来定义这个契约 我现在意识到,假设应用程序过去是,现在仍然是一种容器类型,并让它使用与父类不
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定义了此合同
这毫无意义!为什么服务提供商会依赖于您的应用程序?难道不是相反吗?提供程序是一个自包含的模块。您的应用程序有几个依赖项
关于你的问题
我可以用
应用程序
对象替换容器
对象而不损失任何功能吗感谢您对此问题的详细解释。我刚刚花了一些时间研究了坚实的原则,可悲的是,当我们在学校被介绍到面向对象编程时,我们被教导以糟糕的方式编程,然后在高级阶段,你被教导设计模式和原则,这可能会帮助你成为一名更好的程序员。我会重新考虑我的设计,也许会去掉粉刺,但保留它背后的想法来建造我自己的容器。我会回来解决这个问题。再次感谢。
$container = new Pimple();
$container['session_storage'] = function ($c) {
return new SessionStorage('SESSION_ID');
};
$container['session'] = function ($c) {
return new Session($c['session_storage']);
};