exit, exit (), exit (0), die (), die (0) - Cách thoát script


81

Tôi tin rằng tất cả những thứ này (và thậm chí die()hoặc die(0)) đều giống hệt nhau. Nếu chúng không giống nhau, điều nào được ưu tiên hơn để thoát một tập lệnh thành công? Nếu chúng giống hệt nhau, có tiêu chuẩn ưu tiên nào để chỉ ra hoàn thành tập lệnh thành công không? Tôi có xu hướng sử dụng exit;.

CHỈNH SỬA: Tất cả các câu trả lời đều có " die()exit()giống hệt nhau" mặc dù tôi đã nói điều đó trong câu hỏi của mình. Tôi đã cập nhật tiêu đề để hy vọng làm rõ hơn rằng đây KHÔNG phải là câu hỏi của tôi. Tôi muốn chỉ rõ thành công từ một tập lệnh dòng lệnh.


4
Tôi tin rằng chúng giống hệt nhau stackoverflow.com/questions/1795025/…
Doug Owings

không sử dụng bất kỳ cái nào trong số này ... chỉ sử dụng kết hợp echo và return.

2
@HiroProt Character hoàn toàn không đồng ý; returncó một ý nghĩa khác nhau
Thuốc nổ

Câu trả lời:


67

Tất cả đều giống hệt nhau. Tôi khá chắc chắn die()đây chỉ là một bí danh đơn giản exit(), nhưng ngay cả khi không phải, nó vẫn hoạt động giống hệt nhau.

Khi một trong những hàm này được cung cấp đối số chuỗi, nó sẽ in ra chuỗi trước khi kết thúc quá trình. Khi nó gặp một số nguyên dưới 255, số nguyên đó được coi là mã trả về cho quy trình, mã này được chuyển trở lại quy trình gọi tập lệnh PHP. Điều này đặc biệt hữu ích khi viết các ứng dụng dòng lệnh (PHP không chỉ dành cho web!).

Theo như sự khác biệt giữa exit, exit()exit(0), có thực sự là không có. Chắc chắn không có sự khác biệt giữa hai phần đầu vì exitvề mặt kỹ thuật là một cấu trúc ngôn ngữ, không phải một hàm, vì vậy nó có thể được gọi có hoặc không có dấu ngoặc đơn, giống như echo. Trả lại mã 0có nghĩa là "chương trình này đã chạy thành công / không có lỗi" và trong khi tôi không biết chính xác điều gì sẽ xảy ra khi bạn không chuyển một đối số, PHP.net nói rằng một đối số ít hơn exitcho biết thành công, vì vậy tôi dám cá nó trả về 0, mặc dù một lần nữa PHP.net không hiển thị mặc định cho đối số.


3
exit(0)có nghĩa là thoát với thành công, exit(1)có nghĩa là thoát với thất bại.
Yousha Aleayoub

FYI, chưa bao giờ được đề cập rõ ràng ở bất kỳ đâu (bao gồm cả hướng dẫn sử dụng PHP), mã thoát thực tế sẽ là gì khi gọi exit(hoặc die) với một tham số chuỗi. Đã từng nhìn thấy ví dụ như die(-1)thành ngữ phổ biến , và cũng có thể die("Poo!...")gọi rất nhiều, dù sao thì người ta có thể không chắc lắm, và dù sao thì: đoán nên thuộc về các ngành nghề khác ... Vì vậy, FTR: nó là 0. Điều đó cũng có nghĩa là cái sau, die("error!")sẽ hầu hết có thể là một lỗi trong tập lệnh CLI, thực sự! : -o
Sz.

6

Như một số người đã đề cập, die () và exit () hoàn toàn giống nhau.

Nếu bạn xem tài liệu PHP , có hai tùy chọn cho các đối số:

  • Một giá trị số. Điều này chỉ hữu ích nếu bạn đang sử dụng PHP từ dòng lệnh, trái ngược với máy chủ web. Giá trị bằng 0 cho biết thành công. Nonzero cho biết đã xảy ra tình trạng lỗi.

  • Một giá trị chuỗi. Điều này sẽ được hiển thị cho trình duyệt khi thoát xảy ra.

Thay vì die () hoặc exit (), tôi khuyên bạn nên sử dụng các ngoại lệ và trình xử lý ngoại lệ cấp cao nhất tùy chỉnh để quản lý các điều kiện lỗi.

Bạn có thể linh hoạt hơn theo cách đó để thực hiện những việc như ghi nhật ký lỗi tự động. Ngoài ra, nếu bạn đang sử dụng PHP để triển khai API JSON, thì trình xử lý ngoại lệ này có thể gửi lại đoạn mã JSON hợp lệ, chỉ ra lỗi.


Tôi hiểu về điều kiện thất bại, nhưng tôi muốn chỉ ra thành công một cách chính xác.
Thuốc nổ

Đối với thông thường, tương tác dựa trên trình duyệt chỉ chết (). Để sử dụng dòng lệnh của php, hãy thực hiện die (0).
nsanders

Điều đáng nói là ... die () tự nó không chỉ ra điều kiện lỗi. Nó chỉ đơn giản là dừng tất cả thực thi tập lệnh php.
nsanders

1 nhắc dòng lệnh, quá nhiều người quên đi dòng lệnh php
John Magnolia

@JohnMagnolia: Nhưng sau đó anh ấy quên mất điều tương tự ngay bên dưới, khi nói "sẽ hiển thị với trình duyệt khi thoát xảy ra". ;) (Tất nhiên, nó cũng được hiển thị trong bảng điều khiển CLI.)
Sz.

5

Tôi sẽ nói rằng liên quan đến một ngữ nghĩa tốt hơn die($arg);nên được sử dụng cho một kết thúc bất thường hoặc bất ngờ, ngay cả khi - tất nhiên - bạn vẫn nắm bắt được nó. Và exit($arg);nên được sử dụng cho một kết thúc bình thường (dự kiến ​​/ được kiểm soát) của một quá trình, như break;cho một forhoặc whilehoặc một switchcấu trúc nhưng có một kết thúc dứt khoát.

Tuy nhiên, cá nhân tôi thường sử dụng một if { } else { }cấu trúc chung để kiểm soát các nhánh khác nhau của các quy trình khổng lồ hoặc bộ đệm đầu ra để không phải sử dụng "exit" ..

Tôi cũng sử dụng die($arg)trong ngữ nghĩa bắt lỗi đơn giản như trong

$db = mysql_connect([$args]) or die ($error); ...


1

die();chỉ là một từ đồng nghĩa với exit();và giống hệt nhau về mặt chức năng.

Cách tiêu chuẩn là sử dụng mã thoát số 0 để biểu thị thành công và bất kỳ điều gì khác để biểu thị điều kiện lỗi.


1

die () thường được sử dụng để hủy tập lệnh với đầu ra lỗi:

die("There was a fatal error");

where-as exit thường được sử dụng như một lần thoát thành công (Ít nhất là trong mã hóa của tôi)

Các hướng dẫn sử dụng PHP nói rằng các chức năng giống hệt nhau.


1

Tôi sẽ bị hạ xuống địa ngục , nhưng trong một số trường hợp khi hack trong CLI, chúng tôi không muốn chương trình bị giết, đồng thời không muốn tiếp tục thực hiện đầy đủ.

Ở đây mục đích là tránh thực hiện các lệnh gọi api đến một tệp điểm tay riêng biệt. Giả sử tôi có một nút chơi đẹp trong giao diện của mình, nút này thực hiện các lệnh gọi của hệ thống.

Ví dụ 1: Chương trình bị tắt sau khi hoàn thành công việc, không có dữ liệu nào được trả về. Điều này không được mong muốn.

if ($_GET["play"] != ""){
  // Some job
  exit; 
}
/* Huge amount of data*/ 

Ví dụ 2: Chương trình vẫn chạy , cung cấp toàn bộ dữ liệu trong yêu cầu GET. Điều này là không cần thiết trong trường hợp này. Điều này đang làm chậm trình duyệt với tất cả dữ liệu mà anh ta đã có.

if ($_GET["play"] != ""){
  // Some job
}
/* Huge amount of data*/ 

Ví dụ 3: Chương trình vẫn chạy , không có dữ liệu trả về như mong đợi, lệnh play đã được thực hiện, nhưng toàn bộ dữ liệu được phân tích cú pháp, đây là công việc không cần thiết, có thể làm chậm php / máy.

/* Huge amount of data*/ 
if ($_GET["play"] != ""){
  // Some job
}

Ví dụ 4: Chương trình vẫn chạy , không có dữ liệu trả về như mong đợi, lệnh play đã được thực hiện, toàn bộ dữ liệu chưa được phân tích cú pháp, php trả về siêu nhanh 200OK với một phản hồi trống, như mong đợi. Chúc mọi người vui vẻ!

if ($_GET["play"] != ""){
  // Some job
  goto END;
}
/* Huge amount of data*/
END;

Đúng! Sử dụng GOTO, đôi khi được coi là điều tốt nhất để làm 🔨 -!

https://www.php.net/manual/en/control-structures.goto.php

https://i.stack.imgur.com/kQnqC.png


0

diechính xác là tương đương với exit.

Từ sách hướng dẫn :

Nếu trạng thái là một số nguyên, giá trị đó sẽ được sử dụng làm trạng thái thoát ..

Điều này chỉ hữu ích nếu bạn có một số loại trình bao bọc thực hiện điều gì đó dựa trên trạng thái thoát. Trừ khi bạn có nhu cầu cụ thể để báo cáo mã thoát ra thế giới bên ngoài exit;.

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.