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.
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ớpVisitorđể 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$nameriê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ứcgetInfo()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ọigetInfo()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 quaVisitor::$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
?>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
1Nền tảng về OOP
Tệp bên ngoàiGiới thiệu về OOPLớp và đối tượngTừ khóa $thisPhương thứcThuộc tínhHàm khởi tạo (__construct)Hàm hủy (__destruct)Ôn tập: máy tính đơn giản4Kế thừa
Kế thừa cơ bảnTừ khóa parent::Ghi đè phương thứcTừ khóa finalLớp trừu tượngÔn tập: hệ thống phân cấp nhân viên7Đóng gói
Công khai, được bảo vệ, riêng tưTìm hiểu sâu về bộ điều chỉnh quyền truy cậpGetter và setterẨn thông tinRút gọn hàm khởi tạo (8.0)Ôn tập: hệ thống hồ sơ học sinh2Không gian tên và tự động nạp
Giới thiệu về không gian tênTừ khóa useChuẩn tự động nạp PSR-4Trình tự động nạp của ComposerÔn tập: dự án có tổ chức5Giao diện và hợp đồng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnGiao diện và lớp trừu tượngGợi ý kiểu với giao diệnÔn tập: Máy tính hình học8Phương thức ma thuật
Giới thiệu về phương thức ma thuật__toString và __debugInfo__get, __set, __isset, __unset__call và __callStatic__clone và sao chép đối tượng__serialize và __unserializeÔn tập: Bộ sưu tập tùy chỉnh3Thuộc tính của lớp
Thuộc tính instance và staticHằng số trong lớpPhương thức và thuộc tính staticThuộc tính private và protectedThuộc tính chỉ đọc (PHP 8.1)Ôn tập: Trình quản lý tài khoản ngân hàng6Đa hình
Xem lại việc ghi đè phương thứcĐa hình qua giao diệnGợi ý kiểu và kiểu hợpLiên kết tĩnh muộnÔn tập: bộ xử lý thanh toánTự luyện tập: Trình biên dịch PHP online