2010-02-17 36 views
7

Xét rằng:thử nghiệm cho giá trị NULL trong một biến mà có thể không được thiết lập

  • Các isset() cấu trúc trả về TRUE nếu một biến được thiết lập và không phải là NULL
  • Chức năng is_null() ném một cảnh báo nếu biến là chưa được đặt

Có cách nào để kiểm tra xem biến có tồn tại hay không, dù NULL hay không, không sử dụng toán tử @ để chặn thông báo?


EDIT

Cùng với trả lời đầu tiên của bạn, tôi đã suy nghĩ về vấn đề này và tôi nhận được kết luận rằng kiểm tra get_defined_vars() là cách duy nhất để phân biệt giữa một bộ biến NULL và biến chưa được đặt. PHP dường như làm cho sự phân biệt nhỏ:

<?php 

$exists_and_is_null = NULL; 

// All these are TRUE 

@var_dump(is_null($exists_and_is_null)); 
@var_dump(is_null($does_not_exist)); 

@var_dump($exists_and_is_null===NULL); 
@var_dump($does_not_exist===NULL); 

@var_dump(gettype($exists_and_is_null)=='NULL'); 
@var_dump(gettype($does_not_exist)=='NULL'); 

?> 
+0

Đọc câu hỏi này một vài lần ... những gì anh ấy đang tìm kiếm là không rõ ràng và khó hơn rất nhiều so với lần xuất hiện đầu tiên. –

Trả lời

5
$result = array_key_exists('varname', get_defined_vars()); 
+0

Có lẽ không tối ưu nhưng dí dỏm –

-2
if (isset($var) && (is_null($var)) { 
    print "\$var is null"; 
} 

này nên làm các trick.

+0

Tình trạng này là FALSE khi $ var là NULL –

+0

bằng cách sử dụng 'in '$ var là null'' loại bỏ sự cần thiết phải thoát $ vì các dấu nháy đơn không được đánh giá. Nó vẫn là một giá trị chuỗi – Kim

0

Như bạn đã phát hiện ra, bạn có thể không:

  • dựa vào isset, vì nó trở false cho một biến đó là null.
  • sử dụng $not_exists===null, vì nó sẽ hiển thị thông báo.


Nhưng bạn có thể có thể sử dụng một combinaison của:

  • get_defined_vars để có được danh sách các biến hiện có, bao gồm cả những người đó là null,
  • array_key_exists để tìm hiểu xem một mục nhập tồn tại trong danh sách đó.


Ví dụ:

$exists_and_null = null; 
$exists_and_not_null = 10; 

$defined_vars = get_defined_vars(); 

// true 
var_dump(array_key_exists('exists_and_null', $defined_vars) 
    && $defined_vars['exists_and_null']===null); 

// false 
var_dump(array_key_exists('exists_and_not_null', $defined_vars) 
    && $defined_vars['exists_and_not_null']===null); 

// false 
var_dump(array_key_exists('not_exists', $defined_vars) 
    && $defined_vars['not_exists']===null); 


Một vài lưu ý:

  • Trong trường hợp đầu tiên, biến tồn tại => có một mục trong danh sách trả về bởi get_defined_vars, vì vậy phần thứ hai của điều kiện được đánh giá
    • và cả hai phần của tình trạng này là true
  • Trong trường hợp thứ hai, biến tồn tại quá, nhưng là null
    • có nghĩa là phần đầu tiên của tình trạng này là true, nhưng là một giây false,
    • để toàn bộ biểu thức là false.
  • Trong trường hợp thứ ba, biến không tồn tại,
    • có nghĩa là phần đầu tiên của tình trạng này là false,
    • và phần thứ hai của tình trạng này là không được đánh giá - đó có nghĩa là nó không nâng cao thông báo.

Nhưng lưu ý điều này có lẽ không phải là một ý tưởng tốt, nếu bạn quan tâm đến biểu diễn: isset là một cấu trúc ngôn ngữ, và nhanh chóng - trong khi gọi get_defined_vars có lẽ là chậm hơn nhiều ^^

+0

Phân tích tuyệt vời. Về mặt thực tế, việc sử dụng @ trông giống như tùy chọn tốt nhất. –

+2

Cảm ơn :-) ;;; Trong điều kiện thực tế, tôi sẽ nói rằng nói chung không cần phải tạo sự khác biệt giữa * "không tồn tại" * và * "là null" *: trong hầu hết các trường hợp, sử dụng 'isset' sẽ ổn thôi. –

0

Tôi đã sử dụng một chức năng tự tạo để kiểm tra điều này một cách dễ dàng, hãy nhớ rằng nó sẽ kích hoạt cảnh báo PHP (tôi chỉ giám sát E_ERROR khi tôi phát triển).

function isNullOrEmpty($arg) 
    { 
     if (!is_array($arg)) 
     { 
      $arg = array($arg); 
     } 

     foreach ($arg as $key => $value) 
     { 
      if($value == null || trim($value) == "") 
      { 
       return true; 
      } 
     } 
     return false; 
    } 
+0

Mã này có thể được làm sạch bằng cách sử dụng array_filter(), is_null, vv nhưng tôi sẽ không làm điều đó ở đây mà không kiểm tra nó, vì vậy tôi sẽ để đây ở đây làm ví dụ. – TravisO

0

Tôi sẽ cho rằng bất kỳ mã nào yêu cầu so sánh như vậy sẽ bị sai ngữ nghĩa; NULL giá trị không được đặt trong ngôn ngữ không có cách phân biệt rõ ràng giữa hai ngôn ngữ.

+0

Có sự khác biệt giữa (ví dụ: có số điện thoại $ number chưa được đặt (người dùng không cung cấp số của mình) và có lỗi đánh máy như $ fone_number trong mã của bạn. Tôi tìm thấy không có gì sai trong việc xử lý cả hai trường hợp khác nhau và IMHO nó khá đặc biệt so với PHP làm cho sự khác biệt rất ít.Chỉ cần nhìn vào SQL: một hàng có giá trị NULL không giống như một hàng không tồn tại. –

+1

Tất nhiên là có. Tuy nhiên, hãy cố gắng giải thích điều đó với PHP. Và thậm chí không khiến tôi bắt đầu không thể nắm bắt những sai lầm đơn giản như lỗi đánh máy (đọc biến không được đặt) hoặc chuyển số sai số tham số ... – aib

+0

Hiện tại, câu thứ hai được nhấn mạnh nhiều hơn. – aib

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