PHP 7 Bool 类型提示不起作用

Posted

技术标签:

【中文标题】PHP 7 Bool 类型提示不起作用【英文标题】:PHP 7 Bool Type Hint Not Working 【发布时间】:2018-03-07 19:59:22 【问题描述】:

我对标量类型提示问题(php7 应该能够处理)感到有些困惑。基本上,我创建了一个带有bool 类型提示的方法,只允许传递布尔值。但是它失败了,并让其他类型(如字符串)通过。我相信过去这对我有用。以 sn-p 为例。第一个转储结果为false(这很有意义,因为'test' 是一个字符串),第二个转储结果为true,这对我来说没有意义。我希望触发 PHP 错误,因为类型不是布尔值。有什么想法吗?

<?php
class Test
    function something(bool $test)
       var_dump($test); // "Second dump"
    


$value = 'test';
var_dump(is_bool($value)); // "First dump"
$test = new Test;
$test->something($value);

结果:

bool(false) 
bool(true)

【问题讨论】:

在 PHP 5.6 中,这产生了一个错误:3v4l.org/Uo7j0 您是否启用了严格输入? @JulienLachal 我没有。不知道在哪里启用它。生病谷歌那个。会及时通知您。 【参考方案1】:

您必须在文件中声明 严格类型 [1] 以强制 PHP 不进行 类型强制 [2]。

[1] -- http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.strict

[2] -- "默认情况下,如果可能,PHP 会将错误类型的值强制转换为预期的标量类型。"

php <?php declare(strict_types=1);

【讨论】:

我相信这就是我想要的。谢谢。仍在运行测试。 请注意,不幸的是,这不适用于通过反射调用的任何内容。我使用反射方法并从另一个类传递参数,严格类型没有效果。【参考方案2】:

问题在于 PHP 具有对原语的自动转换。他们很长一段时间都没有改变这一点,可能是出于哲学原因。这就是为什么以前在 PHP 中禁止使用原始类型提示的原因:https://bugs.php.net/bug.php?id=29508

由于 PHP 具有自动转换功能,您应该这样做以确保:

class Test
    function something($test)
       if(!is_bool($test)) 
            throw new InvalidArgumentException("Boolean expected.");
       
    

编辑:阅读以下关于 PHP 7 中标量类型提示的文章 https://www.phpclasses.org/blog/post/269-PHP-7-Scalar-Type-Hinting-Finally-Approved.html

在 PHP 7 中,最终可以通过添加使包含原始类型检查的代码工作

declare(strict_types=1); 

在文件的开头。

【讨论】:

使其成为 InvalidArgumentException【参考方案3】:

您正在寻找的神奇功能就是这个。把它放在你班级的第一行!

declare(strict_types=1) ;

现在您的代码将如下所示:

<?php
declare(strict_types=1) ;

class Test
    function something(bool $test)
       var_dump($test); // "Second dump"
    


$value = 'test';
var_dump(is_bool($value)); // "First dump"
$test = new Test;
$test->something($value);

现在它会抛出一个错误! http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.strict

在这里查看它的工作原理:https://3v4l.org/eLS1T

最后一点,您需要根据每个文件

进行设置

【讨论】:

以上是关于PHP 7 Bool 类型提示不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的类型不起作用? (使用类型 'a pred = 'a -> bool)

__init__ 中的 Pycharm 类型提示不起作用

搜索栏在 swift 3 中不起作用。无法将类型 (_) -> Bool 的值转换为预期的参数类型 NSPredicate

php设置根本不起作用

ajax 后引导程序中的工具提示不起作用

- (BOOL)loadShaders 方法对我不起作用