PHP数据类型之bool

132
0
0
2024-05-11 09:50
最后编辑于2024-05-19 15:09

今天说说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

博主信息
博客数
155
昵称
性别
年龄
39
居住城市
上海市