Tôi đang cố gắng tìm ra cách hoàn thành tốt nhất công việc thiết kế của mình trên các lớp học của mình.
hoàn cảnh của tôi.
Tôi có một lớp trừu tượng đặt hàng có chứa các phương thức đặt hàng và thông tin được yêu cầu cho 2 lớp trẻ em
order_Outbound
và Order_inbound
Mỗi lớp con yêu cầu 2 phương thức công khai tĩnh được gọi là Tạo và nhận
Nhưng từ những gì tôi đã đọc về Php 5.3, bạn không thể có phương pháp tĩnh trừu tượng ???
Vì vậy, suy nghĩ của tôi là có một giao diện Order_interface đảm nhận vai trò đó nhưng làm cách nào để thực hiện nó. Tôi vẫn thực hiện nó trong lớp phụ huynh
Trong trường hợp đó, lớp trừu tượng cha vẫn yêu cầu tôi tạo phương thức GET và tạo trong lớp trừu tượng. Hay tôi thực hiện nó ở trẻ em và mở rộng từ lớp trừu tượng ???
CŨNG!!! Cả trẻ em đi ra ngoài và trong nước đều yêu cầu một phương thức tĩnh nhưng yêu cầu các tham số khác nhau được thông qua
Tôi có thể trong giao diện có chức năng tĩnh công khai []
và trong quá trình triển khai của nó trong Order_outBound khai báo nó là chức năng tĩnh công khai [$ địa chỉ, $ tham chiếu, $ orderID]
Khi được hỏi ngày 13 tháng 5 năm 2011 lúc 1:11May 13, 2011 at 1:11
4
Trong hầu hết các ngôn ngữ, bao gồm PHP, bạn không thể yêu cầu một lớp để thực hiện các phương thức tĩnh.
Điều này có nghĩa là không kế thừa lớp, cũng không phải giao diện, sẽ cho phép bạn yêu cầu tất cả người triển khai xác định một phương thức tĩnh. Điều này có lẽ là do các tính năng này được thiết kế để hỗ trợ đa hình hơn là định nghĩa loại. Trong trường hợp các phương thức tĩnh, bạn sẽ không bao giờ có một đối tượng để giải quyết loại từ đó, vì vậy sẽ phải làm rõ ràng ClassName::Method
, vì vậy lý thuyết là bạn sẽ không đạt được bất cứ điều gì từ tính đa hình.
Như vậy, tôi thấy ba giải pháp
Tuyên bố các phương thức tĩnh trong mỗi lớp [sau tất cả, bạn sẽ không bao giờ
Nếu bạn muốn một phương thức tạo các phiên bản của lớp, nhưng không muốn yêu cầu một thể hiện để gọi phương thức này, bạn có thể tạo các lớp "trình xây dựng" để phục vụ mục đích này [ví dụ:
OrderBuilder
], để bạn khởi tạo mộtOrderBuilder
và gọi Thay vào đó, phương thứcCreate
trên đối tượng này để có được các trường hợpOrder
.[Được đề xuất] Tại sao bạn không chỉ đơn giản là sử dụng hàm tạo
Order
?
Đã trả lời ngày 13 tháng 5 năm 2011 lúc 1:17May 13, 2011 at 1:17
Matt Mitchellmatt MitchellMatt Mitchell
40.1k35 Huy hiệu vàng117 Huy hiệu bạc184 Huy hiệu đồng35 gold badges117 silver badges184 bronze badges
5
Cập nhật
Sau khi nhận xét từ @hvertous, tôi quyết định kiểm tra điều này. Sử dụng 3V4L, chúng ta có thể thấy rằng abstract public static method
:
- Hoạt động cho các phiên bản 5> 5.1.6
- Không hoạt động cho 5.2> 5.6.38
- Hoạt động cho 7.0.0> 7.3.1
Điều này xác nhận rằng nó đã bị xóa trong PHP 5.2, nhưng nếu bạn đang sử dụng Php 7+, một lần nữa, bạn có thể sử dụng một lần nữa các phương thức tĩnh trừu tượng.
Câu trả lời ban đầu
Có, các phương pháp tĩnh trừu tượng đã được loại bỏ trong PHP 5.2. Rõ ràng họ là một sự giám sát. Xem tại sao Php 5.2+ không cho phép các phương thức lớp tĩnh trừu tượng ?.
Tuy nhiên, bạn có thể có các phương thức tĩnh trong một giao diện, xem nhận xét này trên PHP.NET.
Vấn đề bạn gặp phải là bạn muốn các triển khai của bạn có các chữ ký chức năng khác nhau, điều đó có nghĩa là bạn có thể không nên sử dụng kế thừa để giải quyết vấn đề của bạn.
Đã trả lời ngày 23 tháng 5 năm 2017 lúc 6:53May 23, 2017 at 6:53
Yep_It's_MeYep_It's_MeYep_It's_Me
4.2784 Huy hiệu vàng41 Huy hiệu bạc64 Huy hiệu Đồng4 gold badges41 silver badges64 bronze badges
1
Php 7.4+ cho phép yêu cầu một phương thức tĩnh trong giao diện: allows to require a static method in an interface:
interface StaticInterface {
public static function interfaceMethod[];
}
class MyProvider implements StaticInterface {
//public static function interfaceMethod[] {}
}
Lỗi nghiêm trọng mà không có phương pháp: //3v4l.org/yba4u
Không có lỗi khi thực hiện phương thức: //3v4l.org/qnrjb
Đã trả lời ngày 1 tháng 9 lúc 10:31Sep 1 at 10:31
Sunsunsun
9118 Huy hiệu bạc13 Huy hiệu đồng8 silver badges13 bronze badges
1