-3

在此处的一个 PHP 片段中在线看到了这一点。

/**
 * @param string $str subject of test for integerness
 * @return bool true if argument is an integer string
 */
function intStr($str) {
    return !!preg_match('/^\d+$/', $str);
}

运行此代码段会产生:

> var_dump( intStr("abc") );
bool(false)

> var_dump( intStr("123") );
bool(true)

问题:

  1. 双感叹号是一个有效的运算符,还是与否定自身的“非非”相同?

  2. 另外,为什么这个运算符与preg_match函数一起使用?

4

3 回答 3

2

preg_match 返回 0 或 1(或错误时为 false),此 intStr 函数旨在返回布尔值。单个!$x首先转换$x为布尔值,然后取反。!!$x只是恢复这个否定,所以它是一种更短的写法(bool)$x

但是,这四个字符的保存会导致可读性下降(以及两个不必要的操作,但可以忽略不计),因此不建议这样做。

这是聪明的代码,但编程中有一条规则:不要聪明

于 2013-03-05T08:44:20.417 回答
0

运行这个简化的函数:

function test($value) {
    return !!$value;
}

测试:

> var_dump( test(1) );
bool(true)

> var_dump( test(0) );
bool(false)

> var_dump( test('1') );
bool(true)

> var_dump( test('0') );
bool(false)

> var_dump( is_bool( test('abc') ) );
bool(true)

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

观察:

使用 . 检查输出is_bool显然,它以某种方式将输出强制转换为boolean

结论:

从 PHP 手册中,

preg_match()如果模式匹配给定的主题,则返回 1,如果不匹配,则返回 0,如果发生错误,则返回 FALSE。

我可以得出结论,这个函数强制返回值是一个布尔值,而不是由preg_match.

于 2013-03-05T08:32:57.577 回答
0

!!等于not not。这意味着这!!'a'会将字符串'a'转换为布尔值,并返回它的倒数。所以,!!preg_match意味着not not preg_match,所以一个有效的 preg_match。

于 2013-03-05T08:37:27.100 回答