在 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 有一项检查可以帮助您解决这个问题:
我目前正在将我的网站从 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 有一项检查可以帮助您解决这个问题: