Bài 04: Mức truy cập thuộc tính và phương thức trong PHP

Tổng quan về OPP PHP có 3 mức truy cập một thuộc tính & phương thức của một đối tượng. Public: Mức truy cập công khai. Protected: Mức truy cập bên trong chính class đó và class con kế thừa từ nó Private: Mức truy cập bên trong class. 1. Mức truy cập public Với các thuộc tính ...

Tổng quan về OPP PHP có 3 mức truy cập một thuộc tính & phương thức của một đối tượng.

  • Public: Mức truy cập công khai.
  • Protected: Mức truy cập bên trong chính class đó và class con kế thừa từ nó
  • Private: Mức truy cập bên trong class.

1. Mức truy cập public

Với các thuộc tính và phương thức có mức truy cập là public, chúng có thể được truy cập ở bất cứ nơi đâu, bao gồm bên trong và bên ngoài class. Trong PHP, mặc định khi một thuộc tính hay phương thức mà không được gán tầm vực, thì mặc định thuộc tính hay phương thức đó sẽ mang tầm vực là public.

Ví dụ:

class CustomerClass{
	// Cacs thuộc tính
	public $fullName = "";
	public $officeCode = "";
	
	// Các phương thức
	public function getFullName(){
		return $this->fullName;
	}
	public function getOfficeCode(){
		return $this->fullName;
	}
}
// Khởi tạo một dối tượng
$customer = new CustomerClass(); 

// Gán giá trị của $fullName;
$customer->fullName = 'Nguyễn Văn B';

// Lấy giá trị thuộc tính fullName;
echo $customer->fullName(); // Kết quả Nguyễn Văn B
// Or
$customer->getFullName(); // Kết quả Nguyễn Văn B
Thuộc tính và phương thức mang tầm vực là public sẽ được truy xuất bất kì phạm vi nào dù là bên trong hay bên ngoài class chứa nó.

2. Mức truy cập Protected.

Đối với những thuộc tính hay phương thức có mức truy cập là protected, chúng chỉ có thể được truy xuất bên trong class hoặc những class kế thừa class này.
Ví dụ 01:
class CustomerClass {
	// Thuộc tính
	protected $fullName = "Nguyễn Văn A";
	
	// Phương thức
	protected function getFullName(){
		return $this->fullName;
	}
}

// Khởi tạo đối tượng
$customer = new CustomerClass();
// Lấy giá trị của thuộc tính.
echo $customer->getFullName();

Khi thực thi đoạn script trên, hệ thống sẽ thông báo lỗi là : Fatal error: Cannot access protected property CustomerClass

Điều này có ý nghĩa là đối với các thuộc tính hay phương thức có mức truy cập là protected thì chúng sẽ không thể được truy xuất tùy tiện bất cứ nơi đâu mà chỉ có thể được truy xuất trong chính class hoặc class con kế thừa class này.

Ví dụ 02:

 Truy cập phương thức thuộc tính từ function mức truy cập là public

class CustomerClass {
	// Thuộc tính
	protected $fullName = "Nguyễn Văn A";
	
	// Phương thức
	protected function getFullName(){
		return $this->fullName;
	}
	public function getFullName2(){
		return $this->fullName;
	}
}

// Khởi tạo đối tượng
$customer = new CustomerClass();
// Lấy giá trị của thuộc tính.
echo $customer->getFullName2(); // Kết quả: Nguyễn Văn A
Khi chạy đoạn mã trên sẽ đưa ra kết quả là "Nguyễn Văn A". Vì hàm getFullName2() có mức truy cập là public khi đó $customer có thể truy xuất tới hàm này. Và hàm này truy xuất tới thuộc tính của CustomerClass.

Ví dụ 03:

Truy cập thuộc tính/ phương thức từ class con.

class CustomerClass {
	// Thuộc tính
	protected $fullName = "Nguyễn Văn A";
	
	// Phương thức
	protected function getFullName(){
		return $this->fullName;
	}
}
class CustomerChildClass extends CustomerClass{
	public function getFullNameParent(){
		return $this->getFullName();
	}
}

// Khởi tạo đối tượng
$customer_child = new CustomerChildClass();
// Lấy giá trị của thuộc tính.
echo $customer_child->getFullNameParent();
Ở ví dụ trên, class CustomerChildClass là lớp con kế thừa lớp cha là CustomerClass, chính vì thế nó thông qua phương thức getFullNameParent()  sẽ truy xuất được phương thức getFullName() có mức truy cập là protected của lớp cha mà không gặp bất kì trở ngại nào, đồng thời chính bản thân phương thức getFullNameParent() mang tầm vực là public, nên nó có thể được truy xuất bên ngoài class.

3. Mức truy cập Private.

Mức truy cập private chính là mức khó tính nhất trong 3 mức là public, protected, private. Vì những thuộc tính hay phương thức có mức này chỉ có thể được truy xuất bên trong chính class chứa nó. Thậm chí những class(lớp) kế thừa class(lớp) này cũng không thể truy xuất được.

Ví dụ 01:

class CustomerClass {
	// Thuộc tính
	private $fullName = "Nguyễn Văn A";
	
	// Phương thức
	private function getFullName(){
		return $this->fullName;
	}
}
// Khởi tạo đối tượng
$customer = new CustomerClass();
// Lấy giá trị của thuộc tính.
echo $customer->getFullName(); // Báo lỗi Call to undefined property...

Cũng giống với mức truy cập protected. Chúng ta không thể truy cập tới bất kỳ thuộc tính & phương thức của một class có mức truy cập là private.

Ví dụ 02:

Truy cập thuộc tính/phương thức từ lớp kế thừa có mức truy cập là public.

class CustomerClass {
	// Thuộc tính
	private $fullName = "Nguyễn Văn A";
	
	// Phương thức
	private function getFullName(){
		return $this->fullName;
	}
}
class CustomerChildClass extends CustomerClass {
	// Phương thức
	private function getFullNameParent(){
		return $this->getFullName();
	}
}
// Khởi tạo đối tượng
$customerchild = new CustomerChildClass();
// Lấy giá trị của thuộc tính.
echo $customerchild->getFullNameParent; // Báo lỗi Call to private method...
Cả hai ví dụ trên đều báo lỗi từ đó bạn sẽ thấy mức truy cập private khó tính đến độ nào. Ngay cả con nó, nó còn hết tình hết nghĩa không cho thừa hưởng tý tài sản nào :)
Để co thể truy cập được thuộc tính/ phương thức chúng ta cần chỉnh sửa như sau:
class CustomerClass {
	// Thuộc tính
	private $fullName = "Nguyễn Văn A";
	
	// Phương thức
	private function getFullName(){
		return $this->fullName;
	}
	public function getFullName2(){
		return $this->fullName;
	}
}
// Khởi tạo đối tượng
$customer = new CustomerClass();
// Lấy giá trị của thuộc tính.
echo $customer->getFullName2(); // Kết quả: Nguyễn Văn A

4. Thuộc tính và phương thức static.

Từ khóa static cho phép các thuộc tính và phương thức có thể được truy cập mà không cần khởi tạo class.

Cú pháp: Tên class + toán tử phân giải phạm vi “::” + tên thuộc tính hoặc phương thức.

Một trong những lợi ích chính khi sử dụng thuộc tính static là chúng giữ các giá trị được lưu trữ trong suốt khoảng thời gian script tồn tại

Ví dụ:

class CustomerClass {
	// Thuộc tính
	public static $fullName = "Nguyễn Văn A";
	
	// Phương thức
	public static function getFullName(){
		return self::$fullName;
	}
}
// Lấy giá trị của thuộc tính.
echo CustomerClass::$fullName; // Kết quả: Nguyễn Văn A
// Gọi tới phương thức
echo CustomerClass::getFullName(); // Kết quả: Nguyễn Văn A
0