Latest web development tutorials

펄 객체 지향

두 개의 다른 펄 객체 지향 프로그래밍을 구현하기가있다 :

  • 한 익명의 해시 테이블 기반의 접근 방식, 각 객체 인스턴스의 본질은 익명의 해쉬 테이블을 참조하는 지점입니다. 이 익명의 해시 테이블에있는 모든 인스턴스 속성을 저장합니다.
  • 둘째는 가지의 배열에 기반 클래스 정의에, 우리는 어레이의 각 인스턴스에 대한 속성을 생성하며, 각각의 객체 인스턴스의 본질은 행 인덱스 참조의 배열에 대한 포인터. 이러한 배열에서, 모든 인스턴스 속성의 메모리.

객체 지향의 기본 개념

개체, 클래스 및 방법 : 객체 지향, 우리는 셋을받은 많은 기본 개념이 있습니다.

  • 개체 : 개체는 클래스 참조 데이터 항목입니다..

  • 클래스 : 클래스는 클래스의 방법을 제공하는 개체를 포함하는 펄 패키지이다.

  • 방법 :이 방법은 펄 서브 루틴은 클래스 이름은 첫 번째 인자이다.

펄은 참조를 통해 객체를 생성하고이 클래스와 연관된 이름을 축복 개체를 구성하는이 참조를 반환하는 데 사용됩니다 신의 축복 축복 () 함수를 제공합니다.


클래스 정의

클래스는 단순한 패키지입니다.

는 클래스로 패키지를 사용하고, 사용하는 클래스 메소드의 함수로서 백 넣을 수있다.

펄 패키지는 별도의 네임 스페이스를 제공, 다른 패키지와 변수 이름의 방법은 충돌하지 않습니다.

펄가 .pm을위한 확장 클래스 파일.

다음으로 우리는 Person 클래스를 만듭니다

package Person;

스크립트 파일의 마지막 행, 또는 다음 키워드 전에 패키지에 클래스 코드 범위.


객체 생성 및 사용

우리가 생성자를 정의 할 필요가 클래스 인스턴스 (객체) 만들기, 대부분의 프로그램은 생성자로 클래스 이름을 사용, 펄은 어떤 이름을 사용할 수 있습니다.

넌 펄 펄 객체와 같은 변수들을 사용할 수있다. 대부분에서 우리는 배열이나 해시 참조를 사용합니다.

다음으로 우리는 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을 통해 상속 될 수 있으며, 데이터는 상속 될 수 없습니다.

다음으로 우리는 클래스 직원이 Person 클래스를 상속 만듭니다.

다음과 같이 Employee.pm 파일의 코드는 다음과 같습니다

#!/usr/bin/perl

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

이제 Employee 클래스는 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
设置前姓名为 : 小明
设置后姓名为 : 小强

메소드의 오버라이드 (override)

위의 예는, 직원 클래스 인 클래스를 확장하지만, Person 클래스의 메소드는 수요를 충족 할 수없는 경우, 그 방법을 다시 할 필요가있다.

다음으로, 우리는 Person 클래스 메소드를 Employee 클래스에 새로운 메소드를 추가하고, 오버라이드 (override) :

#!/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]}", 등) 또는 일 수있다 작성합니다.

당신이 소멸자를 반환하기 전에 객체 참조를 다시 축복 경우, 펄은 소멸자 반환 후 해당 개체의 재 축복 DESTROY 방법에 당신을 호출합니다. 이렇게하면 기본 클래스를 호출하거나 소멸자 다른 클래스를 지정할 수있는 기회를 가질 수 있습니다. 또한 수동으로 호출 할 수있는 파괴 언급하지만, 일반적으로 필요하지 않습니다해야합니다.

현재 개체의 출시 후, 현재 객체에 포함 된 다른 개체가 자동으로 해제됩니다.


객체 지향 펄로서는

우리는하기 실시 예 펄 객체 지향 어플리케이션에 의해 이해 될 수있다 :

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