Một lớp trừu tượng trong PHP là gì?
Làm thế nào có thể sử dụng nó?
Một lớp trừu tượng trong PHP là gì?
Làm thế nào có thể sử dụng nó?
Câu trả lời:
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.
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());
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 .
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
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 .
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ó.