Ứ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. 16Xin 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?
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. 42Chủ 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. 06Bở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. 11Vâ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. 43PHP đã có thứ gì đó như thế này chưa?
Jan Böhmer 1. 45Trê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. 06Vì 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. 14Chí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. 47Vì 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. 59Khô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. 09Bạ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. 15Cá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. 45Cú 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. 39Và đ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. 43Mộ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. 24Mộ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. 29Khô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. 43Tất nhiên là có
Tháng Giêng Böhmer 5. 44Nế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. 52Như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. 57Nó 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. 24Vì 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. 29Vâ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. 24Cá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. 32Và đó là một loại lỗi như bạn thường nhận được?
Tháng Giêng Böhmer 7. 34Nế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
Đó 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. 28tô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. 32Nhưng điều này nghe có vẻ như đó là cho một RFC khác
Tháng Giêng Böhmer 9. 35Chí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. 46Từ 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. 56Vì 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. 42Nhiề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. 49Quá 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. 56Trướ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. 35Tấ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. 41Theo 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. 52Giố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. 05tô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. 49Thay 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. 56Nhữ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. 10Cảm ơn bạn rất nhiều vì đã mời tôi
Derick Rethans 13. 13Cả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.