Ở đây, chúng tôi khai báo một phương thức tĩnh. hoan nghênh[]. Sau đó, chúng ta gọi phương thức tĩnh bằng cách sử dụng tên lớp, dấu hai chấm [. ] và tên phương thức [không tạo phiên bản của lớp trước]
PHP - Tìm hiểu thêm về các phương thức tĩnh
Một lớp có thể có cả phương thức tĩnh và không tĩnh. Một phương thức tĩnh có thể được truy cập từ một phương thức trong cùng một lớp bằng cách sử dụng từ khóa self
và dấu hai chấm [. ]
Ví dụ
lời chào lớp học {
chức năng tĩnh công khai chào mừng[] {
echo "Xin chào thế giới. ";
}
public function __construct[] {
self. hoan nghênh[];
}
}
lời chào mới[];
?>
Các phương thức tĩnh cũng có thể được gọi từ các phương thức trong các lớp khác. Để làm điều này, phương thức tĩnh phải là public
Ví dụ
lời chào lớp học {
chức năng tĩnh công khai chào mừng[] {
echo "Xin chào thế giới. ";
}
}
class SomeOtherClass {
public function message[] {
chào. chào mừng[];
}
}
?>
Để gọi một phương thức tĩnh từ một lớp con, hãy sử dụng từ khóa parent
bên trong lớp con. Ở đây, phương thức tĩnh có thể là public
hoặc protected
Từ khóa static
được sử dụng để khai báo các thuộc tính và phương thức của một lớp là tĩnh. Các thuộc tính và phương thức tĩnh có thể được sử dụng mà không cần tạo một thể hiện của lớp
Từ khóa static
cũng được sử dụng để khai báo các biến trong hàm giữ nguyên giá trị của chúng sau khi hàm kết thúc
Vậy điều gì sẽ xảy ra nếu chúng tôi quyết định thêm loại chiến đấu thứ tư vào BattleManager
. Không vấn đề gì. thêm một hằng số mới, sau đó cập nhật logic phương thức battle[]
cho bất kỳ điều gì thú vị mà loại mới này thực hiện
Nhưng bất ngờ. Nếu chúng ta quên thêm loại mới vào index.php
, thì sẽ không ai có thể sử dụng nó. Thực sự, tôi muốn BattleManager
hoàn toàn chịu trách nhiệm về các loại trận chiến để đó là tệp duy nhất tôi cần chạm vào khi có gì đó thay đổi
Để làm điều đó, hãy tạo một hàm mới trong BattleManager
sẽ trả về tất cả các loại và mô tả của chúng. gọi nó là public
2
dòng 1 - 2class BattleManager{. dòng 5 - 75hàm công khai getAllBattleTypesWithDescriptions[]{. dòng 78 - 82}. dòng 84 - 90}
Tại đây, trả về một mảng có loại là khóa và mô tả sẽ được sử dụng trong trình đơn thả xuống làm giá trị
dòng 1 - 2class BattleManager{. dòng 5 - 75public function getAllBattleTypesWithDescriptions[]{return mảng[self. TYPE_NORMAL => 'Bình thường',tự. TYPE_NO_JEDI => 'Không có sức mạnh của Jedi',chính bạn. TYPE_ONLY_JEDI => 'Chỉ có sức mạnh của Jedi'];}. dòng 84 - 90}
Thật tuyệt vời. Tiếp theo, nếu chúng ta gọi phương thức này trong index.php
, chúng ta có thể xóa các giá trị được mã hóa cứng ở đó. Tất nhiên, phương pháp này là không tĩnh. Điều đó có nghĩa là chúng ta cần gọi phương thức này trên đối tượng BattleManager
. Tạo một cái mới bằng cách nói public
5
dòng 1 - 11$battleManager = $container->getBattleManager[];. dòng 13 - 141
Bây giờ thêm BattleManager
0
dòng 1 - 11$battleManager = $container->getBattleManager[];$battleTypes = $battleManager->getAllBattleTypesWithDescriptions[];. dòng 14 - 141
Cuối cùng, cuộn xuống. Thay cho các giá trị được mã hóa cứng, BattleManager
1 trên BattleManager
2 là BattleManager
3. Kết thúc BattleManager
1 và làm cho tùy chọn động bằng cách in BattleManager
5 và
dòng 1 - 32. dòng 34 - 58. dòng 61 - 95. dòng 99 - 122Battle Type$typeText]. ?>. dòng 131 - 134
Vâng. Hãy thử một lần. Nhấp vào liên kết "Trận chiến lần nữa". Và vâng. Trình đơn thả xuống có ba giá trị giống như trước đây
Đây là nơi mọi thứ trở nên thú vị. Chúng tôi đã làm cho BattleManager
6 không tĩnh. Thay vào đó, chúng ta có thể làm cho nó tĩnh không?
Để biết, hãy tự hỏi mình hai câu hỏi này
Nó có hợp lý không - về mặt triết học - đối với phương thức
BattleManager
6 được gắn vào lớp thay vì một đối tượng? . các loại và mô tả trận chiến sẽ không khác nhau đối với các đối tượngBattleManager
khác nhau;Phương thức có cần biến
BattleManager
9 không? . Nhưng chúng tôi không sử dụngBattleManager
9
Vì vậy, hãy biến phương thức này thành battle[]
2 bằng cách nói battle[]
3
dòng 1 - 2class BattleManager{. dòng 5 - 75hàm tĩnh công khai getAllBattleTypesWithDescriptions[]{. dòng 78 - 82}. dòng 84 - 90}
Điều duy nhất thay đổi bây giờ là cách chúng ta gọi phương thức của mình. Đầu tiên, chúng ta không cần một đối tượng BattleManager
nào cả. Thay vào đó, chỉ cần nói battle[]
5
dòng 1 - 11$battleTypes = BattleManager. getAllBattleTypesWithDescriptions[];. dòng 13 - 140
Ok, thử nó ra. nó hoạt động
Hãy nhìn xem, thứ tĩnh và không tĩnh này có thể khó khăn. Và trong rất nhiều hướng dẫn khác, bạn sẽ thấy điều này được dạy ngược lại. họ sẽ cho bạn xem nội dung tĩnh trước, vì nó dễ hơn một chút. Sau đó, họ sẽ dạy các thuộc tính và phương thức không tĩnh
Nhưng đoán xem. đó không phải là cách các lập trình viên giỏi viết mã trong thế giới thực. họ làm cho hầu hết mọi thứ không tĩnh. Và để bắt đầu, tôi muốn các bạn cũng làm cho mọi thứ không tĩnh. Sau đó, khi bạn cảm thấy thoải mái hơn, bạn sẽ bắt đầu thấy các tình huống khác nhau mà ở đó bạn có thể làm cho một số thứ tĩnh. Thực ra việc thay đổi mọi thứ từ battle[]
6 thành battle[]
2 dễ dàng hơn nhiều so với cách khác. Và khi bạn làm cho mọi thứ không tĩnh, nó buộc bạn phải xây dựng mã tốt hơn. Và đó không phải là lý do tại sao chúng ta ở đây?