我不理解PHP作者添加类型提示的动机。在它出现之前,我很开心地过着生活。然而,自从它被添加到PHP 5中,我开始到处指定类型。现在我认为这是一个坏主意,因为鸭子类型确保类之间最小耦合,并促进代码模块化和重用。
感觉类型提示将语言分成了两个方言:有些人以静态语言的方式使用提示编写代码,而其他人则坚持使用老式的动态语言模型。或者这不是“全部或无”的情况吗?在适当的时候,我是否应该以某种方式混合这两种风格?
我不理解PHP作者添加类型提示的动机。在它出现之前,我很开心地过着生活。然而,自从它被添加到PHP 5中,我开始到处指定类型。现在我认为这是一个坏主意,因为鸭子类型确保类之间最小耦合,并促进代码模块化和重用。
感觉类型提示将语言分成了两个方言:有些人以静态语言的方式使用提示编写代码,而其他人则坚持使用老式的动态语言模型。或者这不是“全部或无”的情况吗?在适当的时候,我是否应该以某种方式混合这两种风格?
这并不是关于静态类型和动态类型的问题,PHP 仍然是动态类型语言。重要的是为接口制定合同。如果您知道一个函数需要一个数组作为其参数之一,则在函数定义中直接强制它。我更喜欢快速失败,而不是在函数后期出现错误。
(还要注意,在动态上下文中不能指定 bool、int、string、float 的类型提示是有道理的。)
当函数的代码明确依赖于传递参数的类型时,应该使用类型提示。无论如何,代码都会生成错误,但类型提示将为您提供更好的错误消息。
如果您决定使用类型提示,至少请使用接口而不是具体或抽象类。原因很简单,PHP不允许多重继承,但允许实现多个接口。因此,如果任何人尝试使用您的库,他将不会在实现您的接口时遇到困难,而不是在他已经继承另一个类的情况下必须扩展您的抽象/具体类的情况。
类型提示是我们公司的争议点(主要是Java人员喜欢它),而我是一个非常老派的PHP程序员(并在其他语言中编程)。
我的建议是避免使用类型提示,并在每个复杂函数中包含try/catch处理程序。
类型提示强制应用程序依赖于调用者的异常处理环境,这通常是不好的并且未经测试的主要问题。对于Web应用程序,这会导致白屏死机,对于批处理,则会导致简单的致命退出而没有记录大多数情况下的良好消息,您坐在那里挠头,试图重新创建用户或应用程序问题,管理层要求您解决问题。
本地异常处理提供了更受控制的测试场景,包括垃圾数据类型和垃圾数据值,与通过传递不正确的类型并期望异常的调用者中难以测试的异常处理路径相比,这提供了一个更完整的测试套件。
异常测试在许多情况下也会因为堆栈版本问题而失败(即某些 PHP 版本,如 5.4,无法以适当的方式捕获“可捕获致命”错误,因此 PHPUnit 简单地停止运行测试套件。这是一个特定于堆栈的问题,然而根据我的经验,类型提示根本是不必要的,它使习惯于有类型语言的人更好地接受 PHP 而不意识到影响,并导致更复杂的测试场景(非常难以测试调用者处理异常路径结果)。