Vào tháng 10 năm 2019, Python 3.8 đã giới thiệu toán tử Walrus (:=) thông qua PEP 572 – và do đó đã gây ra một trong những cuộc tranh cãi lớn nhất trong lịch sử ngôn ngữ lập trình. Cuộc tranh luận gay gắt đến mức nhà phát minh Python Guido van Rossum vào tháng 7 năm 2018 – thậm chí trước khi phát hành – vị trí của ông là BDFL (Nhà độc tài nhân từ trọn đời). Kể từ đầu năm 2019, Python được quản lý bởi một Hội đồng chỉ đạo được bầu.
if (n := len(items)) > 10:
print(f"List is too long ({n} elements)")
Rạn nứt quản trị nảy sinh ngay sau cuộc thảo luận về Walrus—một trường hợp hiếm hoi mà một tính năng ngôn ngữ đơn lẻ lại gây ra hậu quả về mặt cấu trúc. Trong tuyên bố của mình, van Rossum giải thích: "Giọt nước tràn ly là một Đề xuất Cải tiến Python gây tranh cãi. Sau khi tôi chấp nhận, mọi người đã lên mạng xã hội như Twitter và nói những điều khiến tôi tổn thương."
Ông tiếp tục: "Giờ đây, PEP 572 đã kết thúc, tôi không bao giờ muốn phải đấu tranh vất vả để giành được PEP nữa và thấy rằng rất nhiều người ghét bỏ quyết định của tôi. Tôi muốn hoàn toàn loại bỏ mình khỏi quá trình ra quyết định." Những lời chỉ trích không chỉ đến từ cộng đồng rộng lớn mà còn từ các nhà phát triển cốt lõi.
Họ lập luận rằng toán tử này mâu thuẫn với các nguyên tắc cơ bản của Python từ Thiền tông Python — đặc biệt là sự ưu tiên tính đơn giản hơn tính phức tạp. Sau gần ba thập kỷ là nhà thiết kế ngôn ngữ không thể tranh cãi, điều này đã đánh dấu sự kết thúc của một kỷ nguyên. Nhưng trong khi Python phải giới thiệu một toán tử Walrus mới, gây chia rẽ cộng đồng, một câu hỏi được đặt ra: Các ngôn ngữ khác xử lý các khái niệm tương tự như thế nào?
Toán tử Python := (Biểu thức gán "Walrus") không tồn tại trong PHP – vì nó không cần thiết. Trong PHP, toán tử gán = luôn luôn Câu nói và biểu hiện cùng một lúc: Phép gán trả về giá trị đã gán. Đây chính là lý do tại sao các mẫu thành ngữ như "gán và kiểm tra" lại hiệu quả trong if-điều kiện không có tính năng ngôn ngữ riêng.
function get_some_field() {
return 'foo';
}
if ($a = get_some_field()) {
echo $a; // foo
}
// Hinweis: $a ist *gesetzt*, selbst wenn die Bedingung falsy wäre.
$a = get_some_field() gán và đánh giá cho vế phải. Nếu đây là "sự thật", bạn nhập if-Block. Bối cảnh: Trong Python, := (PEP 572) vì các phép gán đơn giản không phải là biểu thức. Trong PHP, điều này luôn khác biệt, nên không cần thiết phải có biểu thức tương đương. Có hai điều thường dẫn đến lỗi.: = (Gán) có mức độ ưu tiên thấp hơn hầu hết các toán tử quan hệ; dấu ngoặc đơn xác định cách đánh giá.
Trong các biểu thức phức tạp hơn, bạn nên luôn sử dụng dấu ngoặc đơn để tăng tính dễ đọc và rõ ràng. ?? có mức độ ưu tiên riêng, khá thấp. Điều này giải thích sự ngạc nhiên trong các biểu thức như $x ?? null === null. Không có dấu ngoặc đơn, đầu tiên null === null được đánh giá. Tốt hơn là luôn luôn đóng ngoặc rõ ràng: ($x ?? null) === null. $a cũng tồn tại bên ngoài if-Khối – có thể có giá trị sai.
function get_some_field() {
return 'bar';
}
if ( ($a = get_some_field()) === 'bar' ) {
echo $a; // bar
}
Vì vậy, rõ ràng là === 'bar' được áp dụng cho giá trị được gán. Dấu ngoặc vuông rất quan trọng ở đây để dễ đọc và ưu tiên. Trên thực tế, mẫu này tránh các lệnh gọi trùng lặp không cần thiết (ví dụ: trình tạo truy vấn) bằng cách lưu trữ kết quả truy vấn và sau đó kiểm tra. Trong các ứng dụng hiệu quả, chẳng hạn như các dự án dựa trên Laravel, mẫu sau đây có thể được quan sát thường xuyên hơn.:
if ( ($foo = Foo::where('foo', 'bar')) && $foo->count() > 0 ) {
dd($foo->get());
}
&& là đoản mạch: Phần bên phải chỉ được đánh giá nếu phần bên trái là đúng. Bằng cách gán câu lệnh ngược dòng, bạn tránh được việc gán câu lệnh bên ngoài câu lệnh if. Việc đây có phải là một thực hành tốt hay không phụ thuộc vào mã và công cụ phân tích của nhóm bạn; về mặt ngữ nghĩa, nó đúng. Ít nhất, bạn nên biết mã lệnh thực hiện chức năng gì nếu gặp phải nó trong thực tế.
PHP không cần "toán tử Walrus" vì phép gán vốn đã là biểu thức. Điều này giúp các mẫu đặc trưng như "gán và kiểm tra" trở nên khả thi – hiệu quả và súc tích. Đồng thời, yêu cầu về tính kỷ luật cũng tăng lên: bắt buộc phải sử dụng dấu ngoặc đơn, phép so sánh chặt chẽ, nhận thức về sự đúng/sai, và các quy ước nhóm rõ ràng. Những người tuân thủ các nguyên tắc này sẽ được hưởng lợi từ ý tưởng Walrus mà không cần thêm bất kỳ tính năng ngôn ngữ nào.