hướng đối tượng

Hướng đối tượng, tầm vực của thuộc tính và phương thức trong PHP

Phần 2 : Hướng đối tượng, tầm vực của thuộc tính và phương thức trong PHP

Như đã có nhắc trong bài viết Phần 1 : Hướng đối tượng là gì, cách khai báo, thiết lập và truy xuất đối tượng, thuộc tính, phương thức ,hôm nay mình giới thiệu đến các bạn bài hướng dẫn mang tựa đề : “Hướng đối tượng, tầm vực của thuộc tính và phương thức trong PHP

Mục đích của tầm vực chính là gia tăng khả năng kiểm soát các đối tượng, các phương thức và thuộc tính sẽ được gán thêm những giá trị tầm vực.
Cho phép chúng ta kiểm soát khả năng truy cập (như thế nào và ở nơi đâu) của thuộc tính và phương thức.
Có 3 loại tầm vực của thuộc tính và phương thức đó là :public, protected và private. Ngoài ra, static cũng là một loại tầm vực của biến, cho phép chúng ta truy cập vào thuộc tính hoặc phương thức mà không cần khởi tạo class.

a) Thuộc tính và phương thức mang tầm vực public

Với các thuộc tính và phương thức mang tầm vực 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.
Trong ví dụ sau

<?php
 class KungfuClass
 {
     
     public $pro1 = "Toi la thuoc tinh thu 1";
     public $pro2 = "Toi la thuoc tinh thu 2";
     public function method1(){
         return "Toi la phuong thuc cua class KungfuClass !";
     }
 }
 $kungfuClass = new KungfuClass(); 
 echo $kungfuClass -> pro1; // Xuat ra trinh duyet chu "Toi la thuoc tinh thu 1" 
 echo $kungfuClass -> pro2; // Xuat ra trinh duyet chu "Toi la thuoc tinh thu 2" 
 echo $kungfuClass -> method1(); // Xuat ra trinh duyet chu "Toi la phuong thuc cua class KungfuClass !"

?>

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ó.

b) Thuộc tính và phương thức mang tầm vực protected

Đối với những thuộc tính hay phương thức mang tầm vực 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ụ sau:

<?php

        class KungfuClass
        {
            
            protected $pro1 = "Toi la thuoc tinh cua class KungfuClass!";

            protected function method1(){
                return "Toi la phuong thuc cua class KungfuClass !";
            }
        }
        $kungfuClass = new KungfuClass();
        echo $kungfuClass->pro1;
    ?>

Khi thực thi đoạn script trên, hệ thống sẽ thông báo lỗi là : Fatal error: Call to protected method …

Điều này có ý nghĩa là đối với các thuộc tính hay phương thức mang tầm vực 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 kế thừa class này.

Sửa code lại như 2 ví dụ dưới đây :

Ví du 1 :

<?php
    class KungfuClass
    {
        
        protected $pro1 = "Toi la thuoc tinh cua class KungfuClass!";

        protected function method1(){
            return "Toi la phuong thuc cua class KungfuClass !";
        }
        public function method2(){
            return $this->pro1;
        }
    }
    $kungfuClass = new KungfuClass();
    echo $kungfuClass->method2();// Xuất ra ngoài trình duyệt dòng chữ "Toi la thuoc tinh cua class KungfuClass!"

?>

Ở ví dụ 1, ta có thể truy xuất thuộc tính $pro1 thông qua phương thức method2, và vì method2 mang tầm vực public,

nên ta có thể truy xuất phương thức này bên ngoài class, và từ đó lấy được giá trị của thuộc tính $pro1
Ví dụ 2 :

<?php
    class KungfuClass
    {
        
        protected $pro1 = "Toi la thuoc tinh cua class KungfuClass!";

        protected function method1(){
            return "Toi la phuong thuc cua class KungfuClass !";
        }
        public function method2(){
            return $this->pro1;
        }
    }
    class KungfuChildClass extends KungfuClass{
        public function callmethod1(){
            return $this->method1();
        }
    }
    $kungfuChildClass = new KungfuChildClass();
    echo $kungfuChildClass->callmethod1();// Xuất ra ngoài trình duyệt dòng chữ "Toi la phuong thuc cua class KungfuClass !"

?>

Ở ví dụ 2, class KungfuchildClass là lớp con kế thừa lớp cha là KungfuClass, chính vì thế nó thống qua phương thức callmethod1 sẽ truy xuất được phương thức method1 mang tầm vực protected của lớp cha mà không gặp bất kì trở ngại nào, đồng thời cũng chính bản thân phương thức callmethod1 mang tầm vực là public, nên nó có thể được truy xuất bên ngoài class, và từ đó xuất ra dòng chữ “Toi la phuong thuc cua class KungfuClass !”

c ) Thuộc tính hoặc phương thức mang tầm vực private

Tầm vực private chính là tầm vực khó tính nhất trong 3 loại tầm vực là public, protected, private. Ví những thuộc tính hay phương thức mang tầm vự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 kế thừa class này cũng không thể truy xuất được.Để hiểu rõ hơn chúng ta hãy nhìn 2 ví dụ dưới đây :

Ví du 1 :

Gợi ý : Bạn là người mới và muốn tìm hiểu về Bitcoin nhưng không biết bắt đầu từ đâu? Click xem ngay Hướng Dẫn Đầu Tư Bitcoin Cho Người Mới nhé!

<?php
    class KungfuClass
    {
        
        private $pro1 = "Toi la thuoc tinh cua class KungfuClass!";

        private function method1(){
            return "Toi la phuong thuc cua class KungfuClass !";
        }
        public function method2(){
            return $this->pro1;
        }
    }
    $kungfuClass = new KungfuClass();
    echo $kungfuClass->method1();// Báo lỗi Call to private method...

?>

Ví dụ 2 :

<?php
        class KungfuClass
        {
            
            private $pro1 = "Toi la thuoc tinh cua class KungfuClass!";

            private function method1(){
                return "Toi la phuong thuc cua class KungfuClass !";
            }
            public function method2(){
                return $this->pro1;
            }
        }

        class KungfuChildClass extends KungfuClass
        {
            public function callmethod1(){
                return $this->method1;
            }
        }
        $kungfuChildClass = new KungfuChildClass();
        echo $kungfuChildClass->callmethod1();// tiếp tục báo lỗi Call to private method...

    ?>

2 ví dụ trên đều báo lỗi liên quan đến vấn đề truy xuất biến ở cấp độ private, chính vì thế để có thể truy xuất được thuộc tính hay phương thức mang tầm vực private, chúng ta chỉnh sửa đoạn code lại như sau :

<?php
    class KungfuClass
    {
        
        private $pro1 = "Toi la thuoc tinh cua class KungfuClass!";

        private function method1(){
            return "Toi la phuong thuc cua class KungfuClass !";
        }
        public function method2(){
            return $this->pro1;
        }
    }
    $kungfuClass = new KungfuClass();
    echo $kungfuClass->method2();// Xuất ra dòng chữ "Toi la thuoc tinh cua class KungfuClass!"

?>

d ) 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. Bạn chỉ cần cung cấp theo công thức :

 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.” .

Để giải thích về điều này, chúng ta hãy cùng nhau xem xét ví dụ dưới đây và tự ngẫm ra mục đích của static cho bản thân mình.

<?php
 
class KungfuClass
{
    public $prop1 = "Toi la thuoc tinh cua class KungfuClass";
 
    public static $count = 0;
 
    public function __construct()
    {
        echo 'Class "', __CLASS__, '" duoc khoi tao!<br />';
    }
 
    public function __destruct()
    {
        echo 'Class "', __CLASS__, '" bi huy.<br />';
    }
 
 
    public static function addOne()
    {
        return "Gia tri cua bien count la: " . ++self::$count . ".<br />";
    }
}
 
// Thuc hien vong lap while
 
do
{
// Goi phuong thuc addOne ma khong can khoi tao class KungfuClass
    echo KungfuClass::addOne();
} while ( KungfuClass::$count < 5 );
 
?>

Save lại đoan script này và chạy trên trình duyệt sẽ xuất hiên lần lượt các dòng chữ :

    Gia tri cua bien count la: 1.
    Gia tri cua bien count la: 2.
    Gia tri cua bien count la: 3.
    Gia tri cua bien count la: 4.
    Gia tri cua bien count la: 5.

 

Vậy là xong, chúng ta đã kết thúc bài viết thứ 2 trong chuỗi serial bài viết về lập trình hướng đối tượng. có bất kỳ thắc mắc thì hãy để lại comment bên dưới nhé. Thân !

Nguon : kungfuphp.com

Có ích

hướng đối tượng trong PHP

Hướng đối tượng trong PHP

Hướng đối tượng trong PHP là gì ? Tại sao lại sử dụng hướng đối …

6 bình luận

  1. ở phần cuối nói về static:
    tại sao lại dùng self?
    dùng self có khác gì với dùng this?

  2. construct và destruct chính là hàm khởi tạo và hàm hủy trong PHP. Nó là hàm magic. Bạn có thể xem bài này để hiểu rõ hơn : https://kungfuphp.com/php-nang-cao/cac-phuong-thuc-magic-trong-huong-doi-tuong-php.html

  3. ad cho mình hỏi 2 hàm construct và destruct ad thêm vào để làm gì vậy

  4. selft trong ++self ý nghĩa là j ấy nhỉ! thank kungfuphp 🙂

Trả lời Yasuo Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *