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