1. Khái niệm kế thừa là gì ?
- Một lớp con sẽ được khai báo bằng từ khóa extends với cú pháp như sau:
class TênLớpCon extends TênLớpCha{
//some code
}
- Lớp SinhViên được kế thừa từ lớp CôngDân, cho nên nó sẽ thừa hưởng các thuộc tính & phương thức từ lớp CôngDân. Ngoài ra, lớp SinhViên còn có một phương thức riêng là message().
class CongDan{
public $name;
public $year;
public function __construct($input_name, $input_year){
$this->name = $input_name;
$this->year = $input_year;
}
public function intro(){
echo "Tôi tên là {$this->name}, sinh năm {$this->year}";
}
}
class SinhVien extends CongDan{
public function message(){
echo "Chào các bạn!
";
}
}
$nhan = new SinhVien("Nguyễn Thành Nhân",1993);
$nhan->message();
$nhan->intro();
?>
2. Phạm vi truy cập protected
Phạm vi truy cập protected
- Sau đây là ví dụ để các bạn hiểu rõ hơn về phạm vi truy cập protected:
- Ví dụ 1:
class CongDan{ public $name; public $year; public function __construct($input_name, $input_year){ $this->name = $input_name; $this->year = $input_year; } protected function intro(){ echo "Tôi tên là {$this->name}, sinh năm {$this->year}"; } } class SinhVien extends CongDan{ public function message(){ echo "Chào các bạn!
"; } } $nhan = new SinhVien("Nguyễn Thành Nhân",1993); $nhan->message(); $nhan->intro(); //ERROR (phương thức intro là protected, nó chỉ có thể được gọi bên trong lớp CongDan, hoặc được gọi bên trong các lớp được kế thừa từ lớp CongDan, điển hình như lớp SinhVien) ?> - Ví dụ 2:
class CongDan{
public $name;
public $year;
public function __construct($input_name, $input_year){
$this->name = $input_name;
$this->year = $input_year;
}
protected function intro(){
echo "Tôi tên là {$this->name}, sinh năm {$this->year}";
}
}
class SinhVien extends CongDan{
public function message(){
echo "Chào các bạn!
";
$this->intro(); //OK (phương thức intro được gọi bên trong lớp SinhVien)
}
}
$nhan = new SinhVien("Nguyễn Thành Nhân",1993);
$nhan->message();
?>
3. Ghi đè phương thức
- Các phương thức được kế thừa từ lớp cha có thể được ghi đè bằng cách khai báo lại bên trong lớp con.
class CongDan{
public $name;
public $year;
public function __construct($input_name, $input_year){
$this->name = $input_name;
$this->year = $input_year;
}
protected function intro(){
echo "Tôi tên là {$this->name}, sinh năm {$this->year}";
}
}
class SinhVien extends CongDan{
public $gender;
public function __construct($input_name, $input_year, $input_gender){
$this->name = $input_name;
$this->year = $input_year;
$this->gender = $input_gender;
}
public function intro(){
echo "Tôi tên là {$this->name}, sinh năm {$this->year}, giới tính {$this->gender}";
}
}
$nhan = new SinhVien("Nguyễn Thành Nhân",1993,"Nam");
$nhan->intro();
?>
4. Từ khóa final
- Từ khóa final dùng để ngăn chặn việc kế thừa lớp, hoặc ngăn chặn việc ghi đè lên phương thức.
- Không lớp nào có thể kế thừa lớp CongDan (việc định nghĩa lớp SinhVien kế thừa lớp CongDan sẽ xảy ra lỗi)
final class CongDan{
public $name;
public function __construct($input_name){
$this->name = $input_name;
}
public function intro(){
echo "Tôi tên là {$this->name}";
}
}
class SinhVien extends CongDan{ //ERROR
//some code
}
?>
- Phương thức intro() sẽ không thể bị ghi đè bên trong các lớp con.
class CongDan{
public $name;
public function __construct($input_name){
$this->name = $input_name;
}
final public function intro(){
echo "Tôi tên là {$this->name}";
}
}
class SinhVien extends CongDan{
public function intro(){ //ERROR
echo "Chào các bạn, tôi tên là {$this->name}";
}
}
?>
Nội dung bài viết:
Bình luận