<?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