Latest web development tutorials

بيرل الشيئية

وهناك نوعان من مختلف بيرل لتنفيذ البرمجة كائنية التوجه:

  • واحد النهج القائم على طاولة مجهول التجزئة، وجوهر كل مثيل الكائن هو نقطة مرجعية لجدول التجزئة مجهول. في هذا الجدول التجزئة مجهول لتخزين كافة الخصائص سبيل المثال.
  • والثاني يقوم على مجموعة من الطرق، في تعريف فئة، ونحن سوف إنشاء خاصية لكل مثيل من مجموعة، وجوهر كل مثيل الكائن هو مؤشر إلى مجموعة على التوالي في إشارة المؤشر. في هذه المصفوفات، ذكرى كل الخصائص سبيل المثال.

المفاهيم الأساسية للوجوه المنحى

هناك العديد من المفاهيم الأساسية من وجوه المنحى، حيث تلقينا ثلاثة: التحف، والطبقات، والأساليب.

  • الاعتراض: إن الكائن عناصر البيانات فئة مرجع..

  • الدرجة: الفئة هو مجموعة بيرل، الذي يحتوي على وجوه لتوفير طريقة الطبقة.

  • الأساليب: الأسلوب هو روتين بيرل، اسم الفئة هو أول حجة لها.

يوفر بيرل وظيفة بارك ()، وبارك يستخدم لبناء الكائن من خلال إشارة ويبارك الاسم المقترن مع هذه الفئة، والعودة هذه الإشارة لبناء كائن.


تعريف الفئة

وهناك فئة ليست سوى مجموعة بسيطة.

يمكنك استخدام حزمة كطبقة، ووضع الكيس بوصفها وظيفة من أسلوب فئة الاستخدام.

توفر حزمة بيرل مساحة اسم منفصلة، ​​وطريقة مجموعات مختلفة وأسماء المتغيرات لا تتعارض.

ملف بيرل الطبقات التمديد ل.pm.

نحن المقبل إنشاء فئة الشخص:

package Person;

مجموعة رمز الفئة إلى السطر الأخير من الملف النصي، أو إلى حزمة قبل الكلمة التالية.


إنشاء واستخدام كائنات

إنشاء مثيل فئة (كائن) ونحن بحاجة إلى تعريف منشئ، معظم البرامج تستخدم اسم الفئة كما منشئ، يمكن بيرل استخدام أي اسم.

يمكنك استخدام مجموعة متنوعة من المتغيرات وجوه بيرل بيرل. في معظم الحالات سوف نستخدم مجموعة أو التجزئة المرجعية.

نحن المقبل إنشاء منشئ للفئة الشخص، استخدم تجزئة إشارة بيرل.

عند إنشاء كائن، تحتاج إلى توفير منشئ، وهو روتين وترجع مرجع كائن.

ومن الأمثلة على ذلك ما يلي:

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

المقبل، ونحن إنشاء كائن:

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

طريقة تعريف

أساليب الفئة بيرل فقط، وإنما هو روتين بيرل، المعروف أيضا باسم ظائف الأعضاء.

وجوه المنحى بيرل بيرل تعريف الأسلوب لا يقدم أي تركيب خاص، ولكن تحدد المعلمة الأولى لأسلوب للكائن المشار إليها أو الحزمة.

بيرل لا توفر المتغيرات خاصة، ولكن يمكننا إدارة البيانات الكائن من خلال وسيلة مساعدة.

التالي نحدد طريقة للحصول على اسم:

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

ونفس الشيء يمكن أيضا كتابة:

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

المقبل، ونحن تعديل الملف Person.pm التعليمات البرمجية، كما يلي:

#!/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 رمز البرنامج على النحو التالي:

#!/usr/bin/perl

use Person;

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

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

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

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

بعد تنفيذ البرنامج المذكور أعلاه، والناتج هو:

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

وراثة

أساليب الفئة بيرل في خلافةISA مجموعة، مجموعة التي تحتوي على مجموعات أخرى (الطبقة) اسم رثوا متغير يجب تعيين صراحة.

وراثة متعددة هو مجموعةISA تضم عدد وافر من فئة (حزمة) اسم.

يمكن أن تكون موروثة الطريقة إلا من خلالISA، لا يمكن أن تكون موروثة البيانات.

بعد ذلك قمنا بإنشاء موظف الدرجة يرث فئة الشخص.

كود ملف Employee.pm على النحو التالي:

#!/usr/bin/perl

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

الآن فئة الموظف تحتوي على كافة أساليب وخصائص الطبقة شخص، ونحن ندخل التعليمة البرمجية التالية في ملف main.pl وتنفيذ:

#!/usr/bin/perl

use Employee;

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

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

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

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

بعد تنفيذ البرنامج المذكور أعلاه، والناتج هو:

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

تجاوز الأسلوب

في المثال أعلاه، فئة الموظف تمتد الطبقة شخص، ولكن إذا كانت أساليب الفئة شخص لا تستطيع ان تلبي الطلب، فمن الضروري إعادة كتابة أساليبها.

بعد ذلك، نضيف بعض أساليب جديدة في فئة الموظف، وتجاوز الأساليب فئة الشخص:

#!/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;

نحن ندخل ملف main.pl البرمجية التالية وتنفيذ:

#!/usr/bin/perl

use Employee;

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

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

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

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

بعد تنفيذ البرنامج المذكور أعلاه، والناتج هو:

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

تحميل الافتراضي

إذا لا يمكن العثور على فئة في التيار، الطبقة الحالية من كل فئة أساسية، وأساليب الفئة طلب UNIVERSAL، ثم يبحث عن وسيلة اسمه AUTOLOAD () مرة أخرى. إذا وجدت AUTOLOAD، فإنه سيتم استدعاء، في حين وضع اسم مؤهل بشكل كامل من قيمة $ AUTOLOAD متغير العالمية الطرق في عداد المفقودين.

إذا لم يكن كذلك، فقد فشلت بيرل والخطأ.

إذا كنت لا تريد أن ترث AUTOLOAD الفئة الأساسية، في غاية البساطة، جملة واحدة فقط:

sub AUTOLOAD;

تالفة وجمع القمامة

عندما يتم تحرير المرجع الأخير إلى كائن، وهدمته الكائن تلقائيا.

إذا كنت تريد أن تفعل شيئا في المدمر عندما يمكنك طريقة تسمى "تدمير" ويعرف في الصف. فإنه سيتم استدعاء تلقائيا الوقت المناسب، وتنفيذ إجراءات تنظيف إضافية وفقا لما تعنيه.

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

سيتم تمريرها بيرل مرجع كائن لتدمير كمعلمة فقط. لاحظ أن هذا الاقتباس هو للقراءة فقط، مما يعني أنك لا يمكن الوصول إلى $ _ [0] لتعديله. (ملاحظة المترجم: انظر perlsub) ولكن الكائن نفسه (مثل "$ {$ _ [0]" أو "@ {$ _ [0]}" و "٪ {$ _ [0]}"، وما إلى ذلك) أو يمكن أن يكون مكتوب.

إذا كنت إعادة يبارك مرجع كائن قبل أن يعود المدمر، وبيرل ثم أدعوك لإعادة يبارك التدمير طريقة هذا الكائن بعد عودة المدمر. هذا يسمح لك أن تتاح لي الفرصة لاستدعاء الفئة الأساسية أو تحديد المدمر الفئات الأخرى. وتجدر الإشارة إلى أنه، كما يمكن الاحتجاج بها يدويا الإتلاف، ولكن عادة ما تكون غير ضرورية.

بعد الافراج عن الكائن الحالي، يتم تحريرها أشياء أخرى واردة في الكائن الحالي تلقائيا.


أمثلة من بيرل وجوه المنحى

يمكننا أن تفهم التطبيقات وجوه المنحى أمثلة بيرل التالية:

#!/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";
# 自动执行析构函数

البرنامج المذكور أعلاه، والناتج هو:

调用 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