为什么在空返回 1 个元素时爆炸


Why does explode on null return 1 element?

var_dump(count(explode(',',[]))); // 0
var_dump(count(explode(',',''))); // 1
var_dump(count(explode(',',null))); // 1 ????

我期待最后一个是 0。有人可以告诉我为什么从null爆炸是 1 而不是 0?(PHP 5.6.16(

explode按照

规范将字符串作为其第二个参数。你给它一个null,所以在explode逻辑运行之前,PHP 将null转换为字符串。每个函数都是这样操作的:如果参数与正式规范不匹配,PHP 会尝试"类型杂耍",直到它们匹配为止。如果PHP可以玩杂耍,引擎马达会快乐地运转,否则你会在手腕上得到一个微弱的耳光:

PHP 警告:explode(( 期望参数 2 是字符串,对象在文件中给出.php在第 1 行

PHP 将 null 处理为字符串的方式很简单:null := '' .因此,由于类型杂耍,使用 null 的调用和带有 '' 的调用在语义上是等效的,如下所示:

$a = explode(',', '');
$b = explode(',', null);
var_dump($a === $b); // true
$a = count(explode(',', ''));
$b = count(explode(',', null));
var_dump($a === $b); // true

所以现在你可能会问:为什么 PHP 在空字符串上爆炸时返回一个单元素数组?这也是按规范的:

如果分隔符包含字符串中未包含的值...将返回一个包含字符串的数组。

作为解决方法,请使用

array_filter(explode(',', $myvar));

然后你得到一个空数组,count()将返回 0。请注意,当$myvar == ''