PHP OOP - Kế thừa
PHP - Kế thừa là gì?
Kế thừa trong OOP = Khi một lớp bắt nguồn từ một lớp khác.
Lớp con sẽ kế thừa tất cả các thuộc tính và phương thức public và protected từ lớp cha. Ngoài ra, nó có thể có các thuộc tính và phương thức riêng.
Một lớp kế thừa được xác định bằng cách sử dụng từ khóa extends
.
Hãy xem một ví dụ:
Ví dụ
<?php
class Fruit {
public
$name;
public $color;
public
function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
public function intro() {
echo "The fruit is {$this->name}
and the color is {$this->color}.";
}
}
// Strawberry is inherited from Fruit
class
Strawberry extends Fruit {
public
function message() {
echo "Am I a fruit or a
berry? ";
}
}
$strawberry = new Strawberry("Strawberry", "red");
$strawberry->message();
$strawberry->intro();
?>
Hãy tự mình thử »Ví dụ giải thích
Lớp Strawberry được kế thừa từ lớp Fruit.
Điều này có nghĩa là lớp Strawberry có thể sử dụng các thuộc tính public $name và $color cũng như các phương thức public __construct() và intro() từ lớp Fruit do tính kế thừa.
Lớp Strawberry cũng có phương thức riêng: message().
PHP - Kế thừa và Công cụ sửa đổi quyền truy cập được bảo vệ
Trong chương trước chúng ta đã biết rằng các thuộc tính hoặc phương thức protected
có thể được truy cập trong lớp và bởi các lớp dẫn xuất từ lớp đó. Điều đó nghĩa là gì?
Hãy xem một ví dụ:
Ví dụ
<?php
class Fruit {
public
$name;
public $color;
public
function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
protected function intro() {
echo "The fruit is {$this->name}
and the color is {$this->color}.";
}
}
class
Strawberry extends Fruit {
public
function message() {
echo "Am I a fruit or a
berry? ";
}
}
// Try to call all three methods from outside class
$strawberry = new Strawberry("Strawberry", "red"); // OK. __construct() is public
$strawberry->message(); // OK. message()
is public
$strawberry->intro(); // ERROR. intro()
is protected
?>
Hãy tự mình thử » Trong ví dụ trên, chúng ta thấy rằng nếu chúng ta cố gắng gọi một phương thức protected
(intro()) từ bên ngoài lớp, chúng ta sẽ gặp lỗi. phương pháp public
sẽ hoạt động tốt!
Hãy xem một ví dụ khác:
Ví dụ
<?php
class Fruit {
public $name;
public
$color;
public function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
protected function intro() {
echo "The
fruit is {$this->name} and the color is {$this->color}.";
}
}
class Strawberry extends Fruit {
public function message() {
echo "Am I a fruit or a berry? ";
// Call protected
method from within derived class - OK
$this ->
intro();
}
}
$strawberry = new Strawberry("Strawberry", "red"); // OK. __construct() is
public
$strawberry->message(); // OK. message() is
public and it calls intro() (which is protected) from within the
derived class
?>
Hãy tự mình thử » Trong ví dụ trên chúng ta thấy rằng tất cả đều hoạt động tốt! Đó là bởi vì chúng ta gọi phương thức protected
(intro()) từ bên trong lớp dẫn xuất.
PHP - Ghi đè các phương thức kế thừa
Các phương thức kế thừa có thể được ghi đè bằng cách xác định lại các phương thức (sử dụng cùng tên) trong lớp con.
Nhìn vào ví dụ dưới đây. Các phương thức __construct() và intro() trong lớp con (Strawberry) sẽ ghi đè các phương thức __construct() và intro() trong lớp cha (Fruit):
Ví dụ
<?php
class Fruit {
public
$name;
public $color;
public
function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
public function intro() {
echo "The fruit is {$this->name}
and the color is {$this->color}.";
}
}
class
Strawberry extends Fruit {
public $weight;
public
function __construct($name, $color, $weight) {
$this->name = $name;
$this->color = $color;
$this->weight = $weight;
}
public function intro() {
echo "The fruit is {$this->name}, the color is {$this->color},
and the weight is {$this->weight} gram.";
}
}
$strawberry = new Strawberry("Strawberry", "red",
50);
$strawberry->intro();
?>
Hãy tự mình thử »PHP - Từ khóa cuối cùng
Từ khóa final
có thể được sử dụng để ngăn chặn sự kế thừa lớp hoặc ngăn chặn việc ghi đè phương thức.
Ví dụ sau đây cho thấy cách ngăn chặn sự kế thừa lớp:
Ví dụ
<?php
final class Fruit {
// some code
}
//
will result in error
class
Strawberry extends Fruit {
// some code
}
?>
Hãy tự mình thử »Ví dụ sau đây cho thấy cách ngăn chặn ghi đè phương thức:
Ví dụ
<?php
class Fruit {
final public function intro() {
// some code
}
}
class
Strawberry extends Fruit {
//
will result in error
public function intro() {
// some code
}
}
?>
Hãy tự mình thử »