接口中的构造方法

20 php oop

接口中的构造方法是不是很糟糕?

小智 39

为什么人们认为有人想要实例化界面?

我们想要做的是强制实现者实现构造函数,就像其他接口方法一样.

界面就像合同.假设我有一个接口Queue,我想确保实现者创建一个带有一个参数的构造函数,它创建一个单例队列(一个只有该元素的新队列).为什么不应该成为合同的一部分?至少使用Java接口,无法指定.

  • +1所以,不,他们并不坏."为什么人们认为有人想要实例化界面?"同意,IMO OP并没有这么想.如果一个类在每次实例化时都需要一个值(比如一个包装类),那么在我看来,数据传递合同可能很有用.特别是在PHP中,方法无法被覆盖 - 构造函数被"锁定"到某种行为. (12认同)
  • 方法可以在PHP中重写但不会重载. (4认同)
  • 也许@Steve指的是匹配构造函数签名的义务. (2认同)

Jar*_*Par 12

他们不好,因为他们没有任何目的.从本质上讲,接口只是一个数据传递合同.没有任何实现附加接口,因此没有任何内容可以初始化,也不需要构造函数.

如果你需要某种初始化,你最好使用抽象类.

  • 顺便说一下,我认为,界面不仅仅是"简单的数据传递合同".它应该被认为是责任合同,而责任合同又包括签名规范. (6认同)
  • @isntn,在它的核心,所有接口都指定如何传递数据.唯一认为保证行为是合同和测试框架的人.接口可能意味着行为,但他们无法保证 (3认同)

Kri*_*ris 7

首先,我不同意接口只是一个数据传递合同.如果这是真的,您将被允许在界面中定义属性.

我不会认为这样做很奇怪:

interface IDBConnection
{
    function __construct( $connectionString );
    function executeNonQuery( $commandText, $paramters=null);
    function executeScalar( $commandText, $paramters=null);
    function executeSingle( $commandText, $paramters=null);
    function executeArray( $commandText, $paramters=null);
}
Run Code Online (Sandbox Code Playgroud)

这将使您能够基于简单反射而不仅仅是数据协定来创建用于数据访问的第三方类的实例.

我很确定这不是最好的例子,我会在现实世界中找到一个抽象基类,但我也非常确定有完全正确的理由来定义构造函数方法的合同.一个我没想过的界面.

我没有看到它完成,但我不认为它是奇怪或坏.


And*_*are 2

无论它们是否不好,我不知道有任何语言能够在接口上指定构造函数。

然而,话虽这么说,我个人并不认为对象的构造函数是该对象接口的一部分,因此向接口添加构造函数会抑制接口提供的自然灵活性。

  • 虽然晚了,但是PHP有这个能力。(这并不意味着它是一个值得拥有的功能,但这只是我的意见。) (7认同)