我有点难以接受标量类型提示问题(PHP7应该能够处理)。基本上,我创建一个bool
类型提示的方法只允许传递布尔值。然而它失败了,并让其他类型的字符串传递。我相信过去这对我有用。以该片段为例。第一个转储导致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)
答案 0 :(得分:3)
您必须在文件中声明严格输入 [1],以强制PHP不执行类型强制 [2]。
[1] - http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.strict
[2] - &#34;默认情况下,如果可能,PHP会将错误类型的值强制转换为预期的标量类型。&#34;
php
<?php
declare(strict_types=1);
答案 1 :(得分:1)
问题在于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);
在文件的开头。
答案 2 :(得分:1)
您正在寻找的神奇功能就是这个。把它放在你班上面的第一行!
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
最后一点,您需要在每个文件
上设置此项