2011-08-08 31 views
6

Tôi đã đi qua phần tử ưu tiên của php.net và đã xem qua this example mà nóiSự khác nhau giữa "&&" và "và": Hành ưu tiên và ngắn mạch

$a = 1; 
$b = null; 
$c = isset($a) && isset($b); 
$d = (isset($a) and isset($b)); 
$e = isset($a) and isset($b); 
var_dump($a, $b, $c, $d, $e); 
//Result: 
int(1) 
NULL 
bool(false) 
bool(false) <== I get this 
bool(true) <== I do not get this 

tôi sử dụng khá nhiều và gỡ lỗi câu lệnh in (_r) trong mã của tôi để theo dõi vị trí của tôi trong mã. Vì vậy, tôi sử dụng $debug and print_r($dataArray) hoặc $verbose and print "Updating dataArray\n" làm các câu lệnh riêng biệt ở giữa mã, cho phép tôi kiểm soát các câu lệnh in (_r) này. Điều này xuất phát từ kinh nghiệm BASH của tôi, nơi tôi từng viết rất nhiều [[ $condition ]] && { #Do if true } || { #Do if false }. Trong BASH, tôi biết rằng họ bị đoản mạch và sử dụng thực tế này để viết rất nhiều loại lót đơn giản.
Bây giờ tôi đang quan sát thấy rất nhiều thực hành này (bằng văn bản $verbose and print) đang dần dần đi sâu vào các tuyên bố if của tôi. Tôi biết điều này là KHÔNG phải là phương pháp được đề nghị và có thể cắn tôi trong số quay lại. Tuy nhiên, tôi muốn làm chủ kỹ năng này khi tôi thích viết một lớp lót như vậy và muốn sử dụng nó như kiểu cá nhân của tôi.

Vì vậy, câu hỏi của tôi (s) là (là):

  1. Những nhà điều hành (&& hoặc and) là ngắn mạch?
  2. Hướng dẫn sử dụng && được ưu tiên hơn and, nhưng ai đó có thể minh họa điều này bằng cách trộn tính năng/chức năng/đặc tính toán tử được vận hành ngắn với ưu tiên người vận hành. (về cơ bản kết hợp và phù hợp với ưu tiên và đoản mạch)

Vui lòng xây dựng trên cả tính chất mạch ngắn cũng như giá trị trả về của các toán tử.

PS: 1. Tôi hy vọng sự kết hợp của các nhà khai thác này giống nhau và trực quan, nhưng nếu bạn biết bất kỳ kỳ quặc nào, hãy khai sáng cho tôi.
PS: 2. Nếu bạn vẫn cảm thấy cảnh báo tôi về những hiểm họa của thực hành như vậy, vui lòng bao gồm các ví dụ.

EDIT: Sau khi thay đổi đơn giản $var = mysql_(...) or die() mã của tôi bằng cách thay thế or với ||, tôi phát hiện ra cách gây phiền nhiễu nó có thể được sử dụng ||&& nhà khai thác thay vì andor. Mã đơn giản không hoạt động! Theo hiểu biết của tôi, cấu trúc cũ gán giá trị trả lại là TRUE hoặc FALSE đến $var, do đó, việc sử dụng liên tục $var để tạo cảnh báo/lỗi/hành vi không mong muốn. Sau đó, cấu trúc gán kết quả là mysql_(...) đến $var trước rồi đánh giá hợp chất của =die.
Đây là bài học hay cho tôi, tốt hơn 1. Bắt đầu sử dụng PDO/mysqli và xử lý các lỗi của riêng tôi 2. Suy nghĩ kỹ trước khi viết một cái gì đó mà tôi gọi là phong cách cá nhân.
// lưu ý đến bản thân: không sử dụng trải nghiệm của một ngôn ngữ kịch bản/diễn giải trong khi viết mã bằng ngôn ngữ khác, mỗi ngôn ngữ là duy nhất và có quirks và cạm bẫy riêng của nó, và đó chỉ buồn * thở dài *

+0

bản sao có thể có của [Tham khảo - Biểu tượng này có ý nghĩa gì trong PHP?] (Http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) – Gordon

+0

@Gordon : Cảm ơn bạn vì _Reference_. Tôi đã kiểm tra danh sách và mặc dù một vài câu hỏi dường như trả lời một phần câu hỏi (như ưu tiên, mà tôi đã biết). IMHO bản chất ngắn mạch của các nhà khai thác cùng với ưu tiên của họ không được thảo luận chi tiết. – Sudhi

+0

Tác giả của nhận xét trên liên kết mẫu đề cập đến quyền ưu tiên của toán tử cho biết từ khóa AND đang được đánh giá sau giá trị bằng. Nó xuất hiện kỳ ​​lạ nhưng nó nhắc tôi về một số 'mysql_connect (...) hoặc die()' dòng một số kịch bản sử dụng. –

Trả lời

7

$e = isset($a) and isset($b); 

được phân tách giống như

($e = isset($a)) and isset($b); 

do đó $e, được xác định bởi isset($a) và nhiệm vụ, là true - không phụ thuộc vào evaluati ng isset($b).

+1

Vì vậy, để được rõ ràng: Nó không liên quan đến ngắn mạch. –

+0

@Felix: bạn có thể viết/giải thích/giải thích ngắn mạch trong PHP không? Tôi đặc biệt quan tâm đến giá trị trả về được tạo ra sau khi đoản mạch. – Sudhi

+1

@Sudhi: Tôi không hiểu những gì bạn muốn tôi viết. Tất cả các toán tử này ('&&', '||', 'và',' hoặc') là ngắn mạch ... giá trị trả về luôn là giá trị boolean. –

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