Một lớp trừu tượng trong PHP là gì?


121

Một lớp trừu tượng trong PHP là gì?

Làm thế nào có thể sử dụng nó?




6
@Gordon: Đôi khi tài liệu chính thức không rõ ràng đối với một số người :(
Sarfraz


3
@Sarfraz không có nghĩa là theo cách RTFM. Tôi chỉ nghĩ rằng có một liên kết đến tài liệu chính thức là một tài sản hữu ích. Và bạn sẽ không tin có bao nhiêu người không đọc tài liệu chính thức hoặc thậm chí không biết chúng tồn tại.
Gordon

Câu trả lời:


131

Một lớp trừu tượng là một lớp có chứa ít nhất một phương thức trừu tượng, là một phương thức không có bất kỳ mã thực sự nào trong đó, chỉ có tên và các tham số và được đánh dấu là "trừu tượng".

Mục đích của việc này là cung cấp một loại khuôn mẫu để kế thừa và buộc lớp kế thừa thực hiện các phương thức trừu tượng.

Do đó, một lớp trừu tượng là một cái gì đó nằm giữa một lớp thông thường và một giao diện thuần túy. Ngoài ra, các giao diện là một trường hợp đặc biệt của các lớp trừu tượng trong đó TẤT CẢ các phương thức đều là trừu tượng.

Xem phần này của sổ tay PHP để tham khảo thêm.


6
Trong luồng này , trừu tượng không chứa bất kỳ phương thức trừu tượng nào.
r0ng

6
@ r0ng Sẽ đúng hơn nếu nói rằng một lớp trừu tượng có thể chứa các phương thức trừu tượng và các phương thức trừu tượng phải luôn nằm bên trong một lớp trừu tượng. Các tính năng thực tế xác định trong suy nghĩ của tôi là một lớp trừu tượng không thể được khởi tạo, nhưng bạn có thể kế thừa và ghi đè các phương thức, và các phương thức tĩnh từ một lớp trừu tượng có thể được sử dụng bình thường.
okdewit 25/09/17

117

Các lớp trừu tượng là các lớp chứa một hoặc nhiều phương thức trừu tượng. Một phương thức trừu tượng là một phương thức được khai báo, nhưng không chứa thực thi. Các lớp trừu tượng có thể không được khởi tạo và yêu cầu các lớp con cung cấp các triển khai cho các phương thức trừu tượng.

1. Không thể khởi tạo lớp trừu tượng : Các lớp được định nghĩa là trừu tượng có thể không được khởi tạo và bất kỳ lớp nào chứa ít nhất một phương thức trừu tượng cũng phải trừu tượng.

Ví dụ bên dưới:

abstract class AbstractClass
{

    abstract protected function getValue();
    abstract protected function prefixValue($prefix);


    public function printOut() {
        echo "Hello how are you?";
    }
}

$obj=new AbstractClass();
$obj->printOut();
//Fatal error: Cannot instantiate abstract class AbstractClass

2. Bất kỳ lớp nào chứa ít nhất một phương thức trừu tượng cũng phải trừu tượng : Lớp trừu tượng có thể có các phương thức trừu tượng và không trừu tượng, nhưng nó phải chứa ít nhất một phương thức trừu tượng. Nếu một lớp có ít nhất một phương thức trừu tượng, thì lớp đó phải được khai báo là trừu tượng.

Lưu ý: Các đặc điểm hỗ trợ việc sử dụng các phương thức trừu tượng để áp đặt các yêu cầu đối với lớp trưng bày.

Ví dụ bên dưới:

class Non_Abstract_Class
{
   abstract protected function getValue();

    public function printOut() {
        echo "Hello how are you?";
    }
}

$obj=new Non_Abstract_Class();
$obj->printOut();
//Fatal error: Class Non_Abstract_Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Non_Abstract_Class::getValue)

3. Một phương thức trừu tượng không thể chứa phần thân : Các phương thức được định nghĩa là trừu tượng chỉ cần khai báo chữ ký của phương thức - chúng không thể định nghĩa việc thực hiện. Nhưng một phương thức không trừu tượng có thể xác định việc triển khai.

abstract class AbstractClass
{
   abstract protected function getValue(){
   return "Hello how are you?";
   }

    public function printOut() {
        echo $this->getValue() . "\n";
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
//Fatal error: Abstract function AbstractClass::getValue() cannot contain body

4. Khi kế thừa từ một lớp trừu tượng, tất cả các phương thức được đánh dấu là trừu tượng trong khai báo lớp của cha phải được xác định bởi con : Nếu bạn kế thừa một lớp trừu tượng, bạn phải cung cấp các triển khai cho tất cả các phương thức trừu tượng trong đó.

abstract class AbstractClass
{
    // Force Extending class to define this method
    abstract protected function getValue();

    // Common method
    public function printOut() {
        print $this->getValue() . "<br/>";
    }
}

class ConcreteClass1 extends AbstractClass
{
    public function printOut() {
        echo "dhairya";
    }

}
$class1 = new ConcreteClass1;
$class1->printOut();
//Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue)

5. Khả năng hiển thị giống nhau (hoặc ít bị hạn chế hơn) : Khi kế thừa từ một lớp trừu tượng, tất cả các phương thức được đánh dấu là trừu tượng trong khai báo lớp của cha phải được định nghĩa bởi con; ngoài ra, các phương pháp này phải được xác định với cùng một tầm nhìn (hoặc ít bị hạn chế hơn). Ví dụ, nếu phương thức trừu tượng được định nghĩa là bảo vệ, thì việc triển khai hàm phải được định nghĩa là bảo vệ hoặc công khai, nhưng không phải là riêng tư.

Lưu ý rằng phương thức trừu tượng không được là private.

abstract class AbstractClass
{

    abstract public function getValue();
    abstract protected function prefixValue($prefix);

        public function printOut() {
        print $this->getValue();
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."<br/>";
//Fatal error: Access level to ConcreteClass1::getValue() must be public (as in class AbstractClass)

6. Chữ ký của các phương thức trừu tượng phải phù hợp : Khi kế thừa từ một lớp trừu tượng, tất cả các phương thức được đánh dấu là trừu tượng trong khai báo lớp cha phải được xác định bởi con; chữ ký của các phương thức phải phù hợp, nghĩa là kiểu gợi ý và số lượng các phương thức bắt buộc các đối số phải giống nhau. Ví dụ, nếu lớp con định nghĩa một đối số tùy chọn, trong đó chữ ký của phương thức trừu tượng không có, thì không có xung đột trong chữ ký.

abstract class AbstractClass
{

    abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass
{


    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "<br/>";
echo $class->prefixName("Pacwoman"), "<br/>";
//output: Mr. Pacman
//        Mrs. Pacwoman

7. Lớp trừu tượng không hỗ trợ đa kế thừa : Lớp trừu tượng có thể mở rộng một lớp trừu tượng khác, lớp trừu tượng có thể cung cấp việc triển khai giao diện nhưng nó không hỗ trợ đa kế thừa.

interface MyInterface{
    public function foo();
    public function bar();
}

abstract class MyAbstract1{
    abstract public function baz();
}


abstract class MyAbstract2 extends MyAbstract1 implements MyInterface{
    public function foo(){ echo "foo"; }
    public function bar(){ echo "bar"; }
    public function baz(){ echo "baz"; }
}

class MyClass extends MyAbstract2{
}

$obj=new MyClass;
$obj->foo();
$obj->bar();
$obj->baz();
//output: foobarbaz

Lưu ý: Xin lưu ý thứ tự hoặc vị trí của các lớp trong mã của bạn có thể ảnh hưởng đến trình thông dịch và có thể gây ra lỗi nghiêm trọng. Vì vậy, khi sử dụng nhiều cấp độ trừu tượng, hãy cẩn thận với vị trí của các lớp trong mã nguồn.

ví dụ dưới đây sẽ gây ra lỗi nghiêm trọng: Không tìm thấy lớp 'ngựa'

class cart extends horse {
    public function get_breed() { return "Wood"; }
}

abstract class horse extends animal {
    public function get_breed() { return "Jersey"; }
}

abstract class animal {
    public abstract function get_breed();
}

$cart = new cart();
print($cart->get_breed());

1
Được trau chuốt kỹ lưỡng.
Talk2Nit

18

Một lớp trừu tượng là một lớp chỉ được người lập trình thực hiện một phần. Nó có thể chứa một hoặc nhiều phương thức trừu tượng. Một phương thức trừu tượng chỉ đơn giản là một định nghĩa hàm dùng để nói với người lập trình rằng phương thức đó phải được thực hiện trong một lớp con.

Có lời giải thích tốt về điều đó ở đây .


Xin chào, cảm ơn vì lời giải thích, sự thật là không có lời giải thích nào tốt như thế này trên internet về trừu tượng và giao diện trong PHP.
Lenin Zapata

12

Lớp
trừu tượng 1. Chứa một phương thức trừu tượng
2. Không thể khởi tạo trực tiếp
3. Không thể tạo một đối tượng của lớp trừu tượng
4. Chỉ được sử dụng cho mục đích kế thừa

Phương thức trừu tượng
1. Không thể chứa phần thân
2. Không thể định nghĩa là private
3. Các lớp con phải định nghĩa các phương thức được khai báo trong lớp trừu tượng

Mã ví dụ:

abstract class A {
    public function test1() {
        echo 'Hello World';
    }
    abstract protected function f1();
    abstract public function f2();
    protected function test2(){
        echo 'Hello World test';
    }
}

class B extends A {
    public $a = 'India';
    public function f1() {
        echo "F1 Method Call";
    }
    public function f2() {
        echo "F2 Method Call";
    }
}

$b = new B();
echo $b->test1() . "<br/>";
echo $b->a . "<br/>";
echo $b->test2() . "<br/>";
echo $b->f1() . "<br/>";
echo $b->f2() . "<br/>";

Đầu ra:

Hello World
India
Hello World test
F1 Method Call
F2 Method Call

bạn không thể gọi phương thức cha được bảo vệ bằng đối tượng lớp con, bạn có thể gọi phương thức lớp con bằng đối tượng này echo $ b-> test2 (). "<br/>";
Al-Amin

7
  • Lớp trừu tượng chỉ chứa khai báo chữ ký của phương thức, chúng không thể định nghĩa việc triển khai.
  • Lớp trừu tượng được định nghĩa bằng cách sử dụng từ khóa trừu tượng .
  • Lớp trừu tượng không thể thực hiện đa kế thừa .
  • Phiên bản mới nhất của PHP 5 đã giới thiệu các lớp và phương thức trừu tượng.
  • Các lớp được định nghĩa là trừu tượng, chúng tôi không thể tạo đối tượng (có thể không khởi tạo)

0

Các lớp trừu tượng là những lớp không thể được khởi tạo trực tiếp. Hay nói cách khác, chúng ta có thể nói rằng các lớp trừu tượng là những lớp mà đối tượng không thể được tạo trực tiếp. Trong PHP, các lớp trừu tượng được xác định với từ khóa trừu tượng .

Ngoài ra, để trở thành một lớp trừu tượng ateast, một phương thức của lớp phải trừu tượng.

Để biết chi tiết về lớp trừu tượng, bạn có thể tham khảo blog của tôi về Lớp trừu tượng trong PHP .


0

Một lớp trừu tượng cũng giống như lớp bình thường nó chứa các biến, nó chứa các hàm được bảo vệ, nó chứa hàm khởi tạo chỉ khác một điều là nó chứa phương thức trừu tượng.

Phương thức trừu tượng nghĩa là một phương thức rỗng không có định nghĩa nên chỉ khác một điểm trong lớp trừu tượng là chúng ta không thể tạo một đối tượng của lớp trừu tượng

Abstract phải chứa phương thức trừu tượng và các phương thức đó phải được định nghĩa trong lớp kế thừa của nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.