2011-02-03 39 views
5

tôi đi qua đường thú vị này trong file index.php mặc định cho một dự án Zend Framework:Cú pháp PHP thú vị: một 'ngụ ý nếu'?

defined('APPLICATION_PATH') 
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 

Có vẻ như muốn nói "Nếu APPLICATION_PATH không được định nghĩa, sau đó đi vào và xác định nó ..."

Tôi không biết cấu trúc điều khiển này trong PHP. Nó gần giống như một 'ngụ ý nếu' hoặc 'nếu/người khác'. Có ai có thể giúp tôi hiểu về điều này?

Trả lời

16

Nó không phải là một cấu trúc điều khiển - nó chỉ là cách hoạt động của ||. Nếu toán hạng đầu tiên được đánh giá là true - thì thứ hai không được đánh giá.

http://php.net/manual/en/language.operators.logical.php --- xem 4 dòng đầu tiên của mẫu.

// -------------------- 
// foo() will never get called as those operators are short-circuit 

$a = (false && foo()); 
$b = (true || foo()); 
$c = (false and foo()); 
$d = (true or foo()); 
+3

Ngược lại, chỉ khi biểu thức đầu tiên là sai, cột thứ hai được đánh giá. –

+2

@Surreal Dreams: hiển nhiên - có ;-) – zerkms

+0

+1 tốt! Đọc thêm tại [Wikipedia] (http://en.wikipedia.org/wiki/Short-circuit_evaluation). – alex

2

Về mặt kỹ thuật, đây chỉ là một biểu thức boolean được đánh giá nhưng sẽ loại bỏ kết quả. Nó sử dụng logic mạch ngắn để đảm bảo rằng nửa sau của nó chỉ chạy khi nửa đầu là sai.

Tương tự như vậy, bạn có thể chụp kết quả:

$foo = false || true; // $foo will contain true. 
+0

Và luôn có toán tử ternary đáng yêu: '$ action = (được định nghĩa ('APPLICATION_PATH'))? 'mặc định': define ('APPLICATION_PATH', realpath (dirname (__ FILE__). '/../application')); ' – buley

+0

@editor tại sao sử dụng ternary nếu logic hoạt động tốt và dễ đọc hơn –

2

Đây là một short-circuiting evaluation của một biểu thức boolean, mà thực sự là một cách để đạt được một cái gì đó giống như một if-else.

4

|| là nhà điều hành mạch ngắn. Nếu toán hạng bên trái là true, biểu thức dưới dạng toàn bộ phảitrue, do đó, nó sẽ không làm phiền việc đánh giá toán hạng bên phải. Bạn có thể sử dụng && theo cách ngược lại; nếu toán hạng bên trái là false, toàn bộ cụm từ phải là false, do đó toán hạng bên phải sẽ không được đánh giá.

Đây là một cách khá thành ngữ để làm mọi thứ bằng một số ngôn ngữ khác. Tôi thường thích một rõ ràng if trong PHP mặc dù trong trường hợp này.