Phương thức và thuộc tính 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 17 trên 91.
Tương tự như thuộc tính có thể là thuộc tính tĩnh, phương thức cũng có thể thuộc về chính lớp thay vì từng đối tượng riêng lẻ. Bạn gọi phương thức tĩnh trực tiếp trên lớp mà không cần tạo instance trước.
Bạn khai báo một phương thức tĩnh bằng từ khóa static và gọi phương thức đó bằng tên lớp cùng toán tử :::
<?php
class MathHelper {
public static function add($a, $b) {
return $a + $b;
}
public static function multiply($a, $b) {
return $a * $b;
}
}
echo MathHelper::add(5, 3) . "\n";
echo MathHelper::multiply(4, 2);
Đầu ra:
8
8Phương thức tĩnh hoạt động hiệu quả với các thuộc tính tĩnh. Một cách làm phổ biến là dùng phương thức tĩnh để quản lý dữ liệu dùng chung của lớp:
<?php
class Counter {
private static $count = 0;
public static function increment() {
self::$count++;
}
public static function getCount() {
return self::$count;
}
}
Counter::increment();
Counter::increment();
echo Counter::getCount();
Đầu ra:
2Lưu ý rằng các phương thức tĩnh không thể dùng $this vì không có đối tượng nào được khởi tạo. Chúng chỉ có thể truy cập các thuộc tính tĩnh và các phương thức tĩnh khác bằng self::.
Điểm chính: Phương thức tĩnh hữu ích cho các hàm tiện ích không cần trạng thái của đối tượng hoặc để quản lý dữ liệu cấp lớp. Chúng cung cấp chức năng mà không cần khởi tạo đối tượng.
Thử thách
DễHãy xây dựng một hệ thống tạo ID dùng các phương thức và thuộc tính tĩnh để tạo mã định danh duy nhất mà không cần khởi tạo đối tượng.
Bạn sẽ tạo hai tệp để sắp xếp code:
IdGenerator.php: Định nghĩa lớpIdGeneratorđể quản lý việc tạo ID duy nhất chỉ bằng các thành phần tĩnh. Lớp này cần có thuộc tính tĩnh riêng tư$lastIdbắt đầu từ0và thuộc tính tĩnh riêng tư$prefixđược đặt thành"ID". Tạo phương thức tĩnhgenerate()để tăng ID cuối cùng lên một đơn vị và trả về chuỗi đã định dạng, kết hợp tiền tố với ID mới (như"ID1","ID2", v.v.). Thêm phương thức tĩnhsetPrefix($newPrefix)để thay đổi tiền tố và phương thức tĩnhgetLastId()để trả về giá trị hiện tại của$lastId.main.php: Nạp tệp lớp IdGenerator. Tạo hai ID bằng tiền tố mặc định và in mỗi ID trên một dòng riêng. Sau đó, dùng phương thức tĩnh để đổi tiền tố thành"USER", tạo thêm hai ID và in từng ID. Cuối cùng, gọi phương thức tĩnh thích hợp để in số ID cuối cùng.
Hãy nhớ rằng bạn gọi trực tiếp phương thức tĩnh trên lớp bằng ClassName::methodName(), còn bên trong lớp, bạn truy cập thuộc tính tĩnh bằng self::$propertyName. Vì không có đối tượng cụ thể, bạn không thể dùng $this trong các phương thức tĩnh.
Đầu ra cần thể hiện tiến trình của các ID với những tiền tố khác nhau, qua đó cho thấy thuộc tính tĩnh giữ nguyên giá trị qua nhiều lần gọi phương thức.
Tự làm thử
<?php
// Nhúng tệp chứa lớp IdGenerator
require_once 'IdGenerator.php';
// TODO: Tạo hai ID với tiền tố mặc định và in mỗi ID trên một dòng riêng
// TODO: Đổi tiền tố thành "USER" bằng phương thức tĩnh
// TODO: Tạo thêm hai ID và in mỗi ID trên một dòng riêng
// TODO: In ra số thứ tự của ID cuối cùng bằng phương thức tĩnh phù hợp
?>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