在 PHP 7 中全局启用“strict_types”

2022-08-30 09:31:31

我目前正在将我的网站从PHP5迁移到PHP7,并且我已经开始使用添加的严格键入功能。但是,这需要我使用以下行开始所有文件:

<?php declare(strict_types=1);

// All other code here
// ...

所以我想知道,有没有办法使用类似的东西或apache配置文件全局启用,这样我就不必每次都写这行,如果是这样,我怎么能启用它?strict_typesphp.ini


答案 1

这是故意不可能实现的,因为在对标量类型提示进行了长时间的讨论之后采用的实现是这样的:https://wiki.php.net/rfc/scalar_type_hints_v5

它为标量类型参数引入了两种模式,这两种模式都保证接收参数的函数获得其签名中所需的类型。但是,它提供了两种模式来说明调用代码如何实现这一点:

  • 在模式 0 中,它会自动验证并转换某些标量类型(例如 参数将转换为 ,但错误int'123'123'hello')
  • 在模式 1 中,它要求调用方事先执行该验证和强制转换,并拒绝任何类型不正确的参数(例如,两者都被拒绝,并且被拒绝为参数)'123''hello'int

模式的选择是按文件进行的,并且基于函数的调用方,因为:

  • 该设置需要影响内置函数以及用户定义的函数
  • 需要检查或更新调用函数的所有代码才能在模式 1 中正常工作,但大多数旧代码在模式 0 中运行良好
  • 使用全局设置,您只能使用已使用两种模式或您喜欢的相同模式测试的库
  • 未声明其首选模式的文件需要继续以类似于 PHP 5.x 的方式工作,以允许现有代码运行;仅当默认值为模式 0 时才可能

从编写可重用库的人的角度来看:

  • 无论设置如何,您的函数都可以保证接收所请求的参数类型
  • 如果要在调用具有错误类型的函数时收到错误,则可以使用模式 1,而无需强制其他应用程序和库位于同一设置上
  • 如果您希望具有模式0的自动检查和强制转换,则可以这样做,但仍与在模式1中运行的其他库和应用程序进行交互
  • 在 PHP 7.0 之前编写的旧库(或者在发布时需要同时支持两者)将继续大致像以前一样工作,因为默认模式 0 类似于内置函数的现有行为

因此,由您来告诉PHP哪些文件已编写为使用严格类型模式,哪些文件尚未使用;执行此操作的方法是使用语句。declare


答案 2

PHPStorm 有一个检查来帮助你做到这一点:

enter image description here


推荐