首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与PHP Pimple的接口冲突

与PHP Pimple的接口冲突
EN

Stack Overflow用户
提问于 2016-07-20 14:13:43
回答 1查看 162关注 0票数 2

我有一个扩展Pimple\Container的自定义类。在我看来,这个想法是用丑陋的方法来访问定义的服务(参见下面):

代码语言:javascript
复制
offsetGet($key)       -> get($key)
offsetSet($key, $val) -> set($key, $val)
offsetExists($key)    -> has($key)

这个想法对我想要做的事情很有效。然后,我创建了一个应用程序类,我选择了继承而不是聚合,这并不是因为看起来是逻辑的原因。

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

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

我原以为界面整合原则会节省我的时间,但我不确定。

  1. 对于\Container关系,我的假设是否违反了Liskorv替换原则?
  2. 有任何方法可以使用我自己的接口注册我的服务提供者吗?如果我传递的任何服务都不符合pimple\ServiceProvider合同的错误,我会遇到这样的错误吗?

简单地说,是否有可能扩展Pimple的容器,忽略库的服务提供者,并使用您的容器定义相同的契约,但参数不同?

EN

回答 1

Stack Overflow用户

发布于 2016-07-20 21:02:49

首先,

在我看来,这个想法是用丑陋的方法来访问定义的服务。

丑陋的方法来自ArrayAcess接口,它允许您以类似数组的形式访问属性:

代码语言:javascript
复制
$container = new Pimple();
$container['session_storage'] = function ($c) {
    return new SessionStorage('SESSION_ID');
};

$container['session'] = function ($c) {
    return new Session($c['session_storage']);
};

然后,我继续创建了一个应用程序类,我选择继承而不是聚合,而不是出于任何特定的原因,而不是看上去是逻辑的

这是不对的。在可能的情况下,应该始终选择聚合而不是继承。

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

另一方面,构图是一种动态的,如果执行尊重坚实的原则,可能是孤立耦合的。在使用组合时,您可以在运行时完美地切换关系。

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

这没道理!您的服务提供者为什么要依赖您的应用程序?不应该是相反的吗?提供程序是一个独立的模块。您的应用程序有几个依赖项。

关于你的问题,

  1. 要知道你是否违反了LSP,最好的方法就是问问自己: 我是否可以将Container对象替换为Application对象,而不会失去任何功能?
  2. 诺普。接口是契约,合同应该得到尊重。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38483732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档