今天说说PHP的布尔类型,布尔类型只有两个值,就是false和true。
布尔类型跟PHP中的string 和int|float类型是可以自动转化的,看以下例子。
class BoolTest1
{
public function getBoolFromNull(null $a): bool{
return (bool)$a;//必须加上强制转换,否则报错
}
public function getBoolFromInt(int $a): bool{
return $a;
}
public function getBoolFromString(string $a): bool{
return $a;
}
public function getBoolFromArray(array $a): bool{
return (bool)$a; //必须加上强制转换,否则报错
}
public function getBoolFromObject(object $a): bool{
return (bool)$a; //必须加上强制转换,否则报错
}
public function getBoolFromCallable(object $a): bool{
return (bool)$a; //必须加上强制转换,否则报错
}
}
$boolTest = new BoolTest1();
var_dump($boolTest->getBoolFromNull(null));// 输出 false
var_dump($boolTest->getBoolFromInt(0));// 输出 false
var_dump($boolTest->getBoolFromInt(5));// 输出 true
var_dump($boolTest->getBoolFromString(''));// 输出 false
var_dump($boolTest->getBoolFromString('abc'));// 输出 true
var_dump($boolTest->getBoolFromArray([]));// 输出 false
var_dump($boolTest->getBoolFromArray([1, 2]));// 输出 true
var_dump($boolTest->getBoolFromObject(new stdClass()));// 输出 true
var_dump($boolTest->getBoolFromCallable(function ($b) {return $b;}));// 输出 true
那如果从其他类型转成bool,道理也是一样,看以下例子:
//其他类型转城bool
class BoolTest2
{
public function getBool(int|float|string $a): bool{
return $a;
}
public function getBoolFromOther(array|object|callable $a): bool{
return (bool)$a;
}
}
$boolTest2 = new BoolTest2();
var_dump($boolTest2->getBool(0));// 输出 false
var_dump($boolTest2->getBool(22));// 输出 true
var_dump($boolTest2->getBool(''));// 输出 false
var_dump($boolTest2->getBool('aaa'));// 输出 true
var_dump($boolTest2->getBoolFromOther([])); // 输出 false
var_dump($boolTest2->getBoolFromOther([1,2])); // 输出 true
var_dump($boolTest2->getBoolFromOther(function (){})); // 输出 true
PHP8.2中bool类型的false和true可以当成单独的类型应用,看以下例子:
class BoolTest3
{
//false单独类型public function getFalseOrInt(int|false $a): int|false{
return $a;
}
//true单独类型public function getTrueOrInt(int|true $a): int|true{
return $a;
}
}
$boolTest3 = new BoolTest3();
//false单独类型
//var_dump($boolTest3->getFalseOrInt(null)); //报错
var_dump($boolTest3->getFalseOrInt(3)); //输出 3
//var_dump($boolTest->getFalseOrInt('')); //报错
var_dump($boolTest3->getFalseOrInt(true)); //输出 1
var_dump($boolTest3->getFalseOrInt(false)); //输出 false
//true单独类型
var_dump($boolTest3->getTrueOrInt(3)); //输出 3
//var_dump($boolTest->getFalseOrInt('')); //报错
var_dump($boolTest3->getTrueOrInt(true)); //输出 true
var_dump($boolTest3->getTrueOrInt(false)); //输出 0
那可能有人会问,什么情况下,会单独返回false呢,比如redis或memcache在取值时候,如果key不存在,大部分情况下都返回false,实际情况下这种情况也非常常见,大家注意一下就行。
在定义类成员时,尽量标上数据类型,一但标上数据类型,必须得初始化,才能调用,否则会报错致命错误,看以下例子:
class BooTest4
{
protected bool $b;
public function setB(bool $b): static{
$this->b = $b;
return $this;
}
public function getB(): bool{
return $this->b;
}
}
$boolTest4 = new BooTest4();
//var_dump($boolTest4->getB()); //报错
$boolTest4->setB(true);
var_dump($boolTest4->getB());
当然也可以在构造方法里,直接初始化,如果应用场景是这样的话,看以下例子:
class BooTest5
{
public function __construct(protected bool $b) {}
public function getB(): bool{
return $this->b;
}
}
$boolTest4 = new BooTest5(false);
var_dump($boolTest4->getB()); //输出 false
bool的转换可以用两种方式,没有什么区别,看大家喜欢
//boll转换
var_dump((bool)[]); // 输出 false
var_dump((boolval('abc'))); // 输出 true
判断的话用is_bool函数,看以下代码:
//判断bool
var_dump((is_bool(false))); // 输出 true
var_dump((is_bool(true))); // 输出 true
var_dump((is_bool('false'))); // 输出 false
var_dump((is_bool(null))); // 输出 false
var_dump((is_bool([]))); // 输出 false
var_dump((is_bool(new stdClass()))); // 输出 false
PHP8的布尔类型,就讲这么多,只是些基础知识。
代码放在github上: https://github.com/leo-up/php-study/blob/master/base/bool.php