基本的にプロパティのオーバーロードに要約されるPHPからいくつかのコードを移植しようとしています。つまり、実際にはクラスの一部として定義されていないクラス プロパティを取得または設定しようとすると、その情報が関数に送られ、その情報を使ってほとんどの処理が行われます。(この場合は諦める前に連想配列をクラス内で検索したい。)
ただし、Perl は... クラスが既にハッシュであることを考えると、PHP とはかなり異なります。実際にプロパティを取得または設定しようとするものに対して透過的に、そのパッケージに完全にカプセル化されたままになるPerlの「クラス」__get()
と同等のものを適用できる方法はありますか?__set()
編集:これを説明する最良の方法は、コードを表示し、出力を表示してから、出力したいものを表示することです。
package AccessTest;
my $test = new Sammich; #"improper" style, don't care, not part of the question.
say 'bacon is: ' . $test->{'bacon'};
say 'cheese is: ' . $test->{'cheese'};
for (keys $test->{'moreProperties'}) {
say "$_ => " . $test->{'moreProperties'}{$_};
}
say 'invalid is: ' . $test->{'invalid'};
say 'Setting invalid.';
$test->{'invalid'} = 'true';
say 'invalid is now: ' . $test->{'invalid'};
for (keys $test->{'moreProperties'}) {
say "$_ => " . $test->{'moreProperties'}{$_};
}
package Sammich;
sub new
{
my $className = shift;
my $this = {
'bacon' => 'yes',
'moreProperties' => {
'cheese' => 'maybe',
'ham' => 'no'
}
};
return bless($this, $className);
}
これは現在出力します:
bacon is: yes
Use of uninitialized value in concatenation (.) or string at ./AccessTest.pl line 11.
cheese is:
cheese => maybe
ham => no
Use of uninitialized value in concatenation (.) or string at ./AccessTest.pl line 17.
invalid is:
Setting invalid.
invalid is now: true
cheese => maybe
ham => no
ここで、最初の AccessTest パッケージにはまったく変更を加えずに、Sammich のみに変更を加える必要があります。これにより、次のようになります。
bacon is: yes
cheese is: maybe
cheese => maybe
ham => no
invalid is: 0
Setting invalid.
invalid is now: true
cheese => maybe
ham => no
invalid => true
ご覧のとおり、望ましい効果は、'cheese' プロパティがテスト オブジェクトの一部ではないため、'moreProperties' ハッシュから取得されることです。「無効」は同じことを試みますが、直接のプロパティでも「moreProperties」でもないため、プログラムされた方法で動作します。この場合、エラーや警告。「無効な」プロパティを設定しようとすると、オブジェクトにまだ追加されていないため、オブジェクトに直接追加されませんが、代わりに「moreProperties」ハッシュに追加されます。
これには、PHP で必要な 6 行程度よりも多くの行が必要になると予想していますが、これは OOP の非常に重要な概念であるため、Perl が何らかの形で処理することを完全に期待しています。