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 của 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
chịu trách nhiệm hoàn toàn 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à
ClassName::staticMethod[];
1dò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
ClassName::staticMethod[];
4dò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 kiểu chiến đấu và mô tả 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?
Trong hướng dẫn này, chúng ta sẽ tìm hiểu thêm về các phương thức tĩnh trong PHP OOP. Chúng ta sẽ thảo luận về ý nghĩa của các phương thức tĩnh, khi nào sử dụng chúng, cú pháp và sự khác biệt giữa các phương thức tĩnh và không tĩnh
Các phương thức tĩnh trong PHP là gì?
- Các phương thức tĩnh được tạo bằng từ khóa tĩnh
- Các phương thức tĩnh của một lớp được gọi trực tiếp. Điều đó có nghĩa là chúng ta không cần tạo thể hiện của lớp để gọi phương thức tĩnh của nó
- Một lớp có thể chứa cả phương thức tĩnh và không tĩnh
- Để gọi phương thức tĩnh của một lớp, chúng ta sử dụng toán tử phân giải phạm vi
Cú pháp của phương thức tĩnh trong PHP
Cú pháp gọi phương thức tĩnh
ClassName::staticMethod[];
Ví dụ
- Trong ví dụ trên, chúng ta tạo một lớp có chứa phương thức tĩnh trong đó
- Chúng tôi gọi phương thức tĩnh của lớp này bên ngoài bằng cách sử dụng phương thức phân giải phạm vi
Gọi phương thức tĩnh bên trong lớp – PHP
- Trong PHP, từ khóa self cho phép gọi phương thức tĩnh của chính nó bên trong lớp. Hãy xem ví dụ sau, trong đó chúng ta tạo một lớp với phương thức tĩnh và gọi nó bên trong hàm tạo của lớp
- bản thân. methodName[] là cú pháp chung để gọi phương thức tĩnh bên trong lớp
Gọi phương thức tĩnh bên trong một lớp khác – PHP
Rất thú vị khi sử dụng trường hợp của các phương thức tĩnh, chúng ta có thể gọi một phương thức tĩnh công khai bên trong một lớp khác. Hãy nhớ rằng, nó phải là một phương thức tĩnh công khai
Gọi một phương thức tĩnh trong lớp con – PHP
Trong trường hợp thừa kế, chúng ta có thể gọi phương thức tĩnh của lớp cha bên trong lớp con bằng cách sử dụng từ khóa cha. Nhìn vào ví dụ dưới đây
- Trong ví dụ trên, chúng ta tạo một lớp cha với một số phương thức tĩnh
- Chúng tôi tạo một lớp khác mở rộng lớp cha
- Gọi phương thức tĩnh của lớp cha bằng từ khóa cha theo sau là tên của phương thức tĩnh
Ghi chú. Như chúng ta đã đề cập trong phần trước, việc gọi một phương thức tĩnh bên trong một lớp khác yêu cầu nó phải công khai. Nhưng trong trường hợp gọi phương thức tĩnh của lớp cha [kế thừa], công cụ sửa đổi truy cập phương thức tĩnh có thể là công khai hoặc được bảo vệ