PHP 7.2 不提供运行时类结构自动校验机制,仅能通过 ReflectionClass 手动读取方法、属性等结构信息,无法自动比对或强制契约;需结合 instanceof、interface_exists 及手动签名检查实现模拟验证。

PHP 7.2 本身不提供运行时类结构“校验”机制,只能靠反射(ReflectionClass)读取结构,无法自动比对或强制契约。 它不支持像 TypeScript 那样的接口实现检查,也不在运行时拦截缺失方法/属性——除非你手动写逻辑。
用 ReflectionClass 读取类的公开结构
这是最直接、最常用的方式。它能告诉你一个类有哪些方法、属性、接口、父类,但不会告诉你“是否符合预期”,只负责“如实汇报”。
-
getMethods()返回所有(或指定可见性)的ReflectionMethod对象,可进一步调用getName()、getNumberOfParameters()、hasReturnType()等 -
getProperties()同理,可查isPublic()、isStatic()、getDefaultValue() -
getInterfaces()和getParentClass()能确认继承关系 - 注意:
ReflectionClass只反映已加载类的定义,不执行任何校验逻辑
判断是否实现某个接口或继承某个类
这不是结构检查,而是类型归属判断——但它是运行时最实用的“契约验证”手段。
- 用
instanceof最快:例如$obj instanceof SomeInterface - 用
class_implements($obj)或class_parents($obj)获取字符串数组,适合动态判断 - 注意:
instanceof在严格模式下仍有效,且不依赖declare(strict_types=1) - 陷阱:如果传入
null或标量,instanceof返回false(不报错),容易被忽略
模拟结构契约:手动检查方法签名
PHP 7.2 没有内置的“接口实现完整性检查”,比如不能自动报错说“你实现了 SomeInterface 却漏了 doSomething()”。必须自己写断言。
立即学习“PHP免费学习笔记(深入)”;
- 先用
interface_exists('SomeInterface')确保接口存在 - 再用
get_class_methods($className)或(new ReflectionClass($className))->getMethods()列出所有 public 方法 - 遍历接口的
getMethods(),逐个检查目标类是否包含同名、同参数数量(可用$method->getNumberOfParameters())、同返回类型($method->getReturnType()返回ReflectionType对象)的方法 - ⚠️ 注意:
getReturnType()在 PHP 7.2 中仅对声明了返回类型的函数有效;未声明则返回null,不能当作“无返回类型”来比较
为什么不能依赖自动结构检查?
PHP 的设计哲学是“运行时宽松”,即使启用了 declare(strict_types=1),它也只管函数调用时的参数/返回值类型,不管类有没有某个方法、属性是否可写、接口是否被完整实现。
-
strict_types不影响类结构,只影响函数调用和返回值的类型匹配 -
object类型提示只保证“是对象”,不保证“是哪个类或实现了什么” - 真正可靠的结构约束,得靠单元测试 + 静态分析工具(如 PHPStan level 6+),而不是运行时
- 最容易被忽略的一点:
ReflectionClass查不到 private 属性的默认值(getDefaultValue()会抛出异常),也查不到 trait 中未被当前类显式覆盖的方法细节



















