在 PHP 7 中全局启用“strict_types”

问题描述 投票:0回答:3

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

<?php declare(strict_types=1);

// All other code here
// ...

所以我想知道,有没有办法使用

strict_types
或 apache 配置文件全局启用
php.ini
,这样我就不必每次都写这一行,如果是的话我该如何启用它?

php php-7
3个回答
82
投票

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

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

在模式 0 下,它会自动验证并转换某些标量类型(例如
    int
  • 参数会将
    '123'
    转换为
    123
    ,但
    'hello'
    会出错)
    在模式 1 中,它要求调用者预先进行验证和转换,并拒绝任何类型不正确的参数(例如,对于 
  • '123'
  • 参数,
    'hello'
    int
    都被拒绝)
    
    
  • 模式的选择是针对每个文件的,并且基于函数的
caller

,因为:

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

无论设置如何,您的函数都保证接收请求的参数类型
  • 如果您希望在调用错误类型的函数时收到错误,您可以使用模式 1,而无需强制其他应用程序和库处于相同的设置
  • 如果您想要模式 0 的自动检查和转换,您可以这样做,但仍然与在模式 1 下运行的其他库和应用程序交互
  • 在 PHP 7.0 之前编写的旧库(或者在发布时需要支持两者)将继续大致像以前一样工作,因为默认模式 0 与内置函数的现有行为类似
  • 因此,您需要告诉 PHP 哪些文件已编写为使用严格类型模式,哪些没有;执行此操作的方法是使用
declare

语句。

    


17
投票
PHPStorm

有一项检查可以帮助您解决此问题:


7
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.