我想弄清楚bless
在perl中做了什么 - 阅读完他们的文档后 - 我不是很清楚。如果我错了,请纠正我,它允许在类或对象中创建属性吗?
有人编码了这段代码
package Main::Call;
sub new
{
my ($class, $call) = @_;
my $self = $call;
bless($self, $class);
return $self;
}
例如:
if (($statement = $db->prepare($sql)) && $statement->execute())
{
while (my $rt = $statement->fetchrow_hashref())
{
my $obj = Main::Call->new($rt);
push @reserv_call_objs, $obj;
}
return \@reserv_call_objs;
}
我正在尝试将其转换为PHP。
所以我假设它会是这样的?
class Call {
public function __construct($arr) {
foreach($arr as $key => $value)
{
$this->$value = '';
}
}
public function __set($key, $value) {
$this->$key = $value;
}
}
答案 0 :(得分:2)
bless
函数将类与引用相关联。也就是说,只要它是一个引用类型,你传递给new
函数的东西就会成为Main::Call
类的一个对象。您可以传入列表引用,它将成为一个对象。您可以传入标量引用,它将成为一个对象。
在PHP中无法做同样的事情,但是当您将哈希引用传递给new
时,您的尝试接近于模仿案例。
答案 1 :(得分:2)
Perl有一个不寻常的对象模型:一个对象是一个被“祝福”成一个类的引用。 bless
只是注释引用,以便可以在引用时调用方法。
my $data = 1;
my $ref = \$data; # the reference can be of any type
$ref->foo; # this would die: Cannot call method "foo" on unblessed reference
bless $ref => 'Foo'; # *magic*
$ref->foo; # now this works
package Foo;
sub foo { print "This works\n" }
但通常引用只能在class'es构造函数中得到祝福。
Perl没有规定对象应该如何存储其数据。最常用的方法是使用哈希引用。此new
与您的PHP __construct
类似:
sub new {
my ($class, %init) = @_;
return bless \%init => $class;
}
可以像Foo->new(key => $value, ...)
一样调用。
你的Perl new
所做的是相当不寻常的:它将给定的参数保存到适当的类中。这假定$call
已经是参考。如果某个包中已$call
已被祝福,则会将其重新加入此$class
。
将其转换为PHP的最明智的方法是将$call
填充到实例的属性中,大致与您一样。