【问题标题】:PHP 7 Bool Type Hint Not WorkingPHP 7 Bool 类型提示不起作用
【发布时间】: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 我没有。不知道在哪里启用它。生病谷歌那个。会及时通知您。

标签: php oop type-hinting


【解决方案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

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

进行设置

【讨论】:

    猜你喜欢
    • 2013-07-21
    • 2016-06-26
    • 2016-08-01
    • 2018-03-31
    • 2015-12-14
    • 2016-09-12
    相关资源
    最近更新 更多