在 PHP 中全局启用 'strict_types' 7

Enabling 'strict_types' globally in PHP 7

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

<?php declare(strict_types=1);

// All other code here
// ...

所以我想知道,有没有什么方法可以使用 php.ini 之类的东西或 apache 配置文件来全局启用 strict_types,这样我就不必每次都写这一行,如果那么我该如何启用它呢?

基本上没有。

因为如果您只需要使用严格模式的库,您将导致不必要的包分离。 还要考虑 strict/weak 类型选项只是 PHP.

中的一个额外选项

这是故意不可能的,因为经过 非常长的讨论 标量类型提示后采用的实现是这个:https://wiki.php.net/rfc/scalar_type_hints_v5

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

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

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

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

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

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

因此,由您决定 PHP 哪些文件已被写入使用严格类型模式,哪些没有;方法是使用 declare 语句。

PHPStorm 有一项检查可以帮助您解决这个问题: