让我们假设我有class1,由oo :: class create
创建oo::class create class1 {
method bar {} {
class2 create bee
bee method1
}
}
现在,让我们说我有这段代码:
class1 create po
po bar
po destroy
我是否也在破坏po内的实例蜜蜂,或者我是否也应该明确销毁po :: bee?
谢谢。
答案 0 :(得分:1)
bee
是在class1
实例的名称空间中创建的,当实例被销毁时,名称空间将被删除,bee
也会被删除。
所以你不需要显式地销毁它,但是如果你处理你想要消失的其他命名空间中的实例,你可以将它设置为在析构函数中自动发生:
oo::define class1 destructor {bee destroy}
如果想要一个方法来创建在销毁创建实例时不销毁的实例,则要么在另一个命名空间中为创建的实例指定名称,例如::bee
,或者让方法返回class2 new
的结果,将其称为set cee [po bar]
。新实例可用作$cee
方法arg ...
文档: oo::define, oo::object
答案 1 :(得分:1)
create
oo::class
方法更倾向于解析它正在创建的对象的名称,而不是当前命名空间(即,如果它们不是绝对名称)。这意味着当您在具有非限定名称的另一个对象的方法内调用它时,它创建的对象将放在另一个对象中。 (您可以通过检查create
方法的结果来验证这一点,oo::class create Inner {
destructor {
puts "Hi from an Inner"
}
}
oo::class create Outer {
method makeAnInner {} {
puts [Inner create in]
}
destructor {
puts "Hi from an Outer"
}
}
Outer create out
out makeAnInner
out destroy
方法是普通类的创建对象的完全限定名称。)反过来,这意味着当外部对象被销毁时,内部对象当删除外部对象的实例名称空间并且其中的命令被终止时,也将销毁它。
让我们通过使用一些简单的类来演示:
destroy
打印出类似(命名空间名称将变化)的内容:
::oo::Obj19::in Hi from an Outer Hi from an Inner
但是,通常更好地直接调用内部对象的*/15 * * * * /usr/bin/php /var/www/mose-base/bin/console beanstalk:worker:start --one-check 2>&1 | mail -s "mysql_dump" example@mail.example
方法,因为在析构函数中发生的任何错误都不会被丢弃。 (使用其他销毁方案,当前的内部API无法以各种丑陋的原因安全地保留错误报告,特别是因为这也是在发生更广泛的删除时使用的删除路由。)