Perl 程式設計/物件
外觀
在 Perl 最初開發時,完全不支援面向物件(OO)程式設計。從 Perl 5 開始,使用 Perl 包(名稱空間)的概念,一個名為bless的運算子,一些魔法變數(@ISA, AUTOLOAD, UNIVERSAL),->和一些支援繼承和封裝的強大約定,添加了 OO 功能。
使用package關鍵字建立物件。在該包中宣告的所有子程式都成為物件或類方法。
類例項是透過呼叫建構函式方法建立的,該建構函式方法必須由類提供,按照慣例,此方法稱為new()
讓我們看看這個建構函式。
package Object;
sub new {
return bless {}, shift;
}
sub setA {
my $self = shift;
my $a = shift;
$self->{a}=$a;
}
sub getA {
my $self = shift;
return $self->{a};
}
客戶端程式碼可以使用這個類,如下所示。
my $o = Object->new;
$o->setA(10);
print $o->getA;
這段程式碼列印 10。
讓我們更詳細地看一下new建構函式
首先,當使用->符號呼叫子程式時,一個新引數會被預先新增到引數列表中。它是一個字串,包含包名或物件引用(Object->new()或$o->setA。在弄懂這一點之前,你會發現 Perl 中的 OO 非常令人困惑。
為了在物件中使用私有變數並進行變數名檢查,你可以使用一種略微不同的方法來建立物件。
package my_class;
use strict;
use warnings;
{
# All code is enclosed in block context
my %bar; # All vars are declared as hashes
sub new {
my $class = shift;
my $this = \do{ my $scalar }; # object is a reference to scalar (inside out object)
bless $this, $class;
return $this;
}
sub set_bar {
my $this = shift;
$bar{$this} = shift;
}
sub get_bar {
my $this = shift;
return $bar{$this};
}
}
現在你有了很好的封裝 - 你不能直接透過$o->{bar}訪問物件變數,只能使用 set/get 方法。也不可能在物件變數名中犯錯誤,因為它們不是雜湊鍵,而是需要宣告的普通 Perl 變數。
我們以與雜湊祝福物件相同的方式使用它們
my $o = my_class->new();
$o->set_bar(10);
print $o->get_bar();
列印10
- perlobj - Perl 物件引用,perldoc.perl.org
- Perl OOP,perltutorial.org