Nạp chồng toán tử trong PHP là gì?

Ứng dụng twitter chính thức hiện thường xuyên bị treo khi chỉ gõ tweet. Sau từ đầu tiên. Mọi thứ diễn ra tuyệt vời dưới không gian Karen

twitter — Ngày 24 tháng 12, 18. 34 UTC

  • 🌼 Hoa của ngày 24 tháng 12 @PlantNetProject Identified Name [Tự tin. 44%]. Hoa trà Sasanqua [Camellia… https. //t. co/5ePwjhwrIO

    twitter — Ngày 24 tháng 12, 16. 30 UTC

  • Metrodle #209 ⬛ Cách 14 trạm 🟩 Cách 1 trạm 🟩 🚇 3/6 #metrodle

    twitter — Ngày 24 tháng 12, 00. 22 giờ UTC

  • Wordle 553 3/6 🟨🟩⬜⬜🟩 🟩🟩⬜🟩🟩 🟩🟩🟩🟩🟩

    twitter — Ngày 24 tháng 12, 00. 22 giờ UTC

  • 🌼 Hoa của ngày 23 tháng 12 @PlantNetProject Identified Name [Tự tin. 94%]. Cây ô rô Anh [Ilex aquifol… https. //t. co/Q3bDtJN7Fa

    twitter — Ngày 23 tháng 12, 16. 30 UTC

  • Có vẻ như một vết rò rỉ mới đã xuất hiện ở South Hampstead, nơi đường ống dẫn nước chính của @thameswater bị vỡ vào cuối tuần trước. /cc… https. //t. co/hnqpaMEeww

    twitter — Ngày 23 tháng 12, 12. 53 UTC

  • tôi đi bộ 26. 8km trong 4h46m27s

    người điều hành — Ngày 23 tháng 12, 12. 35 giờ UTC

  • Metrodle #208 🟩 🎯 1/6 #metrodle

    twitter — Ngày 23 tháng 12, 00. 26 giờ UTC

  • Wordle 552 3/6 ⬜🟩🟨🟨⬜ ⬜🟩⬜🟨🟨 🟩🟩🟩🟩🟩

    twitter — Ngày 23 tháng 12, 00. 26 giờ UTC

  • 🌼 Hoa của ngày 22 tháng 12 @PlantNetProject Identified Name [Tự tin. 31%]. Hoa hồng Bengal [Rosa chinensis… https. //t. co/8NfkfgLuiY

    twitter — Ngày 22 tháng 12, 16. 30 UTC

  • tôi đi bộ 12. 5km trong 2h17m33s

    người điều hành — Ngày 22 tháng 12, 13. 01 giờ UTC

  • 🌼 Hoa của ngày 21/12 #FlowerOfTheDay https. //t. co/jcp7R8MVSQ

    twitter — Ngày 21 tháng 12, 16. 30 UTC

  • tôi đi bộ 12. 7km trong 2h6m30s

    người điều hành — Ngày 21 tháng 12, 12. 31 UTC

  • Metrodle #206 🟩 Cách 1 điểm dừng 🟩 🚇 2/6 #metrodle

    twitter — Ngày 21 tháng 12, 00. 04 UTC

  • Wordle 550 4/6 ⬜⬜🟨🟨⬜ 🟩🟨🟨⬜⬜ 🟩⬜⬜🟩🟩 🟩🟩🟩🟩🟩

    twitter — Ngày 21 tháng 12, 00. 04 UTC

  • ICYMI. 📽️ 🧾 Tôi đã tạo một video mới trong đó tôi giải thích một trong những tính năng của @PhpStorm. Bỏ qua tệp và thư mục… https. //t. co/22dUf59BtY

    twitter — Ngày 20 tháng 12, 16. 42 giờ UTC

  • 🌼 Hoa của ngày 20/12 #FlowerOfTheDay https. //t. co/kThQAa0gv8

    twitter — Ngày 20 tháng 12, 16. 30 UTC

  • 📽️ 🧾 Tôi đã tạo một video mới trong đó tôi giải thích một trong những tính năng của @PhpStorm. Bỏ qua tệp và thư mục trong khi… https. //t. co/bPF0lthtoB

    twitter — Ngày 20 tháng 12, 09. 42 giờ UTC

  • tôi đi bộ 20. 7km trong 3h15m22s

    người quản lý — Ngày 20 tháng 12, 09. 17 giờ UTC

  • Nội bộ PHP. chap 42. Quá tải toán tử không gian người dùng

    London, Vương quốc Anh

    Thứ năm, ngày 27 tháng 2 năm 2020, 09. 05 giờ GMT

    Trong tập "Tin tức nội bộ PHP" này, tôi đã trò chuyện với Jan Böhmer [GitHub, LinkedIn] về việc Quá tải Người vận hành Không gian Người dùng RFC

    Nguồn cấp RSS cho podcast này là https. // derickrethans. nl/feed-phpinternalsnews. xml, bạn có thể tải xuống tệp MP3 của tập này và tệp có sẵn trên Spotify và iTunes. Có một trang web chuyên dụng. https. //phpinternals. Tin tức

    Bảng điểm

    Derick Rethans 0. 16

    Xin chào, tôi là Derick. Và đây là tin tức nội bộ PHP, một podcast hàng tuần dành riêng để làm sáng tỏ sự phát triển của ngôn ngữ PHP. Đây là tập 42. Hôm nay tôi đang nói chuyện với Jan Böhmer về Quá tải toán tử không gian người dùng. Jan, bạn vui lòng giới thiệu về bản thân?

    Jan Böhmer 0. 33

    Xin chào, tên tôi là Jan Böhmer. Tôi là một sinh viên vật lý từ Đức. Và tôi là tác giả của RFC quá tải toán tử

    Derick Rethans 0. 40

    Điều gì đã khiến bạn viết RFC này?

    Jan Böhmer 0. 42

    Chủ yếu là vì tôi đã từng làm việc với các đối tượng tiền tệ trong quá khứ. Và nó hơi tẻ nhạt khi làm việc khi tính toán. Và bất cứ khi nào bạn muốn tính toán một cái gì đó, bạn phải gọi các hàm trên các đối tượng. Điều này không thể gọi, chỉ sử dụng các toán tử như với các giá trị bình thường như số float hoặc số nguyên

    Derick Rethans 1. 06

    Bởi vì bản thân các đối tượng tiền tệ có nhiều thứ được nhúng trong đó hay thứ gì đó tương tự?

    Jan Böhmer 1. 11

    Vâng, họ mô tả chủ yếu là một giá trị và một loại tiền tệ. Và cùng nhau, chúng được lưu trong một đối tượng

    Derick Rethans 1. 18

    Được rồi đó có vẻ là một điều hợp lý để làm, phải không? . RFC được gọi là Quá tải toán tử không gian người dùng. Nạp chồng toán tử là gì?

    Jan Böhmer 1. 31

    Ừ. Về cơ bản, ý tưởng là bạn có thể xác định các toán tử, như cộng hoặc trừ hoặc nối chuỗi cho các đối tượng

    Derick Rethans 1. 43

    PHP đã có thứ gì đó như thế này chưa?

    Jan Böhmer 1. 45

    Trên thực tế, có. Các đối tượng có thể có thứ gì đó gọi trình xử lý thao tác. Điều này được gọi bất cứ khi nào PHP gặp một đối tượng, nhưng nếu được sử dụng với toán tử. Vấn đề là trình xử lý này chỉ khả dụng cho nội bộ PHP. Vì vậy nếu bạn muốn sử dụng nó, bạn phải viết một phần mở rộng

    Derick Rethans 2. 06

    Vì vậy, có thể có trong phần mở rộng một lớp Tiền tệ với các toán tử riêng đã được xác định trên đó

    Tháng Giêng Böhmer 2. 14

    Chính xác là phần mở rộng PHP GMP sử dụng cái này như đã. Vấn đề là nó không linh hoạt lắm, bạn phải biết rồi, quen với C, bạn phải biên dịch được cái đó. Bạn phải đóng góp nó cho bất kỳ hệ thống nào bạn muốn sử dụng nó. Vì chúng ta có giao diện chức năng nước ngoài kể từ PHP 7. 4, chúng ta có thể triển khai nhiều thứ mà không cần thực sự có tiện ích mở rộng. Nhưng quá tải toán tử này là điều chưa thể thực hiện được bên trong PHP

    Derick Rethans 2. 47

    Vì vậy, sẽ không thể viết phần mở rộng GMP, tất nhiên là bao quanh libgmp với FFI, bởi vì không có quá tải toán tử nào có sẵn trong PHP

    Tháng Giêng Böhmer 2. 59

    Không phải theo cách thoải mái đó. Bạn có thể sử dụng cách này với các hàm nhưng sẽ hơi tẻ nhạt hơn khi chỉ sử dụng các toán tử

    Derick Rethans 3. 09

    Bạn đã đề cập đến đối tượng Tiền tệ như một trường hợp sử dụng tốt. Những trường hợp sử dụng nào khác mà bạn có thể nghĩ đến?

    Jan Böhmer 3. 15

    Các đối tượng toán học cao hơn như số phức, vectơ hoặc thứ gì đó như tenxơ, có thể là thứ gì đó giống như thành phần chuỗi của Symfony. Đó là bạn có thể chỉ cần nối các đối tượng chuỗi này với một chuỗi bình thường bằng cách sử dụng toán tử concat và không phải sử dụng hàm để gọi nó, bởi vì về cơ bản, điều này sẽ hoạt động tương tự như một biến chuỗi cơ bản chứ không giống như một thứ gì đó hoàn toàn khác

    Derick Rethans 3. 45

    Cú pháp bạn đang đề xuất để thực hiện điều này là gì?

    Jan Böhmer 3. 49

    Ý tưởng của tôi tương tự như Python để sử dụng hàm số liệu đặc biệt, các phương thức cho mọi toán tử mà bạn có thể quá tải. Vì vậy, nếu bạn muốn nạp chồng toán tử cộng, bạn sẽ triển khai hàm có tên, chẳng hạn như hàm tĩnh có tên __add. Ưu đãi này hàm này nhận cả hai toán hạng, toán hạng bên trái và toán hạng bên phải. Vì vậy, bạn có thể quyết định xem đối tượng hiện tại của mình, đối tượng này ở bên phải hay bên trái. Điều quan trọng là phải xác định một cái gì đó như một chia cho 0, hoặc một chia cho hai, hoặc hai chia cho không. Có hai trường hợp hoàn toàn khác nhau và bạn phải có khả năng phân biệt giữa hai trường hợp

    Derick Rethans 4. 39

    Và điều đó không thể thực hiện được trong các chức năng không tĩnh?

    Tháng Giêng Böhmer 4. 43

    Một vấn đề khác với các hàm không tĩnh, chẳng hạn như khả năng truy cập vào biến này. Nếu bạn sửa đổi một đối tượng từ bên trong trình xử lý toán tử, điều này có thể dẫn đến hành vi rất, rất lạ. Bởi vì các hoạt động thông thường không tự thay đổi đối tượng mà thay vào đó, bạn nên trả về một giá trị mới. Các vấn đề như yêu cầu chúng tôi điều này, rất dễ vô tình thay đổi đối tượng này. Nếu bạn chỉ chuyển cả hai đối tượng như thông qua một phương thức tĩnh, rõ ràng hơn một chút là bạn phải tạo một đối tượng hoàn toàn mới

    Derick Rethans 5. 24

    Một gợi ý kiểu có bắt buộc bạn trả lại một đối tượng cho cùng một lớp không?

    Tháng Giêng Böhmer 5. 29

    Không phải tất cả các trường hợp bạn muốn trả về một đối tượng cùng lớp. Ví dụ: lấy một tích chấm của các vectơ. Vì vậy, bạn lấy hai vectơ, nhân nó theo một cách nào đó khi bạn trở về giá trị float bình thường

    Derick Rethans 5. 43

    Tất nhiên là có

    Tháng Giêng Böhmer 5. 44

    Nếu bạn định thực thi điều đó, nhưng sẽ luôn giống các loại như những giới hạn đó đối với các trường hợp sử dụng, theo ý kiến ​​​​của tôi là quá nhiều

    Derick Rethans 5. 52

    Nhưng tất nhiên bạn có thể tự mình gõ gợi ý toán tử __add không?

    Tháng Giêng Böhmer 5. 57

    Nó luôn luôn là các gợi ý trong các đối số, theo quan sát của tôi được sử dụng như một gợi ý loại nào được hỗ trợ cho trình xử lý toán hạng. Ví dụ: nếu bạn vectơ cộng với một số nguyên và trình xử lý toán tử của bạn chỉ khai báo vectơ vectơ dưới dạng một loại tham số, thì toán tử này sẽ không được gọi và nó sẽ cố gắng được gọi trên đối tượng thứ hai

    Derick Rethans 6. 24

    Vì vậy, nó sẽ không được gọi và thay vào đó, nó sẽ quay trở lại đối tượng thứ hai được gọi

    Tháng Giêng Böhmer 6. 29

    Vâng, ý tưởng đằng sau nó là chỉ một trong số các đối tượng phải biết về cả hai lớp. Vì vậy, nếu bạn muốn kết hợp, ví dụ, hai đối tượng từ các thư viện khác nhau và thư viện A không biết về thư viện B thì chỉ các đối tượng của thư viện thứ hai phải biết về đối tượng A. Trong C++, bạn có thể xác định loại được hỗ trợ bên ngoài các lớp. Vì vậy, bạn có thể xác định sự kết hợp giữa các đối tượng tùy ý. Vấn đề là trong PHP, điều này hơi phức tạp. Và cách tốt nhất để triển khai trình xử lý này trong các loại hoặc lớp. Vì vậy, lớp phải biết về từng đối tượng khác, nó có thể tương tác với nhau

    Derick Rethans 7. 14

    Điều đó có ý nghĩa với tôi. Điều gì xảy ra nếu không có lớp nào hoặc nếu một trong số chúng là lớp và lớp còn lại chỉ là kiểu vô hướng, nếu không có phương thức add nào phù hợp, điều gì sẽ xảy ra sau đó?

    Tháng Giêng Böhmer 7. 24

    Các toán tử triển khai một trình xử lý, sau đó những trình xử lý đó không hỗ trợ chúng, thì sẽ xảy ra lỗi

    Derick Rethans 7. 32

    Và đó là một loại lỗi như bạn thường nhận được?

    Tháng Giêng Böhmer 7. 34

    Nếu đối tượng hoàn toàn không triển khai toán tử, thì một thông báo sẽ được kích hoạt. Ý tưởng là tại thời điểm này, có thể viết một cái gì đó giống như đối tượng cộng một, đây sẽ là một cách diễn đạt hay trong PHP, trong các phiên bản PHP hiện tại, đối tượng có thể được hiểu là một và chỉ cần đưa ra một thông báo. Vì lý do tương thích, RFC của tôi thực hiện hành vi tương tự nếu không có toán tử nào bị quá tải trên các đối tượng

    Derick Rethans 8. 05

    Đó có vẻ như là một sự thỏa hiệp hợp lý ở đó. Tôi nhớ ngày xưa, tôi nghĩ chính Sara Golemon đã viết một phần mở rộng để sử dụng quá tải toán tử. Và tôi nhớ rằng đã có vấn đề với việc sử dụng các toán tử nhỏ hơn hoặc lớn hơn, bởi vì tôi nghĩ rằng một trong số chúng được tự động đảo ngược trong công cụ đã được thay đổi trong PHP hoặc bạn đang gặp vấn đề tương tự?

    Tháng Giêng Böhmer 8. 28

    tôi không chắc về điều này. RFC của tôi hoàn toàn không đề cập đến các toán tử so sánh như lớn hơn hoặc nhỏ hơn. Vì so sánh, xử lý khác nhau trong nội bộ của PHP. Điều này không làm việc về điều này. Điều này được đề cập do xử lý toán tử. Nó sẽ là một chút thực hiện khác để làm điều này. Ngoài ra, việc so sánh hơi phức tạp theo cách riêng của nó. Có lẽ sẽ hữu ích hơn khi sử dụng các giao diện để thực hiện quá tải này hoặc sử dụng. Ngoài ra, có một số vấn đề. Có lẽ chúng ta chỉ nên cho phép một cái gì đó như toán tử so sánh đã được giải quyết, trừ một, một hoặc không. Nếu đối tượng nhỏ hơn hoặc bằng nhau, để mọi thứ được xác định cùng một lúc. Vì vậy, không thể xác định một đối tượng có thể, ví dụ, toán tử nhỏ hơn, nhưng không phải là toán tử lớn hơn

    Derick Rethans 9. 32

    Nhưng điều này nghe có vẻ như đó là cho một RFC khác

    Tháng Giêng Böhmer 9. 35

    Chính xác. Đó là một chút phức tạp. Nếu RFC nạp chồng toán tử hiện tại được thông qua, thì có thể nạp chồng toán tử so sánh RFC sẽ có ý nghĩa

    Derick Rethans 9. 46

    Từ việc đọc RFC, tôi nhận thấy rằng bạn cũng sẽ không thể sử dụng toán tử gán tốc ký. Vì vậy, ví dụ, cộng bằng. lý do cho điều đó là gì?

    Tháng Giêng Böhmer 9. 56

    Vì vậy, mọi toán tử tốc ký hiện trở thành một phép gán của A cộng với B. Trình xử lý thao tác do không thể quyết định xem toán tử tốc ký hay toán tử thông thường được gọi. Cho phép quá tải các toán tử tốc ký, có thể sẽ cho phép một số lợi ích cho các đối tượng về tối ưu hóa bộ nhớ. Nếu bạn gọi một toán tử tay ngắn, bạn có thể tự thay đổi đối tượng mà không cần phải tạo một đối tượng mới chiếm nhiều bộ nhớ hơn, nhưng tôi nghĩ với trình thu gom rác của PHP thì đó không phải là vấn đề lớn. Và nếu đó là tính năng thực sự cần thiết trong tương lai, thì tính năng này có thể được chỉnh sửa trong phiên bản PHP mới hơn

    Derick Rethans 10. 41

    Được chứ

    Tháng Giêng Böhmer 10. 42

    Nhiều ngôn ngữ khác không cho phép các toán tử tốc ký khác, vì vậy tôi không nghĩ rằng cần quá nhiều

    Derick Rethans 10. 49

    Quá tải toán tử đôi khi có những lời chỉ trích nhắm vào nó. Một số lời chỉ trích bạn đã nghe về nó là gì?

    Tháng Giêng Böhmer 10. 56

    Trước hết, có một số lời chỉ trích về ý tưởng nạp chồng toán tử nói chung. Vì vậy, cũng có một số lời chỉ trích có thể bị lạm dụng vì đã làm một số điều rất kỳ lạ với quá tải toán tử. Vì vậy, như C ++ đã đề cập, có một toán tử shift, shift trái, được sử dụng để xuất trong luồng tới bàn điều khiển. Hoặc bạn có thể làm bất cứ điều gì bạn muốn bên trong trình xử lý này, vì vậy nếu ai đó muốn lưu tệp hoặc sửa đổi tệp trong trình xử lý quá tải toán tử bên trong, điều đó là có thể và trong hầu hết các trường hợp, chức năng sẽ rõ ràng hơn về chức năng của nó

    Derick Rethans 11. 35

    Tất nhiên, trong một hàm add[], nếu bạn tự triển khai, tất nhiên không có gì ngăn cản bạn ghi vào một tệp

    Jan Böhmer 11. 41

    Theo tôi, vấn đề quá tải toán tử chỉ được sử dụng cho những thứ liên quan đến toán học hoặc tạo các loại tùy chỉnh hoạt động tương tự như các loại tích hợp sẵn

    Derick Rethans 11. 52

    Giống như số phức, vectơ hoặc số tiền tệ. Cho đến nay, chúng ta đã thảo luận về RFC này được vài tuần rồi. Bạn nghĩ khả năng nó sẽ trôi qua là bao nhiêu?

    Tháng Giêng Böhmer 12. 05

    tôi không chắc. Tôi nghĩ rằng ý tưởng về quá tải toán tử nói chung được chấp nhận trong cộng đồng, nhưng không nghe thấy nhiều phản ứng dữ dội. Đã có một số thời gian thảo luận về cách làm điều đó. Một số người cho rằng sẽ tốt hơn nếu bạn triển khai quá tải toán tử với các giao diện, như với ArrayAccess hoặc giới thiệu một số từ khóa hoàn toàn mới, như trong các ngôn ngữ khác. Trong C++, hay C#, có một từ khóa toán tử đặc biệt, nó đánh dấu một hàm nạp chồng toán tử. Vì vậy, rõ ràng đó không phải là một chức năng thực sự mà là cách xử lý đặc biệt

    Derick Rethans 12. 49

    Thay vì sử dụng dấu gạch dưới gạch dưới trước tên phương thức. Bạn nghĩ khi nào bạn sẽ sẵn sàng đưa lên hoặc bỏ phiếu?

    Tháng Giêng Böhmer 12. 56

    Những ngày qua có bận không, tôi sẽ thực hiện một số sửa đổi đối với RFC của mình và hoàn thiện quá trình triển khai của mình

    Derick Rethans 13. 06

    Được rồi, cảm ơn bạn rất nhiều sáng nay vì đã dành thời gian nói chuyện với tôi Jan

    Jan Böhmer 13. 10

    Cảm ơn bạn rất nhiều vì đã mời tôi

    Derick Rethans 13. 13

    Cảm ơn bạn đã lắng nghe phần tin tức nội bộ PHP này, podcast hàng tuần dành riêng để làm sáng tỏ sự phát triển của ngôn ngữ PHP, tôi duy trì một tài khoản Patreon cho những người ủng hộ podcast này, cũng như công cụ sửa lỗi Xdebug. Bạn có thể đăng ký Patreon tại https. //drck. tôi/patreon. Nếu bạn có nhận xét hoặc đề xuất, vui lòng gửi email tới derick@phpinternals. Tin tức. Cảm ơn bạn đã lắng nghe và tôi sẽ gặp bạn vào tuần tới

    Hiện ghi chú

    • RFC. Quá tải toán tử không gian người dùng

    Tín dụng

    Âm nhạc. Chipper Doodle v2 — Kevin MacLeod [incompetech. com] — Creative Commons. Theo Ghi công 3. 0

    Bình luận

    Chưa có bình luận nào

    Thêm bình luận

    Tên. E-mail.

    Sẽ không được đăng. Vui lòng để trống thay vì đổ đầy rác. Nhận xét.

    Vui lòng làm theo định dạng Văn bản được cấu trúc lại. Không sử dụng biểu mẫu nhận xét để báo cáo sự cố trong phần mềm, hãy sử dụng trình theo dõi sự cố có liên quan. Tôi sẽ không trả lời chúng ở đây.

    Giải thích quá tải toán tử là gì?

    Đa hình. Đa hình [hoặc nạp chồng toán tử] là cách thức mà các hệ thống OO cho phép sử dụng cùng một tên hoặc ký hiệu toán tử cho nhiều thao tác . Nghĩa là, nó cho phép ký hiệu hoặc tên toán tử được liên kết với nhiều hơn một triển khai của toán tử. Một ví dụ đơn giản về điều này là dấu “+”.

    Quá tải trong PHP với ví dụ là gì?

    Nạp chồng hàm chứa cùng tên hàm và hàm đó thực hiện tác vụ khác nhau tùy theo số lượng đối số . Ví dụ: tìm diện tích của một số hình nhất định trong đó bán kính được cho trước thì nó sẽ trả về diện tích hình tròn nếu cho chiều cao và chiều rộng thì nó sẽ cho diện tích hình chữ nhật và các hình khác.

    PHP có quá tải toán tử không?

    PHP đã có cơ chế nội bộ để nạp chồng toán tử bằng cách sử dụng trình xử lý đối tượng do_operation , ví dụ như được sử dụng bởi các đối tượng dữ liệu GMP và FFI. Tuy nhiên, cơ chế này chỉ khả dụng cho các đối tượng PHP nội bộ và hiện tại không thể sử dụng cho các lớp được tạo bên trong PHP.

    Ghi đè toán tử trong PHP là gì?

    Trong ghi đè hàm, cả lớp cha và lớp con phải có cùng tên hàm và số đối số. Nó dùng để thay thế phương thức cha trong lớp con . Mục đích của việc ghi đè là thay đổi hành vi của phương thức lớp cha. Hai phương thức có cùng tên và cùng tham số được gọi là ghi đè.

    Chủ Đề