通用空类(stdClass)的使用

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

/**
 * Human类(继承stdClass类)
 */
class Human extends stdClass
{
}

$obj = new stdClass();
$obj->name = '张三'; // 动态属性name
$obj->gender = '男'; // 动态属性gender
$obj->birth = 2008;  // 动态属性birth
var_dump($obj);
// object(stdClass)#2 (3) { ["name"]=> string(6) "张三" ["gender"]=> string(3) "男" ["birth"]=> int(2008) }

$human = new Human(); // 重要提醒:由于Human类继承了stdClass类,所以下面使用动态属性也不会报Deprecated错误
$human->name = '李四';
$human->gender = '女';
$human->birth = 2009;
var_dump($human);
// object(Human)#3 (3) { ["name"]=> string(6) "李四" ["gender"]=> string(3) "女" ["birth"]=> int(2009) }


//========== 总结 ==========//
// 1、stdClass类是一个没有属性也没有方法的空类,该类最大的特点是允许使用动态属性,而自定义类使用动态属性会报Deprecated错误。
// 2、自定义类可以继承stdClass类,而且会继承其动态属性的功能,这样自定义类使用动态属性就不会报Deprecated错误了。
// 3、如果自定义类不想继承stdClass类,但又想使用动态属性不报错,那么可以在定义类时使用“#[\AllowDynamicProperties]”注解。
// 4、动态属性是把双刃剑,它能让代码变得灵活,但也会降低代码可读性和可维护性。一般情况下不推荐使用动态属性,应该尽量显式声明属性。

Copyright © 2024 码农人生. All Rights Reserved