Làm thế nào để "làm điều gì đó HOẶC DIE ()" hoạt động trong PHP?


99

Tôi đang viết một ứng dụng php để truy cập cơ sở dữ liệu MySQL và trong một hướng dẫn, nó có nội dung dạng

mysql_connect($host, $user, $pass) or die("could not connect");

Làm thế nào để PHP biết rằng hàm bị lỗi để nó chạy phần chết? Tôi đoán là tôi đang hỏi cách hoạt động của phần "hoặc". Tôi không nghĩ rằng tôi đã nhìn thấy nó trước đây.


3
Ngoài ra, đừng sử dụng loại logic này trong các ứng dụng thực tế. Nó vẫn làm tôi ngạc nhiên về số lượng hướng dẫn làm điều đó.
Eran Galperin

2
Tại sao không sử dụng nó? Nó thực sự thoải mái và có thể đọc được ...
rkj

11
Có thể đơn giản và thích hợp cho một hướng dẫn, nhưng bạn không muốn tập lệnh của mình chết một cách vô duyên với một thông báo lỗi như vậy trước mặt người dùng thực. Hiển thị một trang lỗi tùy chỉnh (mà không chỉ định lỗi thực sự!) + Ghi lại lỗi là điều bắt buộc.
Eran Galperin

4
Tôi đang nói về "hoặc", không phải "chết".
Artelius

21
mysql_connect ($ host, $ user, $ pass) hoặc PrintNiceError ('DatabsaeConnectionError');
matpie

Câu trả lời:


133

Nếu câu lệnh đầu tiên trả về true, thì toàn bộ câu lệnh phải là truedo đó phần thứ hai không bao giờ được thực thi.

Ví dụ:

$x = 5;
true or $x++;
echo $x;  // 5

false or $x++;
echo $x; // 6

Do đó, nếu truy vấn của bạn không thành công, nó sẽ đánh giá die()câu lệnh và kết thúc tập lệnh.


1
Lời giải thích hay. Cấu trúc ngôn ngữ "ngụ ý nếu" này của PHP hơi nguy hiểm, bởi vì bạn có thể có các câu lệnh mà bạn nghĩ rằng nó được thực thi nhưng thực sự thì không, và điều đó không rõ ràng như khi bạn có một khối if.
Petruza

6
Đây được gọi là đánh giá ngắn mạch và cũng hữu ích trong các ngôn ngữ khác ngoài PHP.
Mr Griever

1
Nhân tiện, bạn chỉ có thể sử dụng một câu lệnh duy nhất sau OR. Một câu lệnh khối sẽ không kiểm tra cú pháp (ví dụ: thông báo lỗi thực tế có thể là Lỗi phân tích cú pháp: lỗi cú pháp, không mong muốn '{' in ...)
Scott Chu

Và tôi đã ở đây, nghĩ rằng đây là một số loại tính năng nâng cao như withcâu lệnh của python , trong khi nó thực sự chỉ là một biểu thức boolean ... Tôi nghĩ nên cẩn thận hơn khi sử dụng biểu thức này nếu bạn muốn thực hiện dọn dẹp trong trường hợp các lỗi. Vui lòng sửa cho tôi nếu tôi sai, nhưng nếu bạn làm func_call($file) or die();và chức năng không thành công, thì tệp sẽ được mở khi các tập lệnh chết.
pedromanoel

@Petruza Có phải là phương pháp hay để sử dụng ortrong các tình huống mà một ifcó thể hoạt động?
Lemonandco powers

32

PHP orhoạt động giống như C ||(ngẫu nhiên cũng được PHP hỗ trợ - ortrông đẹp hơn và có ưu tiên toán tử khác - xem trang này ).

Nó được gọi là toán tử đoản mạch vì nó sẽ bỏ qua bất kỳ đánh giá nào khi nó có đủ thông tin để quyết định giá trị cuối cùng.

Trong ví dụ của bạn, nếu mysql_connect()trả về TRUE, thì PHP đã biết rằng toàn bộ câu lệnh sẽ đánh giá là TRUE bất kể điều gì được đánh giá thành die()và do đó die()không được đánh giá.

Nếu mysql_connect()trả về FALSE, PHP không biết toàn bộ câu lệnh sẽ đánh giá là TRUE hay FALSE nên nó tiếp tục và cố gắng đánh giá die()- kết thúc tập lệnh trong quá trình.

Đó chỉ là một thủ thuật hay để tận dụng cách thức orhoạt động.


+1 để đặt tên cho điểm ngắn mạch. Cũng có thể có tên "tác dụng phụ". Chúng tôi không quan tâm chút nào đến mã trả về die (), chúng tôi chỉ muốn hiệu quả của việc thực thi nó. (Không phải lúc nào cũng chết ()). Điều này không phải lúc nào cũng phổ biến với những người theo chủ nghĩa thuần túy vì một số hiệu ứng có thể bị che khuất.
mckenzm

và đây không phải là tất cả. bạn cũng có thể sử dụng và kết hợp nhiều thứ, nơi bạn muốn rằng một thứ chắc chắn hoạt động trước khi làm điều thứ hai.
My1

11

Nó hoạt động như những người khác đã mô tả.

Trong PHP, không sử dụng "die", vì nó KHÔNG tạo ra ngoại lệ (như trong Perl). Thay vào đó, hãy ném một ngoại lệ đúng cách theo cách thông thường.

die không thể bị bắt trong PHP và không ghi nhật ký - thay vào đó nó in thông báo một cách vô duyên và ngay lập tức thoát tập lệnh mà không nói với ai bất kỳ điều gì hoặc cho bạn bất kỳ cơ hội nào để ghi lại sự kiện, thử lại, v.v.


-1
$con=mysql_connect($host, $user, $pass)
if(!$con)
{
     die("could not connect");
}
else
{
     echo "Connected";
}
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.