Cụ thể, tôi muốn tạo một lớp Array và muốn quá tải toán tử [].Có thể khai thác quá tải trong PHP không?
Trả lời
Nếu bạn đang sử dụng PHP5 (và bạn nên làm), hãy xem các lớp học SPL ArrayObject. Các tài liệu không phải là quá tốt, nhưng tôi nghĩ rằng nếu bạn mở rộng ArrayObject, bạn sẽ có mảng "giả" của bạn.
EDIT: Đây là ví dụ nhanh của tôi; Tôi e rằng tôi không có trường hợp sử dụng có giá trị mặc dù:
class a extends ArrayObject {
public function offsetSet($i, $v) {
echo 'appending ' . $v;
parent::offsetSet($i, $v);
}
}
$a = new a;
$a[] = 1;
Khái niệm về quá tải và khai thác của PHP (xem Overloading và Array Operators) không giống như khái niệm của C++. Tôi không tin rằng nó có thể quá tải nhà khai thác như +, -, [], vv
Giải pháp có thể
- Thực hiện SPL ArrayObject (như đã đề cập bởi cbeer).
- Triển khai Iterator (nếu
ArrayObject
quá chậm đối với bạn). - Sử dụng tiện ích mở rộng PECL operator (như được đề cập bởi Benson).
Tốt hơn so với các Iterator là SPL ArrayObject, mà tôi đã liên kết bên dưới. Nó cung cấp toàn bộ hàng loạt chức năng mảng. – cbeer
Đặt đơn giản, không; và tôi đề nghị rằng nếu bạn nghĩ rằng bạn cần C++ - quá tải kiểu, bạn có thể cần phải suy nghĩ lại giải pháp cho vấn đề của bạn. Hoặc có thể xem xét không sử dụng PHP.
Để diễn giải Jamie Zawinski, "Bạn có vấn đề và suy nghĩ, 'Tôi biết! Tôi sẽ sử dụng toán tử quá tải!' Bây giờ bạn có hai vấn đề. "
-1 câu trả lời đơn giản là không chính xác, vì nó có thể quá tải toán tử []. Ngoài ra, có khả năng @Chad không cố gắng giải quyết vấn đề với quá tải nhà điều hành, nhưng giữ mã của mình gọn gàng và gọn gàng. – Josiah
Đó là lý do tại sao tôi nói "Đặt đơn giản, không" thay vì "Không". Tôi không muốn giải thích rằng bạn làm điều đó bằng cách mở rộng các lớp nhất định theo cách kỳ lạ, bởi vì 1) quá tải toán tử là một ý tưởng tồi tệ ngay cả khi cú pháp để làm nó sạch và 2) cú pháp để thực hiện nó trong PHP isn không sạch. – dirtside
Cần phải suy nghĩ lại về thiết kế của tôi? Vì vậy, nếu tôi muốn làm số học ngày hoặc số học phức tạp, tôi phải sử dụng các cuộc gọi hàm thay vì các toán tử? Kinh quá. –
Trên thực tế, các giải pháp tối ưu là để thực hiện bốn phương pháp của giao diện ArrayAccess: http://php.net/manual/en/class.arrayaccess.php
Nếu bạn cũng muốn sử dụng đối tượng của bạn trong bối cảnh 'foreach', bạn sẽ phải thực hiện các Giao diện 'Iterator': http://www.php.net/manual/en/class.iterator.php
+1. Để thực hiện giao diện ArrayAccess là câu trả lời hợp lệ duy nhất cho vấn đề của OP. Tất cả các khác là tối ưu. – hijarian
Để có giải pháp đơn giản và sạch trong PHP 5.0+, bạn cần thực hiện bù đắp bù đắp bù đắp, bù đắp, bù đắpBộ lọc. Bây giờ bạn có thể sử dụng đối tượng như một mảng.
Ví dụ:
<?php
class A implements ArrayAccess {
private $data = array();
public function offsetGet($offset) {
return isset($this->data[$offset]) ? $this->data[$offset] : null;
}
public function offsetSet($offset, $value) {
if ($offset === null) {
$this->data[] = $value;
} else {
$this->data[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->data[$offset]);
}
public function offsetUnset($offset) {
unset($this->data[$offset]);
}
}
$obj = new A;
$obj[] = 'a';
$obj['k'] = 'b';
echo $obj[0], $obj['k']; // print "ab"
Đây là câu trả lời hay nhất (chính xác nhất) liên quan đến câu hỏi OP. Nếu bạn đơn giản muốn sử dụng toán tử '[]' trên đối tượng của mình, việc thực hiện giao diện 'ArrayAccess' là cách để đi. –
- 1. quá tải + =, +, ==, và các nhà khai thác =
- 2. Quá tải nhà khai thác tại Delphi
- 3. C++ quá tải chuyển đổi nhà khai thác
- 4. quá tải postfix và tiền tố khai thác
- 5. Quá tải nhà khai thác gây ra tràn ngăn xếp
- 6. Toán tử khai thác quá tải C++ - Lỗi không thể truy cập thành viên riêng được khai báo trong lớp
- 7. Không gian tên và nhà khai thác quá tải trong C++
- 8. Quá tải nhà khai thác C++; quá nhiều tham số cho << hoạt động
- 9. nhà khai thác quá tải khung [] để có được và thiết lập
- 10. Sự khác biệt trong các phương pháp này của quá tải Nhà khai thác trong C++
- 11. Quá tải của nhà khai thác và LINQ Sum trong C#
- 12. Khai thác văn bản với PHP
- 13. cách khai thác lỗ hổng của php?
- 14. Sử dụng PHP 5.3: khai thác
- 15. Có thể có "uritemplates" quá tải không?
- 16. Tại sao Ruby chỉ cho phép một số nhà khai thác quá tải
- 17. Python bắt buộc đối với C++ nhà khai thác quá tải
- 18. quy tắc chuyển đổi cho các nhà khai thác chuyển đổi quá tải
- 19. Java - compareTo và khai thác
- 20. Có thể quá tải mixin trong sass không?
- 21. khai thác ternary trong C#
- 22. LINQ lỗi - "NotSupportedException: quá tải không được hỗ trợ sử dụng cho các nhà khai thác truy vấn 'Chọn'"
- 23. Tại sao PHP có hai "không bằng" nhà khai thác (= và <>!)
- 24. Quá trình vận hành của nhà khai thác Delphi trong một tập hợp
- 25. C++, Làm cách nào để gọi toán tử khai thác quá tải của lớp cơ sở trong lớp dẫn xuất?
- 26. Khai thác một BufferOverflow
- 27. Pig có điều kiện khai thác
- 28. Khai thác dòng TCP
- 29. Quá tải toán tử trong Java
- 30. Phương thức web có thể bị quá tải không?
Không chỉ là câu trả lời hữu ích mà là câu trả lời đúng. Tôi sử dụng ArrayObjects tất cả các thời gian, và đó là một cách thanh lịch không chỉ ghi đè lên mảng nhưng để mở rộng toàn bộ mô hình đối tượng và làm cho PHP đá một số mông nghiêm trọng. – AlexanderJohannesen
Không phải là câu trả lời hữu ích hoặc câu trả lời đúng. Câu hỏi đặt ra là về quá tải toán tử, không phải là một thư viện có đối tượng được gọi là ArrayObject tồn tại hay không. – fijiaaron
-1 Sử dụng giao diện ArrayAccess. Không mở rộng ArrayObject.Bạn đang thừa hưởng rất nhiều logic của bạn có lẽ không cần và mở rộng thêm ArrayObject là không thể đoán trước trong nhiều khía cạnh, bởi vì có quá nhiều ma thuật liên quan. – NikiC