PHP Reflection如何识别getConstructor返回构造函数的所属类
区分ReflectionClass::getConstructor()返回构造函数所属类的方法
核心实现逻辑为对比构造函数的声明类与当前反射类的名称是否一致,具体操作步骤如下:
- 调用
ReflectionClass::getConstructor()获取目标类的构造函数实例,类型为ReflectionMethod - 调用构造函数实例的
getDeclaringClass()方法,获取该方法实际声明所在类的反射实例 - 对比声明类的名称和当前反射的目标类名称:二者一致则构造函数为子类自有,不一致则继承自父类
代码示例
class ParentClass { public function __construct() {} } // 未定义构造函数的子类 class ChildNoConstructor extends ParentClass {} // 定义了自有构造函数的子类 class ChildHasConstructor extends ParentClass { public function __construct() { parent::__construct(); } } // 测试无自有构造函数的子类 $refNoCons = new ReflectionClass(ChildNoConstructor::class); $consNo = $refNoCons->getConstructor(); $isOwn1 = $consNo->getDeclaringClass()->getName() === $refNoCons->getName(); // $isOwn1 结果为 false,说明构造函数来自父类 // 测试有自有构造函数的子类 $refHasCons = new ReflectionClass(ChildHasConstructor::class); $consHas = $refHasCons->getConstructor(); $isOwn2 = $consHas->getDeclaringClass()->getName() === $refHasCons->getName(); // $isOwn2 结果为 true,说明构造函数为子类自有
注意:使用前需先判断
getConstructor()返回值不为null,避免目标类无构造函数时调用方法报错。
内容的提问来源于stack exchange,提问作者Bernievv
相关产品推荐
相关产品推荐

