【问题标题】:Perl 'bless' to PHP?Perl 对 PHP 的“祝福”?
【发布时间】:2014-01-19 09:49:15
【问题描述】:

我试图弄清楚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;
 }

}

【问题讨论】:

    标签: php perl oop bless


    【解决方案1】:

    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" }
    

    但通常引用只能在类的构造函数中得到祝福。

    Perl 并没有规定一个对象应该如何存储它的数据。最常见的方法是使用哈希引用。这个new 类似于你的PHP __construct

    sub new {
      my ($class, %init) = @_;
      return bless \%init => $class;
    }
    

    可以像 Foo->new(key => $value, ...) 这样调用。

    你的 Perl new 所做的很不寻常:它将给定的参数祝福到适当的类中。这假定 $call 已经是一个引用。如果$call 已经被加持到某个包中,那么它会被重新加持到这个$class 中。

    将其转换为 PHP 的最明智的方法是将 $call 填充到实例的属性中,大致就像您所做的那样。

    【讨论】:

    • $call 是从 $statement->fetchrow_hashref() 获取的
    • 更新了我的问题 $call 发生了什么
    【解决方案2】:

    bless 函数将类与引用相关联。也就是说,你传递给new 函数的任何东西都将成为Main::Call 类的对象,只要它是一个引用类型。你可以传入一个列表引用,它就变成了一个对象。你可以传入一个标量引用,它就变成了一个对象。

    没有办法在 PHP 中做完全相同的事情,但是当您将哈希引用传递给 new 时,您的尝试接近于模拟这种情况。

    【讨论】:

    • Nit:类实际上与被引用的变量相关联,而不是引用本身。 (也适用于@amon 的回答)
    猜你喜欢
    • 1970-01-01
    • 2014-07-29
    • 2011-05-04
    • 2011-11-14
    • 2011-01-20
    • 2014-01-17
    • 2013-05-04
    • 2011-10-29
    • 2010-09-28
    相关资源
    最近更新 更多