Tại sao GOTO được đưa vào PHP 5? [đóng cửa]


8

Trước đây tôi đã phát hiện ra rằng từ khóa kiểm soát GOTO đã được giới thiệu trong PHP 5.3.0.

http://php.net/manual/en/control-strucenses.goto.php

Tại sao nó lại xảy ra?

Các mục tiêu thiết kế ngôn ngữ đằng sau này là gì?

Có phải cộng đồng các nhà phát triển PHP đã yêu cầu nó?


10
Tôi không thấy vấn đề với goto thực sự. Tôi thực sự không. Tuy nhiên, mọi người dường như rất ghét nó, mặc dù nó gần như không bao giờ được sử dụng ngay cả trong trường hợp nó sẽ đơn giản hóa mã. Vâng, nó có công dụng tốt, bất kể bạn có quen đọc gototrong nguồn hay không. Cho dù họ thường thấy trong mã thành ngữ hay không là một điều khác. Goto gây ra không có hại tuy nhiên.
zxcdw

7
Máy trạng thái hữu hạn là một mã dễ dàng hơn khi bạn có goto.
yannis

Câu trả lời:


22

Người chịu trách nhiệm đưa ra lý do để thêm nó trong bài viết trên blog này .

[T] anh ấy dự án tôi đang làm việc (và có thể lấy lại vào một ngày nào đó) là một người xây dựng trang web dựa trên quy trình công việc để làm các trang web động mà không biết ngôn ngữ lập trình. Bạn xây dựng tất cả các thông tin meta về cách trang web của bạn sẽ chạy, sau đó, người xây dựng trang web sẽ biên dịch mã hóa thành mã PHP sẽ chạy trên máy chủ thực tế.

Nó có thể được thực hiện mà không có GOTO, nhưng logic kết quả cho các bit đặc biệt phức tạp của logic nghiệp vụ trở nên đơn giản hơn nhiều với nó.

Để bảo vệ PHP, nó chỉ cho phép bạn chuyển đến các nhãn trong phạm vi giới hạn, điều này hạn chế tác hại có thể được thực hiện.

(Bạn cũng có thể lập luận rằng theo cách mà PHP rõ ràng đã hấp thụ mọi cấu trúc từ mọi ngôn ngữ lập trình từng được phát minh, việc bổ sung gotođơn giản là không thể tránh khỏi)


19
Vì vậy, nó đã được thực hiện cho một dự án mà anh ấy không còn làm việc trên ... Sweet.
Robert Harvey

Aye đội trưởng! every construct from every programming language ever invented! ... đến vô cùng, và hơn thế nữa! (và nghĩ rằng đó là những gì họ từng nói về Perl 5 ... Tôi rất tự hào về đốm sáng vô nghĩa này được gọi là PHP)
ZJR

13

Ở cấp độ thấp hơn PHP đã có gototừ PHP 4. Với PHP 4, trình thông dịch đã được làm lại và Zend Engine được giới thiệu, bao gồm một trình biên dịch biên dịch thành các "opcodes" cấp thấp được chuyển giao cho người thi hành.

Ở mức độ đó một hoạt động nhảy được sử dụng cho tất cả if, switchhoặc bất kỳ tuyên bố vòng lặp. Với PHP 5.3, nó đã được quyết định xuất dưới tên gotosau một cuộc thảo luận dài.

Những lý do chính là:

  • Nó có thể được thực hiện mà không có bất kỳ chi phí nào (dù sao chúng tôi cũng đã có nó trong nội bộ)
  • Nó có thể giúp khi viết mã tạo
  • Đôi khi nó có thể giúp dọn dẹp với mã xử lý lỗi.

Hai mục đầu tiên có thể không cần giải thích và phần thứ ba là về các tình huống như thế này:

 function do() {
     $lock = $acquire_lock...)
     if (!do_something()) {
         goto cleanup
     }
     if (!do_more()) {
          goto cleanup;
     }
  cleanup:
  free_lock($lock);

Tất nhiên bạn có một vài tình huống như vậy trong PHP, vì PHP có một hệ thống thu gom rác được tham chiếu có thể dự đoán sẽ giải phóng các biến như vậy và các tài nguyên liên quan. Tuy nhiên, tình huống như vậy tồn tại khi các nhà phát triển nhân đôi mã dọn dẹp nhiều lần hoặc lạm dụng d do { } while (0);với breakvai trò gotomô phỏng.

Để ngăn chặn việc sử dụng sai, việc triển khai bị hạn chế theo cách mà bạn không thể nhảy vào các vòng lặp. Vì vậy, "lạm dụng" theo cách của Thiết bị Duff nổi tiếng sẽ không thể thực hiện được.

Cuối cùng, PHP đang được phát triển để giải quyết các vấn đề, nó không hoàn toàn bảo vệ bạn khỏi việc bắn vào chân bạn, bạn có thể lạm dụng nhiều tính năng theo cách tồi tệ hơn giới hạn này goto. Vì vậy, kết luận là có những trường hợp cạnh rất hữu ích và có thể giải quyết vấn đề.


2
dọn dẹp goto? Nghiêm túc? Tại sao không chỉ thực hiện một try-finallycấu trúc thực sự ? (PHP có một cái không?)
Mason Wheeler

3
@MasonWheeler PHP đã finallykhá gần đây và sau khi nó có goto.
yannis

3
Chà, có những người không thích ngoại lệ nhưng goto. Đó là một thế giới tự do ;-)
johannes

7
Và btw. là Chủ nhân phát hành của PHP 5.3 Tôi chịu trách nhiệm hoàn toàn cho quyết định này :-)
johannes

5

Người ta có thể viết mã xấu trong bất kỳ ngôn ngữ. Có gotongôn ngữ không có nghĩa là ngôn ngữ là xấu.

Hãy xem xét các cấu trúc hiện có bằng các ngôn ngữ khác nhau - nghỉ ngơi , continue, next, cuối cùng , throw. Thậm chí switch Đây là tất cả các hình thức của một tính toán đi từ một cấp độ phạm vi đến cùng một mức độ phạm vi hoặc cao hơn.

Vấn đề với goto là khi nó đi vào một phạm vi sâu hơn của phạm vi hoặc nhảy các khung stack.

Người ta sẽ lưu ý Ví dụ 3 trong tài liệu được liên kết từ câu hỏi:

<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    loop:
  }
}
echo "$i = $i";
?>

Điều này sẽ không hoạt động vì gotođang cố gắng nhảy vào một phạm vi sâu hơn.

Không có gì sai với các hình thức goto bị hạn chế khác nhau, hãy là từ khóa có tên goto hoặc một số tên nhánh khác. Các lựa chọn thay thế (điều kiện xấu trong vòng lặp) thường có thể tồi tệ hơn. Như nó là, sử dụng goto đơn giản

Cá nhân, tôi không thích ví dụ được đưa ra như ví dụ # 1

<?php
goto a;
echo 'Foo';

a:
echo 'Bar';
?>

Tuy nhiên, điều này không gây ra vấn đề với ngôn ngữ ngoài việc cần thiết phải áp dụng một số kinh nghiệm học tập thể xác cho nhà phát triển, những người cố tình viết mã như thế này.


4
+1: đặc biệt là "có goto trong ngôn ngữ không có nghĩa là ngôn ngữ xấu"
Deco
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.