跳轉到內容

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

進一步閱讀

[編輯 | 編輯原始碼]


上一頁:程式碼重用(模組) 索引 下一頁:結構和風格
華夏公益教科書