Web Cơ Bản

Cách khai báo, sử dụng lớp trừu tượng và phương thức trừu tượng trong PHP

Lớp trừu tượng, phương thức trừu tượng là gì ?

- “Lớp trừu tượng” là loại lớp phải có chứa ít nhất một “phương thức trừu tượng”.

- “Phương thức trừu tượng” là loại phương thức chỉ được khai báo tên, nó không chứa hành vi, nó cần phải được khai báo lại (bổ sung hành vi) bên trong lớp con để hoàn tất việc khai báo.

Cách khai báo lớp trừu tượng, phương thức trừu tượng

- Một lớp hoặc phương thức trừu tượng sẽ được khai báo bằng từ khóa abstract.

<?php
	abstract class ParentClass {
		abstract public function someMethod1();
		abstract public function someMethod2($name, $color);
		abstract public function someMethod3() : string;
	}
?>

- Khi kế thừa từ một “lớp trừu tượng”, các “phương thức trừu tượng” bên trong lớp cha phải được khai báo lại ở bên trong lớp con với phạm vi truy cập từ bằng cho đến ít hạn chế hơn (Ví dụ: Phương thức intro() bên trong lớp cha được thiết lập phạm vi truy cập là protected thì khi khai báo lại bên trong lớp con, nó phải là protected hoặc public, tuyệt đối không được phép private). Ngoài ra, loại & số lượng đối số bắt buộc phải giống nhau. Tuy nhiên, các lớp con có thể có các đối số tùy chọn.

- Vì vậy, khi một lớp con được kế thừa từ một lớp trừu tượng, chúng ta cần phải tuân thủ các quy tắc như sau:

  • Các phương thức trừu tượng trong lớp cha phải được khai báo lại bên trong lớp con.
  • Phạm vi truy cập của các phương thức trừu tượng được khai báo lại bên trong lớp con phải từ bằng hoặc ít hạn chế hơn.
  • Số lượng đối số bắt buộc phải giống nhau. Tuy nhiên, lớp con có thể có thêm các đối số tùy chọn.

- Hai lớp SinhViên & GiảngViên được kế thừa từ lớp CôngDân, cho nên chúng sẽ thừa hưởng các thuộc tính, phương thức của lớp CôngDân (điển hình là thuộc tính $name, phương thức __construct). Riêng phương thức intro trong lớp CôngDân là phương thức trừu tượng, cho nên nó cần phải được khai báo lại bên trong hai lớp con này.

<?php
	abstract class CongDan{
		public $name;
		public function __construct($input_name){
			$this->name = $input_name;
		}
		abstract public function intro();
	}
	class SinhVien extends CongDan{
		public function intro(){
			echo "<p>Chào các bạn, mình tên là {$this->name}</p>";
		}
	}
	class GiangVien extends CongDan{
		public function intro(){
			echo "<p>Chào các em, cô tên là {$this->name}</p>";
		}
	}
	$sv = new SinhVien("Nhân");
	$sv->intro();
	$gv = new GiangVien("Thảo");
	$gv->intro();
?>

- Phương thức intro() trong lớp CôngDân có một đối số $name, cho nên khi khai báo lại trong lớp SinhViên thì nó cũng phải có ít nhất một đối số $name, ngoài ra thì có thể có thêm các đối số tùy chọn (tại đây tôi cho thêm hai đối số là $gender và $year)

- Lưu ý: Khi khai báo phương thức, chúng ta có thể gán giá trị mặc định cho các đối số (ví dụ như các đối số $name, $gender, $year được gán giá trị mặc định lần lượt là Không biết, Không rõ, Trước công nguyên), nếu ta truy cập phương thức của đối tượng mà không truyền giá trị cho các đối số thì những đối số bị bỏ trống sẽ áp dụng giá trị mặc định lúc khai báo.

<?php
	abstract class CongDan{
		abstract public function intro($name);
	}
	class SinhVien extends CongDan{
		public function intro($name="Không biết", $gender="Không rõ", $year="Trước công nguyên"){
			echo "- Họ tên: {$name}<br>";
			echo "- Giới tính: {$gender}<br>";
			echo "- Năm sinh: {$year}<hr>";
		}
	}
	$sv = new SinhVien();
	$sv->intro();
	$sv->intro("Nguyễn Thành Nhân");
	$sv->intro("Nguyễn Thành Nhân", "Nam");
	$sv->intro("Nguyễn Thành Nhân", "Nam", 1993);
?>