使用===对两个数组(或对象)判等

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
error_reporting(-1);

/**
 * 打印变量的相关信息
 *
 * @param mixed $value 要打印的表达式
 * @param mixed ...$values 更多要打印的表达式
 * @return void echo
 */
function v(mixed $value, mixed ...$values): void
{
    ob_start(); // 打开输出控制缓冲
    var_dump($value);
    echo ob_get_clean(); // 从缓冲区获取var_dump()的内容,然后清空缓冲区

    foreach ($values as $v) {
        v($v); // 递归
    }
}


$array1 = ['num1' => 1, 'num2' => 0, 'num3' => 2, 'num4' => 4];
$array2 = ['num1' => 1, 'num2' => 0, 'num3' => 2, 'num4' => 4];
v($array1 === $array2); // bool(true)
unset($array1, $array2);


$array1 = ['num1' => 1, 'num2' => 0, 'num3' => 2, 'num4' => 4];
$array2 = ['num2' => 0, 'num1' => 1, 'num3' => 2, 'num4' => 4];
v($array1 === $array2); // bool(false)
unset($array1, $array2);
// 说明:虽然两个数组包含的键值对是一样的,但由于元素顺序不同,所以也不相等。


//========== 总结 ==========//
// 1、使用===对两个数组进行判等时,两者的键值对必须完全一致(包括元素顺序)才算相等。
//    如果想忽略元素顺序的影响,可以按键名排序后再进行判等。



<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
error_reporting(-1);

/**
 * 打印变量的相关信息
 *
 * @param mixed $value 要打印的表达式
 * @param mixed ...$values 更多要打印的表达式
 * @return void echo
 */
function v(mixed $value, mixed ...$values): void
{
    ob_start(); // 打开输出控制缓冲
    var_dump($value);
    echo ob_get_clean(); // 从缓冲区获取var_dump()的内容,然后清空缓冲区

    foreach ($values as $v) {
        v($v); // 递归
    }
}

/**
 * Human
 */
class Human
{
    protected string $name;
    protected string $gender;
    protected int $birth;

    public function __construct(string $name, string $gender, int $birth)
    {
        $this->name = $name;
        $this->gender = $gender;
        $this->birth = $birth;
    }
}


$human1 = new Human('张三', '男', 2003);
$human2 = new Human('张三', '男', 2003);
v($human1 === $human2); // bool(false)


$human3 = clone $human1;
v($human1 === $human3); // bool(false)


$human4 = &$human1;
v($human1 === $human4); // bool(true)


//========== 总结 ==========//
// 1、两个对象之间判等比较的是地址,而不是值,所以即便是克隆对象和母体对象也是不相等的,因为克隆的本质是创建了一个新对象,
//    只是克隆对象的属性值设置成了和母体对象一样而已。

Copyright © 2024 码农人生. All Rights Reserved