Kế thừa là một nguyên tắc lập trình được thiết lập tốt và PHP sử dụng nguyên tắc này trong mô hình đối tượng của nó. Nguyên tắc này sẽ ảnh hưởng đến cách nhiều lớp và đối tượng liên quan với nhau
Ví dụ: khi mở rộng một lớp, lớp con sẽ kế thừa tất cả các phương thức, thuộc tính và hằng số công khai và được bảo vệ từ lớp cha. Trừ khi một lớp ghi đè các phương thức đó, chúng sẽ giữ nguyên chức năng ban đầu của chúng
Điều này hữu ích cho việc xác định và trừu tượng hóa chức năng, đồng thời cho phép triển khai chức năng bổ sung trong các đối tượng tương tự mà không cần phải triển khai lại tất cả các chức năng được chia sẻ
Các phương thức riêng của lớp cha không thể truy cập được đối với lớp con. Kết quả là, các lớp con có thể tự hiện thực lại một phương thức riêng tư mà không cần quan tâm đến các quy tắc kế thừa thông thường. Trước PHP 8. 0. 0, tuy nhiên, các hạn chế của final
và static
đã được áp dụng cho các phương pháp riêng tư. Kể từ PHP 8. 0. 0, hạn chế phương thức riêng tư duy nhất được thực thi là các hàm tạo private final
, vì đó là cách phổ biến để "vô hiệu hóa" hàm tạo khi sử dụng các phương thức tĩnh của nhà máy thay thế
Khả năng hiển thị của các phương thức, thuộc tính và hằng số có thể được nới lỏng, e. g. một phương pháp protected
có thể được đánh dấu là public
, nhưng chúng không thể bị hạn chế, e. g. đánh dấu tài sản public
là private
Ghi chú
Trừ khi autoloading được sử dụng, các lớp phải được xác định trước khi chúng được sử dụng. Nếu một lớp mở rộng một lớp khác, thì lớp cha phải được khai báo trước cấu trúc lớp con. Quy tắc này áp dụng cho các lớp kế thừa các lớp và giao diện khác
Ghi chú
Không được phép ghi đè thuộc tính đọc ghi bằng a hoặc ngược lại
class A {
public int $prop;
}
class B extends A {
// Illegal: read-write -> readonly
public readonly int $prop;
}
?>
Ví dụ #1 Ví dụ về kế thừa
class Foo
{
public function printItem[$string]
{
echo 'Foo: ' . $string . PHP_EOL;
}
public function printPHP[]
{
echo 'PHP is great.' . PHP_EOL;
}
}
static
0
static
1
static
2
Khả năng tương thích của loại trả về với các lớp bên trong
Trước PHP 8. 1, hầu hết các lớp hoặc phương thức bên trong không khai báo kiểu trả về của chúng và mọi kiểu trả về đều được phép khi mở rộng chúng
Kể từ PHP 8. 1. 0, hầu hết các phương thức nội bộ bắt đầu "tạm thời" khai báo kiểu trả về của chúng, trong trường hợp đó, kiểu trả về của các phương thức phải tương thích với kiểu gốc được mở rộng; . Lưu ý rằng việc thiếu khai báo trả về rõ ràng cũng được coi là chữ ký không khớp và do đó dẫn đến thông báo không dùng nữa
Nếu kiểu trả về không thể được khai báo cho một phương thức ghi đè do lo ngại về khả năng tương thích giữa các phiên bản PHP, thì có thể thêm thuộc tính ReturnTypeWillChange để tắt thông báo ngừng sử dụng
Trong Python, chúng ta có thể mở rộng một lớp để tạo một lớp mới từ lớp hiện có. Điều này trở nên khả thi vì Python hỗ trợ tính năng kế thừa
Sử dụng tính kế thừa, chúng ta có thể tạo một lớp con với tất cả các tính năng và phương thức của lớp cha. Chúng ta cũng có thể thêm các tính năng mới vào lớp con ngoài những tính năng có trong lớp cha
Chúng tôi thậm chí có thể ghi đè các tính năng của lớp cha mà chúng tôi không cần. Bạn sẽ học cách làm tất cả những điều đó khi xem qua bài viết này
Nói một cách đơn giản, mở rộng một lớp có nghĩa là chúng ta muốn tạo một lớp mới hoặc lớp con từ một lớp cha hoặc lớp hiện có. Mở rộng một lớp cũng giống như kế thừa một lớp
Hãy cho chúng tôi xem cách hoạt động của tính kế thừa trong Python
Mở rộng một lớp bằng tính kế thừa trong Python
Để kế thừa một lớp trong Python, chúng ta truyền tên của lớp đó làm tham số trong khi tạo lớp con
cú pháp
class ChildClass[ParentClass]
Hãy để chúng tôi hiểu điều này với một ví dụ
Đầu tiên chúng ta tạo một lớp cha,
class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
2, với hai phương thức - class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
3 và class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
4. Phương thức class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
4 có một câu lệnh in in hương vị và màu sắc được hiển thị trong đầu raclass Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
đầu ra
Chúng ta tạo lớp con,
class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6 sẽ kế thừa lớp, class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
2. Để lớp class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6 kế thừa lớp class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
2, chúng ta sẽ chuyển tên của lớp class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
2 làm tham số trong khi tạo lớp class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6Chúng tôi đang sử dụng từ khóa
class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
class Cake[Desserts]:
pass
obj = Cake["Black forest", "Black"]
obj.intro[]
2 ở đây bởi vì chúng tôi chỉ kế thừa lớp, class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
2 và không thêm bất kỳ phương thức hoặc tính năng nào khác vào lớp con, class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6. Lớp class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
class Cake[Desserts]:
pass
obj = Cake["Black forest", "Black"]
obj.intro[]
5 hiện có các thuộc tính và phương thức giống như lớp class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
2Chúng ta có thể xác minh điều này bằng cách tạo một đối tượng của lớp
class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6 và sau đó thực thi phương thức class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
4 như được hiển thị trong hai dòng mã cuối cùngclass Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
class Cake[Desserts]:
pass
obj = Cake["Black forest", "Black"]
obj.intro[]
đầu ra
Vanilla Pink
Black forest Black
Xem cách lớp
class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6 cũng thực thi phương thức class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
4 giống như lớp class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
2Hãy xem cách chúng ta có thể thêm nhiều phương thức và thuộc tính vào lớp con mới được tạo này
Thêm chức năng Vanilla Pink
Black forest Black
2 vào lớp con sau khi mở rộng lớp
Vanilla Pink
Black forest Black
Chúng ta có thể thêm một hàm
Vanilla Pink
Black forest Black
3 mới vào lớp con ngay cả khi kế thừa một lớp. Lưu ý rằng bất cứ khi nào một đối tượng của một lớp được tạo, hàm Vanilla Pink
Black forest Black
3 sẽ tự động được gọiNgoài ra, việc thêm hàm
Vanilla Pink
Black forest Black
3 vào lớp con sẽ không sử dụng hàm Vanilla Pink
Black forest Black
3 của lớp chaclass Cake[Desserts]:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
Mặc dù phương thức
Vanilla Pink
Black forest Black
3 của lớp con ghi đè tính kế thừa của phương thức Vanilla Pink
Black forest Black
3 của lớp cha, nhưng chúng ta vẫn có thể sử dụng phương thức Vanilla Pink
Black forest Black
3 của lớp cha bằng cách gọi nó như thế nàyclass Cake[Desserts]:
def __init__[self, flavor, color]:
Desserts.__init__[self, flavor, color]
Sử dụng hàm class Cake[Desserts]:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
0 sau khi mở rộng một lớp trong Python
class Cake[Desserts]:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
Trong Python, hàm
class Cake[Desserts]:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
0 có thể được sử dụng để truy cập các thuộc tính và phương thức của lớp chaKhi có một
Vanilla Pink
Black forest Black
3 mới bên trong một lớp con đang sử dụng phương thức Vanilla Pink
Black forest Black
3 của lớp cha, thì chúng ta có thể sử dụng hàm class Cake[Desserts]:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
0 để kế thừa tất cả các phương thức và thuộc tính từ lớp chaclass Cake[Desserts]:
def __init__[self, flavor, color]:
super[].__init__[flavor, color]
Lưu ý rằng ở đây, chúng tôi không chỉ định tên của lớp cha;
Đây là tất cả những kiến thức cơ bản về kế thừa trong Python
Nhưng nếu chúng ta phải thêm nhiều thuộc tính hoặc phương thức vào lớp con thì sao?
Thêm thuộc tính vào lớp con sau khi mở rộng lớp trong Python
Chúng ta có thể thêm các thuộc tính bổ sung vào một lớp con ngoài những thuộc tính được kế thừa bởi lớp cha giống như chúng ta thêm bất kỳ thuộc tính nào khác. Xem cách một thuộc tính có tên là
class Cake[Desserts]:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
6 được thêm vào lớp class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6class Cake[Desserts]:
def __init__[self, flavor, color, quantity]:
super[].__init__[flavor, color]
self.quantity = quantity
Chúng tôi đã thêm một tham số nữa trong hàm
Vanilla Pink
Black forest Black
3 của lớp con. Ngoài ra, đừng quên truyền thêm một giá trị cho class Cake[Desserts]:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
6 trong khi tạo đối tượng của lớp class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6, như thế nàyobj = Cake["Black forest", "Black", 5]
Thêm phương thức vào lớp con sau khi mở rộng lớp trong Python
Chúng tôi thêm một phương thức
class Cake[Desserts]:
def __init__[self, flavor, color]:
Desserts.__init__[self, flavor, color]
1 trong lớp con bằng cách sử dụng từ khóa class Cake[Desserts]:
def __init__[self, flavor, color]:
Desserts.__init__[self, flavor, color]
2 trong mã bên dưới. Chúng tôi cũng chuyển từ khóa class Cake[Desserts]:
def __init__[self, flavor, color]:
Desserts.__init__[self, flavor, color]
3 làm tham sốclass Cake[Desserts]:
def __init__[self, flavor, color, quantity]:
super[].__init__[flavor, color]
self.quantity = quantity
def price[self]:
print["Pay for: ", self.quantity, "items."]
Toàn bộ mã sẽ như sau
class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
0đầu ra
class Desserts:
def __init__[self, flavor, color]:
self.flavor = flavor
self.color = color
def intro[self]:
print[self.flavor, self.color]
obj = Desserts["Vanilla", "Pink"]
obj.intro[]
1Lưu ý rằng việc thêm một phương thức có cùng tên với bất kỳ phương thức nào trong lớp cha sẽ ghi đè lên phương thức kế thừa