(何时)我应该在PHP中使用类型提示?

时间:2009-02-11 12:13:51

标签: php coding-style

我无法理解PHP作者添加类型提示的动机。在它出现之前我很高兴地活着。然后,当它被添加到PHP 5时,我开始在任何地方指定类型。现在我认为这是一个坏主意,只要鸭子打字可以确保类之间的最小耦合,并利用代码模块化和重用。

感觉就像类型提示将语言分成两种方言:有些人用静态语言风格编写代码,提示,其他人坚持使用良好的旧动态语言模型。还是不是“全有或全无”的情况?在适当的时候,我应该以某种方式混合这两种风格吗?

6 个答案:

答案 0 :(得分:35)

这不是静态与动态类型,PHP仍然是动态的。这是关于接口的合同。如果您知道一个函数需要一个数组作为其参数之一,请在函数定义中强制它。我喜欢快速失败,而不是稍后在函数中出错。

(另请注意,您无法为bool,int,string,float指定类型提示,这在动态上下文中是有意义的。)

答案 1 :(得分:15)

只要函数中的代码肯定依赖于传递参数的类型,就应该使用类型提示。无论如何,代码都会生成错误,但类型提示会为您提供更好的错误消息。

答案 2 :(得分:11)

PHP小组添加类型提示的动机是为习惯于Java风格的OOP提供另一个功能,使平台更熟悉,更舒适,更有吸引力。反过来,这将使PHP更加“企业就绪”,这将有助于Zend的核心业务。

除了营销之外,它确实有其用途。如果您正在编写一个以特定方式对参数进行操作的方法,如果该参数是其他的,则会导致意外(通常是静默的)失败,那么使用类型提示可确保代码在开发期间中断,而不是在生产中中断。 / p>

答案 3 :(得分:5)

如果你决定做类型提示,至少要使用接口而不是具体或抽象类来做。原因很简单,PHP不允许多重继承,但允许实现多个接口。因此,如果有人试图使用你的库,那么实现你的界面就不会有困难,相反,他必须扩展你的抽象/具体类,因为他已经扩展了另一个。

答案 4 :(得分:0)

如果没有类型提示,IDE将无法知道方法参数的类型,从而提供正确的智能感知 - 您的编辑器确实具有智能感知,对吧? )。应该说我只是假设IDE使用它来进行智能感知,因为这是我第一次听说PHP中的类型提示(感谢提示btw)。

答案 5 :(得分:-2)

类型提示是我们公司的一个争论点(主要是像这样的Java人员),我是一个非常老派的PHP程序员(以及其他语言的程序)。

我的建议是避免类型提示并在每个复杂函数中包含try / catch处理程序。

类型提示强制应用程序依赖于调用者异常处理环境,该环境通常很糟糕且未经测试,这是主要问题。对于网络应用程序,这导致死亡的白色屏幕,对于批处理而言,它导致致命的退出而在大多数情况下没有记录好的消息,并且您试图重新创建管理对您的用户或应用程序问题。回来解决。

本地异常处理提供了一个更受控制的测试场景,包括数据类型中的垃圾和数据值中的垃圾,与通过传入不正确类型的调用者中难以测试的异常处理路径相比,它提供了更完整的测试套件并期待例外。

由于堆栈版本问题,异常测试在许多情况下也失败了(例如,某些版本的PHP(如5.4)没有以正确的方式捕获“可捕获的致命”错误,并且ergo phpunit只是在破坏测试套件时死掉。这是特定于堆栈的问题,但是根据我的经验,类型提示只是不必要,使得习惯于打字语言的人更好地接受PHP而不会产生影响,并导致更复杂的测试场景(很难测试处理异常路径结果的调用者)。 / p>

Java和其他类型语言的人不接受或理解如何利用PHP中的默认混合类型参数并从中受益... 他们将在某一天学习,但前提是他们采用PHP方式。 ;-)

在开发基于PHP单元的强大测试场景时,可以学到最好的经验教训,这通常可以解释为什么类型提示是与测试相关的屁股的痛苦,并导致更多的问题而不是好的......对于他们自己,我的应用程序运行得更好,更可靠,测试结果更加完整,通常100%的代码覆盖率,包括本地功能中的捕获路径。