2

私はblessperl で何をするのかを理解しようとしています - 彼らのドキュメントを読んだ後 - 私はあまり明確ではありません. 間違っている場合は修正してください。クラスまたはオブジェクトにプロパティを作成できますか?

誰かがこのコード ブロックをコーディングしました

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

}
4

2 に答える 2

2

このbless関数は、クラスを参照に関連付けます。つまり 、参照型である限り、new関数に渡すものはすべてクラスのオブジェクトになります。Main::Callリスト参照を渡すと、それがオブジェクトになります。スカラー参照を渡すと、それがオブジェクトになります。

PHP でまったく同じことを行う方法はありませんが、ハッシュ参照を に渡す場合のエミュレートに近づいていますnew

于 2014-01-02T00:21:22.257 に答える
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" }

しかし、通常、参照はクラスのコンストラクター内でのみ bless されます。

Perl は、オブジェクトがそのデータを格納する方法を指示しません。最も一般的な方法は、ハッシュ参照を使用することです。これnewはあなたの PHP に似ています__construct:

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

のように呼び出すことができますFoo->new(key => $value, ...)

あなたの Perlnewが行うことはかなり変わっています: 指定された引数を適切なクラスに祝福します。$callこれは、がすでに参照されていることを前提としています。がすでに何らかのパッケージに bless されている場合は、$callこの に再度 bless されます$class

それを PHP に変換する最も適切な方法は$call、大まかにあなたが行ったように、インスタンスのプロパティに を詰め込むことです。

于 2014-01-02T00:23:27.703 に答える