Latest web development tutorials

Perl Object-Oriented

Ada dua Perl berbeda untuk melaksanakan pemrograman berorientasi objek:

  • Salah satu pendekatan berbasis tabel anonim hash, esensi dari setiap contoh objek adalah titik referensi ke sebuah tabel hash anonim. Dalam tabel hash anonim ini untuk menyimpan semua properti misalnya.
  • kedua didasarkan pada berbagai cara, dalam definisi kelas, kita akan menciptakan sebuah properti untuk setiap contoh dari array, dan esensi dari setiap contoh objek adalah pointer ke array berturut-turut referensi indeks. Dalam array ini, memori semua properti misalnya.

konsep dasar berorientasi objek

Ada banyak konsep dasar object-oriented, di mana kita menerima tiga: objek, kelas, dan metode.

  • Objek: Objek adalah referensi kelas item data..

  • Kelas: Kelas adalah paket Perl, yang berisi objek untuk menyediakan metode kelas.

  • Metode: Metode ini adalah subroutine Perl, nama kelas adalah argumen pertama.

Perl menyediakan memberkati () fungsi, memberkati digunakan untuk membangun objek melalui referensi dan memberkati nama yang terkait dengan kelas ini, kembali referensi ini untuk membangun sebuah objek.


definisi kelas

Sebuah kelas hanya paket sederhana.

Anda dapat menggunakan paket sebagai kelas, dan menempatkan tas sebagai fungsi dari metode kelas untuk digunakan.

Perl paket menyediakan namespace terpisah, metode paket yang berbeda dan nama variabel tidak bertentangan.

Perl mengajukan kelas ekstensi untuk .pm.

Selanjutnya kita membuat kelas Person:

package Person;

kode kelas jangkauan ke baris terakhir dari file script, atau paket sebelum kata kunci berikutnya.


Membuat dan Menggunakan Objek

Buat contoh kelas (objek) kita perlu mendefinisikan konstruktor, sebagian besar program menggunakan nama kelas sebagai konstruktor, Perl dapat menggunakan nama apapun.

Anda dapat menggunakan berbagai variabel seperti Perl Perl objek. Dalam kebanyakan kasus kita akan menggunakan sebuah array atau hash referensi.

Selanjutnya kita buat konstruktor untuk kelas Person, menggunakan referensi hash Perl.

Bila Anda membuat sebuah objek, Anda perlu menyediakan konstruktor, yang merupakan subrutin yang mengembalikan sebuah referensi obyek.

Contohnya adalah sebagai berikut:

package Person;
sub new
{
    my $class = shift;
    my $self = {
        _firstName => shift,
        _lastName  => shift,
        _ssn       => shift,
    };
    # 输出用户信息
    print "名字:$self->{_firstName}\n";
    print "姓氏:$self->{_lastName}\n";
    print "编号:$self->{_ssn}\n";
    bless $self, $class;
    return $self;
}

Selanjutnya, kita membuat sebuah objek:

$object = new Person( "小明", "王", 23234345);

metode definisi

metode kelas perl saja, tetapi merupakan subroutine Perl, juga dikenal sebagai fungsi anggota.

Berorientasi objek Perl Perl metode definisi tidak menyediakan sintaks khusus, tetapi parameter pertama menentukan metode untuk objek direferensikan atau paket.

Perl tidak menyediakan variabel pribadi, tetapi kita dapat mengelola data objek melalui cara tambahan.

Selanjutnya kita menentukan cara untuk mendapatkan nama:

sub getFirstName {
    return $self->{_firstName};
}

Hal yang sama juga dapat menulis:

sub setFirstName {
    my ( $self, $firstName ) = @_;
    $self->{_firstName} = $firstName if defined($firstName);
    return $self->{_firstName};
}

Selanjutnya, kita memodifikasi file kode Person.pm, sebagai berikut:

#!/usr/bin/perl 

package Person;

sub new
{
    my $class = shift;
    my $self = {
        _firstName => shift,
        _lastName  => shift,
        _ssn       => shift,
    };
    # 输出用户信息
    print "名字:$self->{_firstName}\n";
    print "姓氏:$self->{_lastName}\n";
    print "编号:$self->{_ssn}\n";
    bless $self, $class;
    return $self;
}
sub setFirstName {
    my ( $self, $firstName ) = @_;
    $self->{_firstName} = $firstName if defined($firstName);
    return $self->{_firstName};
}

sub getFirstName {
    my( $self ) = @_;
    return $self->{_firstName};
}
1;

employee.pl kode script adalah sebagai berikut:

#!/usr/bin/perl

use Person;

$object = new Person( "小明", "王", 23234345);
# 获取姓名
$firstName = $object->getFirstName();

print "设置前姓名为 : $firstName\n";

# 使用辅助函数设置姓名
$object->setFirstName( "小强" );

# 通过辅助函数获取姓名
$firstName = $object->getFirstName();
print "设置后姓名为 : $firstName\n";

Setelah menjalankan program di atas, output adalah:

$ perl employee.pl
名字:小明
姓氏:王
编号:23234345
设置前姓名为 : 小明
设置后姓名为 : 小强

mewarisi

metode kelas perl berturut-turut oleh @ISA array, array yang berisi paket-paket lain (kelas) nama, mewarisi variabel harus secara eksplisit ditetapkan.

Multiple inheritance adalah array @ISA terdiri dari sejumlah (paket) nama kelas.

Metode ini hanya dapat diwariskan melalui @ISA, data tidak dapat diwariskan.

Selanjutnya kita buat mewarisi Karyawan kelas Person kelas.

file kode Employee.pm adalah sebagai berikut:

#!/usr/bin/perl

package Employee;
use Person;
use strict;
our @ISA = qw(Person);    # 从 Person 继承

Sekarang kelas karyawan berisi semua metode dan properti dari kelas Person, kita masukkan kode berikut dalam file main.pl dan mengeksekusi:

#!/usr/bin/perl

use Employee;

$object = new Employee( "小明", "王", 23234345);
# 获取姓名
$firstName = $object->getFirstName();

print "设置前姓名为 : $firstName\n";

# 使用辅助函数设置姓名
$object->setFirstName( "小强" );

# 通过辅助函数获取姓名
$firstName = $object->getFirstName();
print "设置后姓名为 : $firstName\n";

Setelah menjalankan program di atas, output adalah:

$ perl main.pl
名字:小明
姓氏:王
编号:23234345
设置前姓名为 : 小明
设置后姓名为 : 小强

metode menimpa

Contoh di atas, kelas karyawan meluas kelas Person, tetapi jika metode kelas Person tidak dapat memenuhi permintaan, maka perlu untuk menulis ulang metodenya.

Selanjutnya, kita menambahkan beberapa metode baru di kelas Karyawan, dan menimpa metode kelas Person:

#!/usr/bin/perl

package Employee;
use Person;
use strict;
our @ISA = qw(Person);    # 从 Person 继承

# 重写构造函数
sub new {
    my ($class) = @_;

    # 调用父类的构造函数
    my $self = $class->SUPER::new( $_[1], $_[2], $_[3] );
    # 添加更多属性
    $self->{_id}   = undef;
    $self->{_title} = undef;
    bless $self, $class;
    return $self;
}

# 重写方法
sub getFirstName {
    my( $self ) = @_;
    # 这是子类函数
    print "这是子类函数\n";
    return $self->{_firstName};
}

# 添加方法
sub setLastName{
    my ( $self, $lastName ) = @_;
    $self->{_lastName} = $lastName if defined($lastName);
    return $self->{_lastName};
}

sub getLastName {
    my( $self ) = @_;
    return $self->{_lastName};
}

1;

Kami masukkan file berikut main.pl kode dan mengeksekusi:

#!/usr/bin/perl

use Employee;

$object = new Employee( "小明", "王", 23234345);
# 获取姓名,使用修改后的构造函数
$firstName = $object->getFirstName();

print "设置前姓名为 : $firstName\n";

# 使用辅助函数设置姓名
$object->setFirstName( "小强" );

# 通过辅助函数获取姓名
$firstName = $object->getFirstName();
print "设置后姓名为 : $firstName\n";

Setelah menjalankan program di atas, output adalah:

$ perl main.pl
名字:小明
姓氏:王
编号:23234345
这是子类函数
设置前姓名为 : 小明
这是子类函数
设置后姓名为 : 小强

Memuat standar

Jika kelas di saat ini, kelas saat ini dari semua kelas dasar, dan metode kelas UNIVERSAL diminta tidak dapat ditemukan, kemudian mencari metode bernama autoload () lagi. Jika ditemukan autoload, ia akan memanggil, sementara pengaturan nama yang memenuhi syarat dari nilai $ autoload variabel global metode yang hilang.

Jika tidak, maka gagal Perl dan kesalahan.

Jika Anda tidak ingin mewarisi autoload kelas dasar, sangat sederhana, hanya satu kalimat:

sub AUTOLOAD;

Destructors dan pengumpulan sampah

Ketika referensi terakhir ke objek dilepaskan, objek secara otomatis dirusak.

Jika Anda ingin melakukan sesuatu di destructor ketika Anda dapat metode yang disebut "DESTROY" didefinisikan di kelas. Maka secara otomatis akan memanggil waktu yang tepat, dan untuk melakukan tindakan pembersihan tambahan sesuai dengan apa yang Anda maksud.

package MyClass;
...
sub DESTROY
{
    print "MyClass::DESTROY called\n";
}

referensi obyek perl akan diteruskan ke MENGHANCURKAN sebagai satu-satunya parameter. Perhatikan bahwa kutipan ini adalah read-only, yang berarti Anda tidak dapat mengakses $ yang _ [0] untuk memodifikasinya. (Translator Catatan: Lihat perlsub) tetapi obyek itu sendiri (seperti "$ {$ _ [0]" atau "@ {$ _ [0]}" dan "% {$ _ [0]}", dll) atau dapat ditulis.

Jika Anda kembali memberkati-referensi objek sebelum kembali destructor, Perl kemudian akan menghubungi Anda kembali memberkati-MENGHANCURKAN metode objek yang setelah kembali destructor. Hal ini memungkinkan Anda untuk memiliki kesempatan untuk memanggil kelas dasar atau Anda tentukan destructor kelas-kelas lain. Perlu dicatat, MENGHANCURKAN juga bisa dipanggil secara manual, tetapi biasanya tidak diperlukan.

Setelah merilis objek saat, benda-benda lain yang terkandung dalam objek saat secara otomatis dirilis.


Contoh Perl berorientasi objek

Kami dapat lebih dipahami oleh contoh-contoh Perl aplikasi berorientasi objek berikut:

#!/usr/bin/perl

# 下面是简单的类实现
package MyClass;

sub new
{
   print "MyClass::new called\n";
   my $type = shift;            # 包名
   my $self = {};               # 引用空哈希
   return bless $self, $type;   
}

sub DESTROY
{
   print "MyClass::DESTROY called\n";
}

sub MyMethod
{
   print "MyClass::MyMethod called!\n";
}


# 继承实现
package MySubClass;

@ISA = qw( MyClass );

sub new
{
   print "MySubClass::new called\n";
   my $type = shift;            # 包名
   my $self = MyClass->new;     # 引用空哈希
   return bless $self, $type;  
}

sub DESTROY
{
   print "MySubClass::DESTROY called\n";
}

sub MyMethod
{
   my $self = shift;
   $self->SUPER::MyMethod();
   print "   MySubClass::MyMethod called!\n";
}

# 调用以上类的主程序
package main;

print "调用 MyClass 方法\n";

$myObject = MyClass->new();
$myObject->MyMethod();

print "调用 MySubClass 方法\n";

$myObject2 = MySubClass->new();
$myObject2->MyMethod();

print "创建一个作用域对象\n";
{
  my $myObject2 = MyClass->new();
}
# 自动调用析构函数

print "创建对象\n";
$myObject3 = MyClass->new();
undef $myObject3;

print "脚本执行结束...\n";
# 自动执行析构函数

Program di atas, output adalah:

调用 MyClass 方法
MyClass::new called
MyClass::MyMethod called!
调用 MySubClass 方法
MySubClass::new called
MyClass::new called
MyClass::MyMethod called!
   MySubClass::MyMethod called!
创建一个作用域对象
MyClass::new called
MyClass::DESTROY called
创建对象
MyClass::new called
MyClass::DESTROY called
脚本执行结束...
MyClass::DESTROY called
MySubClass::DESTROY called