Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.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 使用组合-如果类型错误,是否应引发异常_Php_Oop_Interface_Composition - Fatal编程技术网

Php 使用组合-如果类型错误,是否应引发异常

Php 使用组合-如果类型错误,是否应引发异常,php,oop,interface,composition,Php,Oop,Interface,Composition,使用组合时,若对象不是接口类型,则应显式抛出异常 例如: $myObject = new MyConcreteTypeA(); 现在,我的界面是MyInterface 因此,我是否应该在使用之前检查$myObject的类型,以确保它实现了MyInterface,如果没有,则抛出错误 i、 e 还是这只是一件粗制滥造的事 因此,我是否应该检查$myObject的类型,确保它在使用前实现了MyInterface,如果没有,则抛出错误?还是这只是一件粗制滥造的事 如果您特意创建了一个接口,并且期望对

使用组合时,若对象不是接口类型,则应显式抛出异常

例如:

$myObject = new MyConcreteTypeA();
现在,我的界面是
MyInterface

因此,我是否应该在使用之前检查
$myObjec
t的类型,以确保它实现了
MyInterface
,如果没有,则抛出错误

i、 e

还是这只是一件粗制滥造的事

因此,我是否应该检查
$myObject
的类型,确保它在使用前实现了
MyInterface
,如果没有,则抛出错误?还是这只是一件粗制滥造的事

如果您特意创建了一个接口,并且期望对象也期望它们实现该接口,那么是的,您绝对应该检查并抱怨

将你的方法与其他方法进行对比。在批评部分,它讨论了两种不相关方法之间的混淆。我将修改他们的示例,使其与PHP而不是Python一起工作*:

您可以轻松创建一个名为Finger的类,该类期望实现
press()
方法的类对其执行操作。但是,名为裤子的类也可以实现
press()
方法。对于Duck类型,为了防止奇怪的、难以检测的错误,开发人员需要了解方法
press()
,即使在概念上与他或她正在处理的内容无关的情况下

如果当你试着
按()
裤子时,只处理裤子是绝对重要的,那么你必须进行检查。如果您的代码不关心什么被
press()
ed,只要它被
press()
ed,那么您就可以放弃您的支票

*原始示例使用属性和方法。Python中的属性和方法共享相同的命名空间。尝试使用属性作为方法更是灾难性的,但不适用于PHP。

PHP不仅是,而且也是。通过检查
$myObject
实现一个给定的接口,您所做的工作在某种程度上补充了该语言中缺乏更结构化的键入系统。如果您想这样做,您可以,但您可能需要考虑一些问题:

  • 您正在进行的检查将在运行时执行,因此您不会从动态类型转换为静态类型。换句话说,如果您的检查失败,它在运行时仍然会失败
  • 如果您希望与这种理念保持一致,那么可能需要在整个代码中添加这种检查。然后你可以考虑移到A(注:我注意到这种风格的粉丝)。
  • 你也可以考虑。
  • 通过进行这种检查,您将有点违背PHP类型哲学,这在很大程度上是错误的
在我看来,在整个代码中采用同构的工作模式是很重要的,因此在某些方法中只放置一些分散的
实例或
is_a
不是一个好的做法。如果您觉得PHPs型系统对您来说不够好/安全,您可能需要考虑:

  • 如果可以,请切换到另一种类型系统使您更容易理解的语言(例如Java或C#)
  • 依靠其他工具,如组合和[*],让您对代码更有信心

[*]免责声明:我在Quanbit Research工作

if (! ($myObject instanceof MyInterface)) {
    throw new Exception('Invalid type');
}