Sự khác biệt về die () và exit () trong PHP là gì?


678

Sự khác biệt giữa die()và các exit()chức năng trong PHP là gì?

Tôi nghĩ cả hai đều có cùng chức năng, nhưng tôi nghi ngờ có gì đó khác nhau ở cả hai ... đó là gì?


2
exit () chỉ bảo vệ chương trình với trạng thái thoát số, trong khi die () in ra thông báo lỗi thành stderr và thoát với trạng thái EXIT_FAILURE. so exit() is exit and die() is also exit :)
Muhammad Shahzad

Câu trả lời:


541

Không có sự khác biệt - chúng giống nhau.

Hướng dẫn sử dụng PHP cho exit:

Lưu ý: Cấu trúc ngôn ngữ này tương đương với die().

Hướng dẫn sử dụng PHP cho die:

Cấu trúc ngôn ngữ này tương đương với exit().


17
bí danh cho phép lập trình viên sử dụng một cái thoải mái. Tôi nhớ thoát tốt hơn chết. Một số người khác nhớ chết tốt hơn thoát.
mauris

28
điều này ( php.net/manual/en/aliases.php ) có thể đưa ra một số lời giải thích tại sao 2 hàm làm điều tương tự
Marek Karbarz

86
Mặc dù họ làm điều tương tự, tôi thường dành diecho các điểm dừng liên quan đến lỗi và exitcho tất cả các kịch bản khác. Nó chỉ có vẻ chảy tốt hơn khi đọc mã.
nextgentech

7
Xin lỗi để làm sống lại điều này, nhưng ít nhất đối với tôi ... dieviết nhanh hơn nhiều so với exit... Tôi bắt đầu sử dụng exitvì nó dễ đọc hơn đối với các lập trình viên PHP, nhưng diechỉ gõ nhanh hơn khi bạn vào vội vàng. Ngoài ra, bằng cách tôi gõ, tôi không phải thay đổi vị trí của bàn tay để viết die.
Alejandro Iván

7
@mauris, Cách tốt hơn là một hàm chỉ có một tên . Hãy tưởng tượng mỗi hàm PHP có hai tên, đó sẽ là một mớ hỗn độn .
Pacerier

221

SỰ KHÁC BIỆT TRONG NGUỒN GỐC

Sự khác biệt giữa die()exit()trong PHP là nguồn gốc của chúng .


THIẾT BỊ CHỨC NĂNG

die()exit()là các chức năng tương đương.

Hướng dẫn sử dụng PHP

Hướng dẫn sử dụng PHP cho die:

Cấu trúc ngôn ngữ này tương đương với exit().

Hướng dẫn sử dụng PHP cho exit:

Lưu ý: Cấu trúc ngôn ngữ này tương đương với die().

Hướng dẫn PHP cho danh sách các bí danh hàm :

die là bí danh cho chức năng chủ exit()


KHÁC BIỆT TRONG CÁC NGÔN NGỮ KHÁC

die()exit()khác nhau trong các ngôn ngữ khác nhưng trong PHP họ giống hệt nhau.

Từ một đoạn trích PHP khác :

... Là một lập trình viên C và Perl, tôi đã sẵn sàng trả lời: "Tại sao, exit () chỉ bảo vệ chương trình với trạng thái thoát số, trong khi die () in thông báo lỗi sang stderr và thoát với trạng thái EXIT_FAILURE. " Nhưng sau đó tôi nhớ chúng ta đang ở trong vùng đất cú pháp lộn xộn của PHP.

Trong PHP, exit () và die () giống hệt nhau.

Các nhà thiết kế rõ ràng đã nghĩ "Hmm, chúng ta hãy mượn exit () từ C. Và mọi người Perl có thể sẽ thích nó nếu chúng ta chết () cũng như từ Perl . Rất tiếc! Chúng ta có hai chức năng thoát ngay bây giờ! có thể lấy một chuỗi hoặc số nguyên làm đối số và làm cho chúng giống hệt nhau! "

Kết quả cuối cùng là điều này không thực sự khiến mọi thứ trở nên "dễ dàng" hơn, chỉ gây nhầm lẫn hơn. Các lập trình viên C và Perl sẽ tiếp tục sử dụng exit () để chỉ ném một giá trị thoát số nguyên và die () để ném thông báo lỗi và thoát với lỗi. Người mới và những người sử dụng ngôn ngữ PHP đầu tiên có thể sẽ tự hỏi "umm, hai chức năng thoát, tôi nên sử dụng chức năng nào?" Hướng dẫn không giải thích tại sao có exit () và die ().

Nói chung, PHP có rất nhiều sự dư thừa kỳ lạ như thế này - nó cố gắng thân thiện với những người đến từ các nền tảng ngôn ngữ khác nhau, nhưng trong khi làm như vậy, nó tạo ra sự dư thừa khó hiểu.


14
Mặc dù đây là câu trả lời thứ 100 nói rằng chúng tương đương nhau (như đã thấy trong câu trả lời của tôi ^^), nhưng điều này thực sự bổ sung một số điểm RẤT tốt. Hầu hết tất cả chúng KHÔNG giống nhau trong các ngôn ngữ khác (do đó, sự nhầm lẫn ở nơi đầu tiên). (+1)
Levite

@Levit, Không, không, bạn đang hiểu sai hoàn toàn . Không ai sở hữu tên và các ngôn ngữ khác nhau sử dụng lại cùng tên theo cách không cần thiết. Điều đó tốt bởi vì chúng ta không cần một cách làm tiêu chuẩn khác. "Sự nhầm lẫn ở vị trí đầu tiên" là do PHP gán hai tên khác nhau cho một chức năng ..
Pacerier

2
@Pacerier: Chắc chắn, nếu bạn nhìn nó từ quan điểm "lỗi là của ai", điều đó hoàn toàn đúng. Tuy nhiên, thực tế là chúng chỉ đơn giản có nghĩa là những thứ khác nhau trong một số ngôn ngữ (đó là ok). Nhìn từ góc độ trung lập, nó chắc chắn đúng: Có sự nhầm lẫn vì các ý nghĩa khác nhau (ngay cả khi đó là lỗi của php khi tạo hai bí danh hàm bằng nhau). Tôi chắc chắn không muốn chỉ tay vào bất kỳ ngôn ngữ nào trong số đó, nếu đó là những gì bạn hiểu từ nhận xét của tôi ... (xkcd btw tuyệt vời (Y) ^^)
Levite

2
Đây chắc chắn là câu trả lời được lựa chọn, mô tả tốt!
Cody Brown

Một người dùng khác trả lời rằng exit()không đóng kết nối trong khi die()có vẻ như có liên quan.
ner0

62

Như đã nêu trước đây, hai lệnh này tạo ra mã thông báo trình phân tích cú pháp giống nhau.

NHƯNG

Có một sự khác biệt nhỏ và đó là mất bao lâu để trình phân tích cú pháp trả lại mã thông báo.

Tôi đã không nghiên cứu trình phân tích cú pháp PHP, nhưng nếu đó là một danh sách dài các hàm bắt đầu bằng "d" và một danh sách ngắn hơn bắt đầu bằng "e", thì phải có một hình phạt thời gian tìm kiếm tên hàm cho các hàm bắt đầu bằng " e ". Và có thể có sự khác biệt khác do cách kiểm tra toàn bộ tên hàm.

Tôi nghi ngờ nó sẽ có thể đo lường được trừ khi bạn có một môi trường "hoàn hảo" dành riêng cho việc phân tích cú pháp PHP và rất nhiều yêu cầu với các tham số khác nhau. Nhưng phải có một sự khác biệt, xét cho cùng, PHP là một ngôn ngữ được diễn giải.


4
@Timless, Người cầu toàn sẽ không nói "PHP là ngôn ngữ được diễn giải". PHP là ngôn ngữ có thể được diễn giải hoặc biên dịch tùy thuộc vào thiết lập máy chủ của bạn.
Pacerier

29
Và ... "chết" dài 3 ký tự so với 4 cho "thoát". Vì vậy, cần ít hơn 25% dung lượng bộ nhớ và tệp! ;)
Jan Derk

2
'"nếu đó là một danh sách dài các hàm bắt đầu bằng" d "và một danh sách ngắn hơn bắt đầu bằng" e ", thì phải có một hình phạt thời gian tìm kiếm tên hàm cho các hàm bắt đầu bằng" e "'. có nghĩa là hình phạt thời gian sẽ xảy ra khi tra cứu chức năng bắt đầu bằng d ? Thông thường, danh sách càng lớn, thời gian tìm thấy một mục trong đó càng lâu.
Pere

9
Như bạn đã viết, bạn đã không nghiên cứu trình phân tích cú pháp PHP. Cảm ơn câu trả lời vô dụng này vì nó dựa trên giấc mơ của bạn về cách triển khai PHP.
heo

44

Hướng dẫn sử dụng PHP trên die :

chết - tương đương để thoát

Bạn thậm chí có thể làm die;theo cách tương tự exit;- có hoặc không có parens.

Ưu điểm duy nhất của việc chọn die()qua exit(), có thể là thời gian bạn rảnh rỗi khi gõ thêm một chữ cái ;-)


1
điều này cũng thuận tiện khi ai đó đến từ ngôn ngữ khác, họ có quen với một trong hai cách không
Rohan Khude

lưu ý rằng nếu chạy php tương tác ( php -a) die;, die();, exit;exit();không có hiệu lực, trong khi exit(không có dấu chấm phẩy) thoát chế độ tương tác.
santiago arizti

31

Như tất cả các câu trả lời đúng khác nói, dieexitgiống hệt nhau / bí danh.

Mặc dù tôi có một quy ước cá nhân rằng khi tôi muốn kết thúc việc thực thi một kịch bản khi nó được mong đợi và mong muốn, tôi sử dụng exit;. Và khi tôi cần kết thúc thực thi do một số vấn đề (không thể kết nối với db, không thể ghi vào tệp, v.v.), tôi sử dụng die("Something went wrong.");để "giết" tập lệnh.

Khi tôi sử dụng lối ra:

header( "Location: http://www.example.com/" ); /* Redirect browser */
/* Make sure that code below does not get executed when we redirect. */
exit; // I would like to end now.

Khi tôi sử dụng chết:

$data = file_get_contents( "file.txt" );
if( $data === false ) {
    die( "Failure." ); // I don't want to end, but I can't continue. Die, script! Die!
}
do_something_important( $data );

Bằng cách này, khi tôi thấy exittại một số điểm trong mã của mình, tôi biết rằng tại thời điểm này tôi muốn thoát vì logic kết thúc ở đây. Khi tôi thấy die, tôi biết rằng tôi muốn tiếp tục thực hiện, nhưng tôi không thể hoặc không nên do lỗi trong lần thực hiện trước.

Tất nhiên điều này chỉ hoạt động khi làm việc trên một dự án một mình. Khi có nhiều người hơn, sẽ không có ai ngăn họ sử dụng diehoặc exitnơi không phù hợp với quy ước của tôi ...


29

Đây là một cái gì đó khá thú vị. Mặc dù exit()die()là tương đương, die() đóng kết nối. exit() không đóng kết nối.

die():

<?php
    header('HTTP/1.1 304 Not Modified');
    die();
?>

exit():

<?php
    header('HTTP/1.1 304 Not Modified');
    exit();
?>

Các kết quả:

exit():

HTTP/1.1 304 Not Modified 
Connection: Keep-Alive 
Keep-Alive: timeout=5, max=100

die():

HTTP/1.1 304 Not Modified 
Connection: close

Chỉ cần đưa vào tài khoản cho dự án của bạn.

Tín dụng: https://stackoverflow.com/a/20932511/4357238


1
Đây phải là câu trả lời được chấp nhận.
ner0

2
Chỉ cần thử nghiệm nó và exitdielàm việc theo cách tương tự, cả hai đều kết nối chặt chẽ.
Grzegorz Adam Kowalski

12

Về mặt chức năng, chúng giống hệt nhau nhưng tôi sử dụng chúng trong các tình huống sau để làm cho mã có thể đọc được:

Sử dụng die () khi có lỗi và phải dừng thực thi.

ví dụ die( 'Oops! Something went wrong' );

Sử dụng exit () khi không có lỗi và phải dừng thực thi.

ví dụ exit( 'Request has been processed successfully!' );


11

Trang này nói dielà đồng minh của nhau exit, vì vậy chúng giống hệt nhau. Nhưng cũng giải thích rằng:

có những chức năng thay đổi tên vì dọn dẹp API hoặc một số lý do khác và tên cũ chỉ được giữ làm bí danh cho khả năng tương thích ngược. Việc sử dụng các loại bí danh này thường là một ý tưởng tồi, vì chúng có thể bị ràng buộc với lỗi thời hoặc đổi tên, điều này sẽ dẫn đến kịch bản không thể truy cập được.

Vì vậy, hãy gọi tôi là hoang tưởng, nhưng có thể không có dieing trong tương lai.


3
Nó cũng cho biết Trong một số trường hợp, không có tên ưa thích trong số nhiều người, is_int()is_integer()chẳng hạn đều tốt như nhau. Nhìn vào php-srclịch sử cam kết trên GitHub, die()cấu trúc đã có trong PHP ít nhất là từ năm 1999 khi nó được chuyển đổi thành kho lưu trữ SVN và có lẽ chừng nào ngôn ngữ này còn tồn tại. Có vẻ ngớ ngẩn khi tưởng tượng rằng nó sẽ không bao giờ bị phản đối.
Đánh dấu Amery

2
@MarkAmery, Mặc dù cơ sở của anh ta không dẫn đến kết luận của anh ta, nhưng kết luận này có giá trị: ~ "Gọi tôi là hoang tưởng, nhưng có thể không có exittrong tương lai. Hoặc có thể không có dietrong tương lai"
Pacerier

@Pacerier Khá đúng. Có thể không có PHP trong tương lai, vì vậy tất cả chúng ta hãy thoát khỏi hợp đồng lập trình này và trở thành người đảm nhận hoặc người thu thuế. Không có gì là chắc chắn ngoài cái chết và thuế, sau tất cả.
Đánh dấu Amery

@MarkAmery, "Không có PHP trong tương lai" dường như vượt quá mức hoang tưởng trên trung bình. Lịch sử đã chỉ ra rằng các ngôn ngữ cực kỳ phổ biến không dễ dàng chết đi (Fortran!).
Pacerier

1
Đừng hoang tưởng. lối ra sẽ không bao giờ chết . :)
heo


6

Chúng cơ bản giống nhau, mặc dù bài viết này đề xuất khác.


1
Bài báo đó thật kỳ lạ; từ định nghĩa máy quét bạn có thể nói chúng tương đương nhau; nếu có sự khác biệt, có lẽ bài kiểm tra đã được thực hiện mà không có opcache.
Ja͢ck

Bài viết nói về một điểm chuẩn không thể sao chép vì mã không được công bố. Chỉ cần bỏ qua nó.
heo

0

Về mặt chức năng, chúng giống hệt nhau. Vì vậy, để chọn cái nào để sử dụng hoàn toàn là một sở thích cá nhân. Về mặt ngữ nghĩa trong tiếng Anh, chúng khác nhau. Chết âm thanh. Khi tôi có một hàm trả về dữ liệu JSON cho máy khách và chấm dứt chương trình, thật tệ nếu tôi gọi hàm này là jsonDie () và thích hợp hơn để gọi nó là jsonExit (). Vì lý do đó, tôi luôn sử dụng lối ra thay vì chết.


OP chỉ hỏi về chức năng thoát và chết của PHP.
Mamba đen

1
Vâng, và tôi chỉ trả lời câu hỏi đó. Tuy nhiên, để nhận thức được, câu hỏi không chỉ là về sự khác biệt về chức năng.
Luo Jiong Hui

Một trong những hàm đáng yêu nhất của tôi được gọi là pd () - Có nghĩa là Xin hãy chết. Vì vậy, tôi không chắc chắn rằng chết là một điều tồi tệ trong bối cảnh như vậy :)
Ivan Ponomarev

Là một nhà phát triển stack đầy đủ, tôi không chỉ thấy mình là một lập trình viên, mà còn là một nhà thiết kế Trải nghiệm người dùng. Và trong bối cảnh này, sự cảm thông là quan trọng. Sự thông cảm không chỉ ảnh hưởng đến cách tôi thiết kế UI mà còn cả cách tôi viết mã.
Luo Jiong Hui

0

Từ những gì tôi biết khi tôi nhìn vào câu hỏi này ở đây

Nó nói rằng "trong PHP, có một sự khác biệt rõ ràng trong đầu ra Tiêu đề. Trong các ví dụ bên dưới, tôi đã chọn sử dụng một tiêu đề khác nhưng để hiển thị sự khác biệt giữa exit () và die () không quan trọng", và thử nghiệm (cá nhân)


-3

Trong w3schools Quiz: Các hàm die () và exit () có làm chính xác điều tương tự không? Câu trả lời của tôi là sai. Đó là câu trả lời không chính xác. Câu trả lời đúng là đúng.

Đây là ảnh chụp màn hình: nhập mô tả hình ảnh ở đây


-5

Một cái gì đó tôi đã nhận thấy trong các tập lệnh của mình ít nhất là exit () sẽ dừng tập lệnh hiện đang thực thi và chuyển điều khiển trở lại bất kỳ tập lệnh gọi nào, trong khi die sẽ dừng php trong các bài hát của nó. Tôi sẽ nói rằng đó là một sự khác biệt khá lớn?


1
@AdarshMadrecha điều này không đúng. Nếu chúng ở bên trong hoặc bên ngoài một chức năng con, tập lệnh php luôn dừng lại.
Mert DOĞAN

-5

Kết quả của hàm exit () và hàm die () đều giống nhau. Nhưng như được giải thích trong trang hướng dẫn bí danh ( http://php.net/manual/en/aliases.php ), nó nói rằng hàm die () gọi hàm thoát. Tôi nghĩ rằng nó được mã hóa cứng như dưới đây:

function die($msg){
  exit($msg);
}

Đây không phải là vấn đề hiệu suất cho các dự án nhỏ, vừa và lớn nhưng nếu dự án có hàng tỷ tỷ tỷ tỷ tỷ nhân, thì điều này xảy ra rất quan trọng trong trạng thái tối ưu hóa hiệu suất.

Nhưng hầu hết mọi người không nghĩ rằng đây là một vấn đề, bởi vì nếu bạn có quá trình đó, bạn phải nghĩ nhiều vấn đề hơn là nếu một chức năng là chủ hoặc bí danh.

Nhưng, câu trả lời chính xác là vậy; allways chức năng tổng thể là nhanh hơn bí danh.

Cuối cùng; Trang hướng dẫn bí danh nói rằng, bạn có thể không còn sử dụng die. Nó chỉ là một bí danh, và nó không được dùng nữa.

Việc sử dụng các loại bí danh này thường là một ý tưởng tồi, vì chúng có thể bị ràng buộc với lỗi thời hoặc đổi tên, điều này sẽ dẫn đến kịch bản không thể truy cập được. Danh sách này được cung cấp để giúp những người muốn nâng cấp tập lệnh cũ của họ thành cú pháp mới hơn.


2
Bí danh không phải là 'gọi một chức năng'. Kiểm tra các giả định của bạn trước khi xây dựng giả thuyết.
heo

@dolmen Bí danh allways gọi các chức năng chính trong mã cứng. Đây là một quy tắc lập trình chung.
Mert DOĞAN

@ MERTDOĞAN Một bí danh không gọi bất cứ điều gì. Một bí danh (trong lập trình hoặc trong cuộc sống thực) chỉ là một tên khác của một đối tượng (đã có tên). die()không phải là một chức năng riêng biệt. Nó chỉ là một tên khác của exit(). Câu trả lời này chứa các tuyên bố không chính xác về bí danh và hiệu suất của chúng.
axiac

docs.php.net/manual/en/ Từ Aliases allways gọi như ví dụ trên. Học một cái gì đó và trở lại.
Mert DOĞAN 16/03/18

-10

Chúng có âm thanh giống nhau, tuy nhiên, exit () cũng cho phép bạn đặt mã thoát của tập lệnh PHP.

Thông thường bạn không thực sự cần điều này, nhưng khi viết các kịch bản PHP của bàn điều khiển, bạn có thể muốn kiểm tra ví dụ Bash nếu tập lệnh hoàn thành mọi thứ theo đúng cách.

Sau đó, bạn có thể sử dụng exit () và bắt nó sau. Die () tuy nhiên không hỗ trợ điều đó.

Die () luôn tồn tại với mã 0. Vì vậy, về cơ bản, lệnh die () thực hiện như sau:

<?php
echo "I am going to die";
exit(0);
?>

Điều này giống như:

<?php
die("I am going to die");
?>

42
Đo không phải sự thật. dieexitgiống hệt nhau (chúng tạo ra cùng một mã thông báo trình phân tích cú pháp ( T_EXIT) và được thực thi bởi cùng một mã). Nếu tham số là một số nguyên, nó sẽ trả lại mã đó cho shell. Nếu không, nó sẽ xuất ra và trả về 0. Vì vậy, dieexittheo nghĩa đen là bí danh cho nhau.
ircmaxell

6
tốt nếu bạn biết bạn có thể sử dụng lối ra ("Tôi đang thoát ...");
Yuda Prawira

4
23 upvote cho đến nay cho một câu trả lời đơn giản là sai! Đây là lý do tại sao tôi không bao giờ bỏ phiếu cho các câu trả lời cho đến khi tôi đọc tất cả các câu trả lời cạnh tranh cho câu hỏi và hiểu tất cả các câu trả lời (loại bỏ những câu được viết quá khủng khiếp mà tôi không thể hiểu được).
Đánh dấu Amery

3
Đây chính xác là những gì @GeoffreyHale viết về câu trả lời của anh ấy. Những gì bạn đã đăng dưới dạng câu trả lời là những gì người ta mong đợi, đến từ một ngôn ngữ như Perl hoặc C. Nhưng như những người khác đã đề cập, điều đó không đúng với php. Bạn thực sự có thể xem xét chỉnh sửa câu trả lời của mình để phản ánh điều này hoặc xóa nó đi.
Levite
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.