Menu
CoddyTech

Thuộc tính instance và static

Thuộc phần Lập trình hướng đối tượng trong hành trình PHP của Coddy. Bài học 15 trên 91.

Khi tạo thuộc tính trong một lớp, bạn cần quyết định xem thuộc tính đó thuộc về từng đối tượng riêng lẻ hay thuộc về chính lớp đó. Đây là điểm khác nhau giữa thuộc tính của instance và thuộc tính tĩnh.

Thuộc tính của instance là mặc định. Mỗi đối tượng có bản sao riêng của thuộc tính, và việc thay đổi thuộc tính trong một đối tượng không ảnh hưởng đến các đối tượng khác:

<?php
class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo $alice->name . "\n";
echo $bob->name . "\n";

Đầu ra:

Alice
Bob

Thuộc tính tĩnh thuộc về lớp, không thuộc về một đối tượng cụ thể nào. Bạn khai báo chúng bằng từ khóa static và truy cập chúng bằng tên lớp cùng với :: thay vì dùng một đối tượng cùng với ->:

<?php
class User {
    public static $count = 0;
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
        self::$count++;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo User::$count;

Đầu ra:

2

Hãy chú ý rằng $count được dùng chung giữa tất cả các đối tượng. Mỗi lần tạo một User mới, biến $count lại tăng lên. Bên trong lớp, chúng ta dùng self::$count để tham chiếu đến thuộc tính tĩnh.

Điểm chính: Dùng thuộc tính của đối tượng khi mỗi đối tượng cần một giá trị riêng. Dùng thuộc tính tĩnh khi bạn cần chia sẻ dữ liệu giữa tất cả đối tượng của một lớp, chẳng hạn như đếm số đối tượng hoặc lưu cấu hình.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống theo dõi khách truy cập để minh họa sự khác nhau giữa thuộc tính của từng đối tượng (riêng cho mỗi khách truy cập) và thuộc tính tĩnh (dùng chung cho tất cả khách truy cập).

Bạn sẽ tạo hai tệp để sắp xếp code:

  • Visitor.php: Định nghĩa một lớp Visitor để theo dõi từng khách truy cập và ghi lại tổng số khách truy cập. Mỗi khách truy cập có thuộc tính $name riêng (thuộc tính của từng đối tượng), còn thuộc tính $totalVisitors được dùng chung cho tất cả các đối tượng (thuộc tính tĩnh). Hàm khởi tạo nhận tên, gán tên đó và tăng tổng số khách truy cập. Thêm một phương thức getInfo() trả về "[name] is visitor #[totalVisitors]".
  • main.php: Nạp tệp lớp Visitor, sau đó tạo ba khách truy cập có tên "Alice", "Bob" và "Charlie" theo thứ tự đó. Sau khi tạo cả ba, in kết quả gọi getInfo() trên từng khách truy cập, mỗi kết quả trên một dòng riêng, sau đó in tổng số khách truy cập bằng cách truy cập trực tiếp thuộc tính tĩnh từ lớp qua Visitor::$totalVisitors.

Hãy nhớ rằng bên trong lớp, bạn truy cập thuộc tính tĩnh bằng self::$propertyName, còn bên ngoài lớp, bạn dùng ClassName::$propertyName. Như thường lệ, bạn truy cập thuộc tính của từng đối tượng bằng $this->propertyName.

Đầu ra của bạn sẽ hiển thị từng khách truy cập cùng số thứ tự được gán, sau đó là tổng số cuối cùng trên dòng cuối.

Tự làm thử

<?php
// Nạp lớp (class) Visitor
require_once 'Visitor.php';

// TODO: Tạo ba khách tham quan tên là "Alice", "Bob" và "Charlie" (theo đúng thứ tự đó)

// TODO: In ra kết quả của getInfo() cho từng khách tham quan (mỗi kết quả trên một dòng riêng)

// TODO: In ra tổng số khách tham quan bằng Visitor::$totalVisitors
?>
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch PHP online