一键导入
php-class-state-sharing-pattern
类声明和函数状态共享的正确模式。确保类状态数据存储在类中,方法通过instance字段访问实例状态。用于避免RecursiveDirectoryIterator等类实现中的常见错误。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
类声明和函数状态共享的正确模式。确保类状态数据存储在类中,方法通过instance字段访问实例状态。用于避免RecursiveDirectoryIterator等类实现中的常见错误。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Ensure that when implementing or modifying PHP runtime or std/php functions in the Origami project, the agent always creates a minimal PHP test script under tests/php/ and executes it via the Origami runner (go run ./zy.go ...) to verify behavior end-to-end.
PHP函数参数和变量列表处理规范。涵盖单个参数、多个参数、引用参数、AST参数等不同类型参数的正确处理方式。用于函数实现和补充时的标准化处理。
Describe how functions are represented, registered, and executed in Origami (user functions and built-ins). Use when the user asks about function behavior, parameters, returns, generators, or wants to update function-related documentation.
Document the execution container (VM), request-level TempVM, and parser-level sub-interpreters (statement parsers) in the Origami PHP runtime. Use when the user asks about the interpreter design, runtime container, or wants to update related documentation.
Document function parameter type syntax and data.Types constraints in the Origami runtime. Use when the user asks about parameter types, union/nullable types, or data package type rules, or wants to update related documentation.
| name | php-class-state-sharing-pattern |
| description | 类声明和函数状态共享的正确模式。确保类状态数据存储在类中,方法通过instance字段访问实例状态。用于避免RecursiveDirectoryIterator等类实现中的常见错误。 |
类的状态数据应该直接存储在类结构体中,方法通过持有instance引用访问和修改状态。
type RecursiveDirectoryIteratorClass struct {
node.Node
files []string // 状态数据直接存储在类中
pos int
path string
}
// 方法结构体必须持有instance字段
type RecursiveDirectoryIteratorConstruct struct {
instance *RecursiveDirectoryIteratorClass // 这是正确的设计!
}
func (m *RecursiveDirectoryIteratorConstruct) Call(ctx data.Context) (data.GetValue, data.Control) {
// 通过 m.instance 访问和修改类状态
m.instance.path = path
m.instance.pos = 0
m.instance.files = []string{}
// ...
}
func (r *RecursiveDirectoryIteratorClass) GetMethod(name string) (data.Method, bool) {
switch name {
case "__construct":
// 传递当前实例引用给方法 - 这是关键!
return &RecursiveDirectoryIteratorConstruct{instance: r}, true
case "rewind":
return &RecursiveDirectoryIteratorRewind{instance: r}, true
// ...
}
}
data.NewClassValue() 格式的值// ✅ 推荐模式:创建独立实例副本
func (r *MyClass) GetValue(ctx data.Context) (data.GetValue, data.Control) {
clone := &MyClass{
// 复制所有状态字段
stateField: r.stateField,
// ...
}
return data.NewClassValue(clone, ctx.CreateBaseContext()), nil
}
// ⚠️ 特殊情况:简单数据类可直接返回
func (r *SimpleClass) GetValue(ctx data.Context) (data.GetValue, data.Control) {
return data.NewClassValue(r, ctx), nil
}
// 正确的状态克隆实现
func (r *RecursiveIteratorIteratorClass) GetValue(ctx data.Context) (data.GetValue, data.Control) {
// 创建新的实例,每个实例有自己的状态
clone := &RecursiveIteratorIteratorClass{
innerIterator: r.innerIterator,
mode: r.mode,
currentKey: r.currentKey,
currentValue: r.currentValue,
valid: r.valid,
}
return data.NewClassValue(clone, ctx.CreateBaseContext()), nil
}
// 错误:方法无法访问类状态
type RecursiveDirectoryIteratorConstruct struct{}
func (m *RecursiveDirectoryIteratorConstruct) Call(ctx data.Context) (data.GetValue, data.Control) {
// 无法访问类的状态数据!
}
// 错误:状态数据不应该存储在方法中
type RecursiveDirectoryIteratorConstruct struct {
files []string // 错误:状态应该在类中
pos int
path string
}
// 错误:应该返回包装后的值
func (r *RecursiveDirectoryIteratorClass) GetValue(ctx data.Context) (data.GetValue, data.Control) {
clone := &RecursiveDirectoryIteratorClass{...}
return clone, nil // 错误:缺少包装
}
// 错误:不处理ctx.GetIndexValue的返回值
func (m *MyMethod) Call(ctx data.Context) (data.GetValue, data.Control) {
param, _ := ctx.GetIndexValue(0) // 错误:忽略错误
// ...
}
m.instance统一访问状态当实现以下类型的类时应用此模式:
实现类时检查:
instance字段GetMethod是否正确传递实例引用GetValue是否返回data.NewClassValue格式ctx.CreateBaseContext()创建独立上下文Call方法中是否正确处理ctx.GetIndexValue()的错误返回m.instance访问状态