2009-05-10 37 views
6

Có sự khác biệt tốc độ giữaĐiều gì tốt hơn, có hay không?

if (isset($_POST['var'])) 

hoặc

if ($_POST['var']) 

Và đó là tốt hơn hoặc là họ giống nhau không?

+4

Rõ ràng, phải mất nhiều thời gian để gõ isset():/ –

+0

Chỉ cần tự hỏi nếu có bất kỳ lý do thực sự nào tại sao nó sẽ là cần thiết trong trường hợp này. Tôi đoán không phải là – James

Trả lời

17

Đó là một thực hành tốt để sử dụng isset vì những lý do sau đây:

  • Nếu $_POST['var'] là một chuỗi rỗng hoặc "0", isset vẫn sẽ phát hiện rằng các biến tồn tại.
  • Không sử dụng isset sẽ tạo thông báo.
13

Chúng không giống nhau. Hãy xem xét một mảng danh nghĩa:

$arr = array(
    'a' => false, 
    'b' => 0, 
    'c' => '', 
    'd' => array(), 
    'e' => null, 
    'f' => 0.0, 
); 

Giả sử $x là một trong những chìa khóa ('a' đến 'f') và phím 'g' mà không phải là có nó hoạt động như thế này:

  • $arr[$x]false cho tất cả các phím từ a đến g;
  • isset($arr[$x])true cho các phím a, b, c, d và f nhưng false cho e và g; và
  • array_key_exists($x, $arr)true cho tất cả các phím a đến f, false cho g.

Tôi khuyên bạn nên xem PHP's type juggling, cụ thể là chuyển đổi sang booleans.

Cuối cùng, những gì bạn đang làm được gọi là micro-optimization. Không bao giờ chọn cái nào trong số đó được coi là nhanh hơn. Cho dù nhanh hơn là không đáng kể trong sự khác biệt rằng nó nên không bao giờ là một yếu tố ngay cả khi bạn có thể xác định đáng tin cậy đó là nhanh hơn (mà tôi không chắc chắn bạn có thể đến bất kỳ mức độ có ý nghĩa thống kê).

+0

cletus là đúng - một truy vấn SQL sẽ chậm hơn một nghìn lần so với một nghìn lần kiểm tra isset. Nó cũng đáng chú ý rằng nếu ($ arr ['g']) sẽ tạo ra một E_NOTICE "biến không xác định". – Shabbyrobe

4

isset kiểm tra biến có bất kỳ giá trị nào không, trong khi nếu kiểm tra giá trị của biến.

Ví dụ:

// $_POST['var'] == 'false' (the string false) 
if (isset($_POST['var'])) { 
    // Will enter this if 
} 
if ($_POST['var']) { 
    // Won't enter this one 
} 

Vấn đề lớn là sự tương đương của hai biểu thức phụ thuộc vào giá trị của biến bạn đang kiểm tra, vì vậy bạn không thể làm cho các giả định.

+0

Tôi có cảm giác bạn cần chỉnh sửa một chút trên dòng đầu tiên. isset không "kiểm tra rằng biến có bất kỳ giá trị nào" nó kiểm tra nếu nó đã được tạo/tạo ra '$ a = ''; isset ($ a); 'sẽ đánh giá là true. –

1

Trong PHP nghiêm ngặt, bạn cần kiểm tra xem biến có được đặt trước khi sử dụng hay không.

error_reporting(E_ALL | E_STRICT); 

Những gì bạn đang làm gì ở đây

if ($ var)

là không kiểm tra nếu giá trị được thiết lập. Vì vậy, PHP nghiêm ngặt sẽ tạo ra một thông báo cho các biến chưa được đặt.(điều này xảy ra rất nhiều với mảng)

Cũng trong PHP nghiêm ngặt (chỉ là một FYI cho bạn hoặc người khác), sử dụng một var chưa được đặt làm đối số trong hàm sẽ ném thông báo và bạn không thể kiểm tra isset() trong chức năng để tránh điều đó.

+0

Điều này không hoàn toàn chính xác. E_STRICT không có gì liên quan đến thông báo bị ném trong trường hợp này. Ngay cả khi E_STRICT bị tắt, thông báo vẫn bị ném. – Matt

+0

Bạn có nghĩa là trong mã hoặc tệp nhật ký? Vì bạn cần bật E_STRICT trong tệp php.ini để nó được ném (trước PHP 6) –

0

Chỉ cần lặp đi lặp lại những gì người khác nói, nếu bạn thực hiện:

if($variable) 

và $ biến là không thiết lập, bạn sẽ nhận được một lỗi thông báo. Plus ..

$var = 0; 
if($variable) { 
    //This code will never run, because $var is false 
} 

nhưng sử dụng isset sẽ trả về đúng trong trường hợp này.

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