【问题标题】:Enabling 'strict_types' globally in PHP 7在 PHP 7 中全局启用“strict_types”
【发布时间】:2023-03-22 16:15:01
【问题描述】:

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

<?php declare(strict_types=1);

// All other code here
// ...

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

【问题讨论】:

  • 不,这是不可能的。
  • 您可以使用sedawk 或您选择的其他工具将所有&lt;?php 替换为&lt;?php declare(strict_types=1);...
  • @NikiC 我很确定任何 IDE 中的简单查找替换都会做同样的事情,我只是想知道是否可以在运行时将其作为标准功能执行,因为我做不到找到有关它的任何信息
  • 你总是可以有一个 git 钩子来检查以确保所有 PHP 文件都以&lt;?php declare(strict_types=1); 作为第一行。这会为您的项目强制执行它,而不会强制库
  • PHP CS Fixer 中的 declare_strict_types 选项可以强制所有文件中的严格类型。比字符串替换更好,例如,如果您有多个开始标签。它可以在 IDE 中自动集成和运行。

标签: php apache php-7 variable-types


【解决方案1】:

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

它明确地为任何函数的调用者而不是其作者提供了如何检查标量类型的选择,因此:

  • 如果您编写带有标量类型提示的库,您的函数将得到请求的参数类型的保证,即使是由未以严格模式编写的代码调用(类型被强制)
  • 如果您编写一个库并想要传统的弱类型,您仍然可以使用使用类型提示的库(因为它们不会强制您执行严格的类型检查)
  • 相反,如果您编写一个库并希望对您调用的函数进行严格类型化,则您不必要求库的用户也启用严格类型化
  • 内置函数的工作方式与用户定义的函数相同,现有代码默认运行方式相同
  • 如果您启用严格输入,则无论如何都需要更改代码以正确处理它

因此,您可以告诉 PHP 哪些文件已写入使用严格类型模式,哪些没有;这样做的方法是使用declare 语句。

【讨论】:

  • 该 wiki 条目至少可以说是一本有趣的读物。在我看来,包开始使用它并转向更好的类型检查将是一件好事。
  • 添加 php.ini 指令来全局开启严格类型并非不可能。如果 PHP 开发人员不这样做,您可以patch it yourself。使用链接的补丁构建并在 php.ini 中设置strict_types=1
  • @sorpigal 我从来没有说过这是不可能实现的;我说,经过长时间的(顺便说一下经常是激烈的)辩论,决定让调用者控制它是最好的主意。如果你要修补 PHP,你可以在有人使用不正确的类型时将其修补为停止并捕获,但那将是不同的功能。
【解决方案2】:

PHPStorm 有一项检查可以帮助您:

【讨论】:

  • 没有严格回答这个问题,但仍然有帮助,谢谢。 (:
  • @Scolopendre 我看到了你在那里写的双关语的类型
【解决方案3】:

基本上没有。

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

【讨论】:

    猜你喜欢
    • 2016-06-15
    • 2018-07-03
    • 2011-09-12
    • 2015-10-08
    • 2019-01-14
    • 1970-01-01
    • 2022-07-15
    • 2011-06-11
    相关资源
    最近更新 更多