PHP Match如何准确地评估条件?

z6psavjg  于 2023-10-15  发布在  PHP
关注(0)|答案(2)|浏览(89)

我尝试使用这段代码来打印一个基于$num变量值的文本,但是当我给它分配一个非数字值时,输出就像我分配了一个正数,这里的输出不应该是'Undefined Value'吗?我是说为什么不执行默认情况?

$num = ";";
match (true) {
    $num < 0 => print 'negative number',
    $num == 0 => print 'zero',
    $num > 0 => print 'positive number',
    default => 'Undefined Value',
};
//Output: positive number
kr98yfug

kr98yfug1#

我是这样做的,它起作用了:

$num = ";";
    is_numeric($num) ? match (true) {
    $num < 0 => print 'negative number',
    $num == 0 => print 'zero',
    $num > 0 => print 'positive number',
    }
    : print "Undefined Value";
    //Output: Undefined Value
b4wnujal

b4wnujal2#

一个简单的测试案例:

var_dump(';' > 0);
bool(true)

演示
如果我们检查比较运算符是如何工作的,我们可以理解这两个运算符都被转换为数字,但从PHP/8.0开始就不再是这样了:

var_dump(';' > 0, (int)';', (int)';' > 0, (float)';', (float)';' > 0);
bool(true)
int(0)
bool(false)
float(0)
bool(false)

Demo
我怀疑文档需要修复,目前的规则是右侧运算符转换为字符串。因此,;在ASCII中是3B030(因此“较小”)。
关于你的代码,你可以添加一个像这样的数字检查:

match (true) {
    is_numeric($num) && $num < 0 => print 'negative number',
    is_numeric($num) && $num == 0 => print 'zero',
    is_numeric($num) && $num > 0 => print 'positive number',
    default => 'Undefined Value',
};

但是也许(记住这是非常主观的)匹配表达式并没有为这个用例提供最精简的语法,而好的旧if/else集也可以很好地工作。您可以轻松地调用is_numeric()一次,并避免IEEE精度错误:

if (!is_numeric($num)) {
    print 'Undefined Value';
} elseif ($num < 0) {
    print 'negative number';
} elseif ($num > 0) {
    print 'negative number';
} else {
    print 'zero';
}

相关问题