2012-05-07 24 views
8

Tôi vừa mới đọc trang trên Expressions trong tài liệu PHP, và ngay ở đầu nó nói:Đây có phải là cách xử lý đặc biệt để thoát và chết trong tài liệu PHP không?

Cách chưa chính xác nhất đơn giản nhất để xác định một biểu thức là "bất cứ thứ gì có giá trị".

Định nghĩa đơn giản đó bao gồm tất cả các chức năng và hầu hết cấu trúc ngôn ngữ, tuy nhiên có một vài cấu trúc ngôn ngữ thể hiện rõ ràng chúng không trả về giá trị.

Dưới đây là danh sách các cấu trúc ngôn ngữ mà trả về một giá trị:

Đây là một vài thú vị mà không trả về một giá trị, và do đó không biểu:

tôi thấy dieexit quan tâm đặc biệt, bởi vì chúng có thể được sử dụng như là biểu thức trong PHP mặc dù không có giá trị trả về. Các dòng mã sau đây tất cả ném một lỗi cú pháp, như mong đợi:

echo 'Hi' or echo 'Bye'; 

if(echo('foo')) 
    return return(1); 

$foo['bar'] = isset($foo['bar']) ? unset($foo['bar']) : 0; 

if(unset($foo['bar'])) 
    __halt_compiler() or die; 

Tuy nhiên các mã PHP sau đây là hoàn toàn miễn phí các lỗi cú pháp:

print 'Hi' or print 'Bye'; // Makes sense, print returns a value 

if(!die() and exit)   // Wait what's happening here? 
    quit(die(exit(quit()))); // die and exit don't have return values (does quit?) 

$x = true ? die/2 : 5*exit(); 
$y = pow(die,7); 

isset($_GET['bar']) or die(); // This one is actually pretty commonly used. 

function quit(){    
    return exit; 
} 

Tôi đã nhìn qua các tài liệu PHP và có thể không tìm thấy bất kỳ đề cập đến điều trị đặc biệt này của die() và exit(). Làm bất kỳ chuyên gia PHP biết nếu điều này là tài liệu bất cứ nơi nào. Đây có phải là hành vi dự định và là mẫu isset($_GET['bar']) or die(); an toàn để sử dụng hay không; nó đột nhiên có thể phá vỡ trong một phiên bản tương lai của PHP?

+8

Đây không phải là vấn đề ngữ nghĩa sao? Có phải là 'die()'/'exit()' không có giá trị trả về * bởi vì chúng không bao giờ trả về *? Nó không phải là họ là * cú pháp * không biểu thức, nhưng rằng tại thời gian chạy bạn sẽ không bao giờ nhận được để xem giá trị trả lại bởi vì chương trình của bạn không bao giờ có cơ hội sử dụng nó. –

+2

có an toàn để sử dụng không? Vâng. thành ngữ đó được rải rác khắp sách hướng dẫn trong các ví dụ. Họ không thể quay trở lại. Ngoài ra, trong danh sách nội bộ, họ luôn nói về bao nhiêu kịch bản trong tự nhiên sẽ bị phá vỡ bởi một thay đổi trước khi thực hiện nó, và điều này sẽ phá vỡ ... im đoán 1/3 của tất cả các script php? lol – goat

Trả lời

3

dieexit (họ chia sẻ T_EXIT token) thuộc các quy tắc cho expr_without_variable trong giai đoạn phân tích, đó là lý do tại sao PHP là hạnh phúc khi có họ trong bối cảnh biểu hiện mà không đưa ra lỗi cú pháp.

Làm bất kỳ chuyên gia PHP nào biết nếu điều này được ghi lại ở bất kỳ đâu.

Không có mô tả về đối xử đặc biệt trong cuốn hướng dẫn PHP, tuy nhiên first example trên exit trang hướng dẫn cho thấy nó được sử dụng như … or exit.

Đây là hành vi dự định và là mẫu isset($_GET['bar']) or die(); an toàn để sử dụng; nó đột nhiên có thể phá vỡ trong một phiên bản tương lai của PHP?

Có. Vâng. Bất cứ điều gì có thể, tuy nhiên không.

+0

Câu trả lời hoàn hảo, cảm ơn :) – Paulpro

+1

@salathe Có thể, nhưng lý do của bạn là sai. Có thể, bởi vì khả năng tương thích ngược 100% không phải là một trong những mục tiêu thiết kế của PHP: http://www.php.net/manual/en/migration53.incompatible.php – Pacerier

1

Một đoán hoang dã là dieexit làm trả về một giá trị, tuy nhiên, nó sẽ không bao giờ được trả lại kể từ khi thực hiện phải dừng lại trước khi nó được trả về.

Điều này có thể đã được triển khai để thêm một số "tính hữu ích" vào các hàm dieexit.

+0

chết và thoát khỏi thực hiện dừng tại thời gian chạy. Lỗi cú pháp phải được bắt tại thời gian biên dịch. – Paulpro

+0

@ PaulP.R.O. Có lẽ họ nghĩ nó sẽ hữu ích, đúng vậy. Họ có thể trả lại một giá trị, như 'print', tuy nhiên, giá trị không bao giờ được trả về vì việc thực thi bị tạm dừng trước đó. – Ben

+0

Tài liệu hướng dẫn rõ ràng rằng chúng không có giá trị trả lại: http://php.net/manual/en/function.exit.php. Tôi đồng ý rằng nó rất hữu ích, nhưng nếu nó không được ghi chép ở bất cứ đâu thì tôi sẽ rất do dự khi sử dụng ký hiệu 'hoặc die(); 'khi theo tài liệu, nó có vẻ là một lỗi cú pháp. – Paulpro

1

giá trị trả về chết và thoát, tuy nhiên giá trị đó phải được chương trình đã gọi là tập lệnh PHP sử dụng. This comment mô tả hành vi.

4

PHP không phát hiện lỗi ngoại trừ thời gian chạy khi đạt đến đường dẫn mã. Không giống như nhiều ngôn ngữ khác, nó không liệt kê các lỗi khi trang được "biên dịch" - vì vậy bạn sẽ chỉ thấy các lỗi khi các dòng mã nguồn tương ứng của chúng được thực thi.

Trong ví dụ của bạn, việc đánh giá giá trị trả lại là exit hoặc diekhông bao giờ được thực hiện. PHP không báo cáo lỗi vì nó không bao giờ cố gắng đánh giá kết quả ở vị trí đầu tiên, bởi vì chuỗi đã thoát.

Các vấn đề liên quan