You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建互不相同的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:42:15