如何创建互不相同的PHP匿名类?
生成独立的PHP匿名类实例
PHP中,同一函数内定义的匿名类会被视为同一个类——因为PHP在编译阶段就根据代码结构确定了匿名类的唯一标识。要生成结构相同但类名不同的匿名类,核心是让每次的类定义存在细微的唯一差异,让PHP识别为不同的类。
解决方案:动态生成带唯一标识的匿名类
可以通过eval()动态生成包含唯一常量的匿名类,每次调用都会创建全新的类:
function createUniqueTestClass($test) { // 用静态计数器生成唯一标识 static $classCounter = 0; $uniqueId = ++$classCounter; // 动态生成匿名类定义,加入唯一常量 return eval(" return new class(\$test) { public function __construct(public \$test) {} // 唯一常量让PHP识别为不同类 private const UNIQUE_CLASS_ID = {$uniqueId}; }; "); } // 测试验证 function compare($a, $b) { var_dump([ $a == $b, $a === $b, get_class($a) == get_class($b), ]); } compare(createUniqueTestClass(1), createUniqueTestClass(1)); // 输出: bool(true), bool(false), bool(false) compare(createUniqueTestClass('abc'), createUniqueTestClass(1)); // 输出: bool(false), bool(false), bool(false)
原理说明
PHP的匿名类唯一性由代码结构和内容决定,只要类定义中有唯一的元素(比如不同的常量值、专属注释),PHP就会为其生成不同的类名。通过静态计数器生成唯一ID并注入到类定义中,就能确保每次调用都产生独立的匿名类,满足测试时基于::class校验的需求。
如果需要实现特定接口,只需在动态生成的类中添加接口实现即可:
interface TestInterface { public function getRandomString(): string; } function createUniqueInterfaceClass() { static $classCounter = 0; $uniqueId = ++$classCounter; return eval(" return new class implements TestInterface { public function getRandomString(): string { return uniqid(); } private const UNIQUE_CLASS_ID = {$uniqueId}; }; "); } // 生成50个不同类的实例 $instances = []; for ($i = 0; $i < 50; $i++) { $instances[] = createUniqueInterfaceClass(); } // 验证所有类名都不同 $classNames = array_map(fn($obj) => get_class($obj), $instances); var_dump(count(array_unique($classNames)) === 50); // bool(true)
内容的提问来源于stack exchange,提问作者LordF
相关产品推荐
相关产品推荐

