-Như ở phần đầu của series mình có nói là hướng đối tượng có tính bảo mật cao. Và để chứng minh cho câu nói đó bài hôm nay chúng ta sẽ cùng tìm hiểu về visibility(phạm vi) của thuộc tính và phương thức.
1, Khái quát chung.
-Trong phương pháp lập trình hướng đối tượng các thuộc tính và phương thức được ràng buộc về mức độ truy cập, giúp cho dữ liệu được bảo mật hơn.Cụ thể thể là ba phạm vi: private, protected, public (Nếu không khai báo visibility thì mặc định nó sẽ là public).Khi khai báo kèm theo phạm vi thì chúng ta sẽ sử dụng cú pháp:
class className
{
//khai báo thuộc tính
visibility $propertyName;
//Khai báo phương thức
visibility function methodName()
{
}
}
Trong đó: visibility là một trong 3 từ khóa private, protected, public.
2, Private.
-Private là giới hạn hẹp nhất của thuộc tính và phương thức trong hướng đối tượng. Khi các thuộc tính và phương thức khai báo với giới hạn này thì các thuộc tính phương thức đó chỉ có thể sử dụng được trong class đó, bên ngoài class không thể nào có thể sử dụng được nó kể cả lớp kế thừa nó cũng không sử dụng được.
VD: Mình sẽ khai báo và khởi tạo lớp person có các phương thức, và thuộc tính ở private.
class Person
{
//khai báo thuộc tính name ở private
private $name;
//Khai báo phương thức run ở private
private function run()
{
return 'Đây là hàm run';
}
}
//Khởi tạo class
$person = new Person();
//gọi phương thức name
$person->name;
-Sau đó các bạn chạy chương trình lên sẽ nhận được một dòng thông báo lỗi có nội dung: Fatal error: Cannot access private property Person::$name in ...
-Như vậy các bạn có thể thấy khi sử dụng private
thì chúng ta không có thể gọi và truy cập vào nó từ bên ngoài class được đúng không? Và nếu như bạn muốn truy cập vào nó ở bển ngoài class thì bạn phải sử dụng các phương thức có visibility là public
hoặc không khai báo visibility.
VD:
class Person
{
//khai báo thuộc tính name ở private
private $name;
//Khai báo phương thức run ở private
private function run()
{
return 'Đây là hàm run';
}
function setName($name)
{
$this->name = $name;
}
function getName()
{
return $this->name;
}
function getRunMethod()
{
return $this->run();
}
}
//Khởi tạo class
$person = new Person();
//set thuộc tính name
$person->setName('Vũ Thanh Tài');
//Lấy ra thuộc tính name
echo $person->getName();
//Gọi giá trị của phương thức run
echo $person->getRunMethod();
3, Protected.
-Khác với private một chút thì các phương thức và thuộc tính khi khai vào với visibility là protected thì chúng ngoài được sử dụng trong class đó ra thì class con kết thừa từ nó cũng có thể sử dụng được, như bên ngoài class không có thể sử dụng được.
VD:
class Person
{
//khai báo thuộc tính xe dạng protected
protected $name;
}
class Male extends Person
{
function setName($name)
{
//đúng vì sử dụng trong class con
$this->name = $name;
}
function getName()
{
//đúng vì sử dụng trong class con
return $this->name;
}
}
//khởi tạo lớp Person
$person = new Person();
//Sai vì biến name có visibility là protect nên không tác động từ ngoài class vào được
$person->name;
//khởi tạo lớp Male
$male = new Male();
//tác động vào biến name qua hàm setName
$male->setName('Vũ Thanh Tài');
echo $male->getName();
4, Public.
-Đây là visibility có mức độ truy cập rộng nhất trong hướng đối tượng, khi một thuộc tính hay phương thức sử dụng visibility này thì chúng ta có thể tác động vào thuộc tính hay phương thức đó từ cả trong lẫn ngoài class. Thông thường khi không khai báo visibility thì chương trình dịch tự nhận nó là public
nhưng để cho đúng chuẩn thì mọi người lên khai báo từ khóa này vào thay vì bỏ trống.
VD:
class Person
{
//khai báo thuộc tính xe dạng protected
public $name;
function setName($name)
{
//đúng vì sử dụng trong class con
$this->name = $name;
}
function getName()
{
//đúng vì sử dụng trong class con
return $this->name;
}
}
//khởi tạo lớp Person
$person = new Person();
//tác động vào thuộc tính name
$person->name = 'Vũ Van A';
//tác động vào biến name qua hàm setName
$person->setName('Vũ Thanh Tài');
echo $person->getName();
5, Lời kết.
-Như vậy mình đã giới thiệu xong đến mọi người về quyền hạn truy cập của thuộc tính và phương thức trong hướng đối tượng rồi, bài tiếp theo chúng ta sẽ tìm hiểu về Tính đa hình trong hướng đối tượng.
Đăng ký nhận tin.
Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!
Cảm ơn bạn với những bài viết hữu ích ở blog. Hiện tại mình chưa thấy website bạn viết về Resfull API, bạn có định chia sẻ về cái này không. Đang chờ đón đọc và tham khảo
Thanh Chính
6 năm trước
Bài viết trên mình thấy trong phần 2.Private bạn nói là: "thuộc tính và phương đó chỉ có thể sử dụng được trong class đó, bên ngoài class không thể nào có thể sử dụng được" mình thấy không đúng lắm. Như trong ví dụ ở mục trên trong class Person mình khai báo phương thức set và get để đặt giá trị và lấy giá trị đó ra thì khi khởi tạo một đối tượng ($person) thì qua phương thức set và get vẫn có thể truy cập để lấy giá trị của nó chứ không phải là không thể nào sử dụng được.
Piter Pan
6 năm trước
Mình đang nói là cách trực tiếp nhé bạn, còn gián tiếp thì có rất nhiều cách bạn ạ!
Bạn cũng có thể sử dụng magic method để truy cập bình thường.
Vũ Thanh Tài
6 năm trước