今天说说PHP8的null类型,PHP8后,null作为一种单独的类型,还是有很多地方需要注意的,下面一一做说明,看如下代码。
<?php
function testNull(null $a)
{
var_dump($a);
}
testNull(null); //正确
testNull(0); //报错
testNull(1.22); //报错
testNull(''); //报错
testNull(false); //报错
testNull([]); //报错
testNull(new stdClass()); //报错
testNull(fopen('/Users/leo/code/php/php-study/hello_world.php')); //报错
testNull(function () {echo '111';}); //报错
编译器会报如下错误:
null作为一种独立的数据类型,是不会跟其他任何类型做转换的,如果说有null的参数或函数返回,一定要标上null类型,标记方式有两种,一种是在变量前加上?,当只有一种数据类型时可这么写,当多余一种时,只能标记null,代码如下,一看便知。
function test(?int $a, int|float|null $b): int|float
{
return $a + $b;
}
echo test(null, 2.5) . "\n"; //输出 2.5
echo test(1, 2.5) . "\n"; //输出 3.5
echo test(1, 4) . "\n"; //输出 5
一个简单的例子,基本就明白其用法和含义,还有一个点要注意的是在做跟null比较的时候,一定要用===,否则就会发生错误,举一些例子,一看就能明白,看如下代码:
var_dump(null === 0); // 输出 false
var_dump(null == 0); // 输出 true
var_dump(null === ''); // 输出 false
var_dump(null == ''); // 输出 true
var_dump(null === 0.0); // 输出 false
var_dump(null == 0.0); // 输出 true
var_dump(null === false); // 输出 false
var_dump(null == false); // 输出 true
var_dump(null === []); // 输出 false
var_dump(null == []); // 输出 true
还有一点我也在这解释下,在类方法或函数中可以返回void,这个跟null是不同的,void的指的是没有返回任何类型,而null是一种数据类型,这点也别搞错,看以下代码:
function testNullVoid1(int &$a): void
{
$a = $a * $a;
}
function testNullVoid2(int &$a): void
{
if (!$a) {
return;
}
$a = $a * $a;
}
function testNullVoid3(int &$a): void
{
if (!$a) {
return null; // 报错
}
$a = $a * $a;
}
函数testNullVoid3就会报编译错误,错误如下:
null这个类型是不区分大小写的,看个人习惯,我习惯用小写,看如下代码:
var_dump(null); // 输出 NULL
var_dump(NULL); // 输出 NULL
var_dump(Null); // 输出 NULL
可以简单的用is_null来判断一个变量是否为null值
var_dump(is_null(null)); // 输出 true
var_dump(is_null(false)); // 输出 false
var_dump(is_null('')); // 输出 false
var_dump(is_null(0)); // 输出 false
PHP8以后,绝大多数内置方法都不建议传进去null参数,虽说代码还能正常运行,只会报deprecated错误,但是如果现在不注意,以后大版本升级的时候,真的要改死人,所以在代码测试中,看到deprecated的问题,最好一起修掉。
var_dump(trim(null)); // deprecated error, 输出 ""
var_dump(ucfirst(null)); // deprecated error, 输出 ""
var_dump(strtolower(null)); // deprecated error, 输出 ""
关于null类型,目前就想到这些,以后如果还有想起的,我会补充。
代码放在github上: https://github.com/leo-up/php-study/blob/master/base/null.php