2009-03-09 64 views
25

Tôi đã sử dụng để thiết lập những thứ như thế này khi tôi muốn các giá trị trống.Trong PHP, sự khác biệt giữa NULL và thiết lập một chuỗi là bằng 2 dấu nháy đơn là

$blankVar = ''; 

Sau một vài tháng, tôi quyết định điều này trông đẹp hơn và có mục đích rõ ràng hơn.

$blankVar = null; 

Điều này làm việc mà không bị trục trặc trong một thời gian, nhưng gần đây với báo cáo chuẩn bị PDO tôi gặp sự cố. Ràng buộc một giá trị bằng null làm cho truy vấn thất bại, trong khi ràng buộc nó với '' thì không. Tôi cần phải liên kết nó với null, để nếu một điều kiện được đáp ứng, nó sẽ chèn dữ liệu trống.

Sự khác nhau giữa 2 là gì? Tôi vẫn nghĩ rằng bằng null (hoặc ít nhất là một hằng số) có vẻ tốt hơn, vì vậy tôi nên làm điều này?

define('EMPTY', ''); 

Trả lời

41

Null chỉ là một kiểu dữ liệu khác trong PHP, chỉ có một giá trị (null). Vì PHP là một ngôn ngữ được nhập sai, nó có thể gây nhầm lẫn cách nó xử lý các giá trị khác nhau.

"", 0, "0", False, array(), Null đều được coi là sai trong PHP.

Null, tuy nhiên, là một loại động vật khác. chính không tương thích với việc sử dụng Null là bạn không thể biết liệu nó có isset() hay không.

$x = false; 
isset($x) -> true 
echo $x -> "" 

$y = null; 
isset($y) -> false 
echo $y -> "" 

//$z is not set 
isset($z) -> false 
echo $z -> E_NOTICE 

Vì vậy, vô nghĩa theo nghĩa là nó không tuân theo quy tắc biến bình thường trong PHP (ít nhất một số). Trong hầu hết các trường hợp, nó là tốt.

Khi nói đến cột cơ sở dữ liệu, NULL của NULL không có chỗ ở đó. Bạn thấy, SQL là một ngôn ngữ dựa trên chuỗi. NULL của SQL phải được đại diện bởi NULL không có dấu ngoặc kép.

Vì vậy, nếu bạn muốn một lĩnh vực EMPTY, đặt nó là ""

INSERT INTO foo SET bar = "" 

Nhưng nếu bạn muốn có một lĩnh vực NULL, thiết lập nó để NULL

INSERT INTO foo SET bar = NULL 

BIG KHÁC BIỆT. Tuy nhiên, nếu bạn cố gắng chèn trực tiếp PHP NULL, nó sẽ thêm các ký tự 0 vào truy vấn, (để lại cho bạn một lỗi trống hoặc cú pháp, tùy thuộc vào bạn đã trích dẫn nó) hay chưa.

+2

Cảm ơn bạn đã bao gồm phần của bạn trên SQL. – alex

19

rỗng là một giá trị giữ chỗ đặc biệt trong ngôn ngữ lập trình mà theo nghĩa đen có nghĩa là "không có gì". Nó không phải 0, nó không phải là một chuỗi rỗng, nó không có gì. Không có giá trị trong bộ nhớ được trỏ đến. Mặt khác, một chuỗi rỗng vẫn là một đối tượng chuỗi, chỉ là một đối tượng rất ngắn :)

+1

Cảm ơn Rex, đây là câu trả lời rõ ràng nhất (với tôi). – alex

+0

Nếu đó là câu trả lời rõ ràng nhất, và tôi đồng ý, tại sao bạn không chấp nhận nó? –

+0

@Chris: Vì người mà tôi chấp nhận đã cung cấp thêm thông tin cho tôi .. Tôi đã bỏ phiếu này. – alex

2

Vâng, đó là một cách tốt đẹp mỗi cách tiếp cận, nhưng sự khác biệt chính là một là một chuỗi rỗng và khác là một biến chưa được khởi tạo (null)

2

Bên cạnh sự khác biệt đã nêu bởi Rex, có hai loại so sánh trong PHP, lỏng lẻo và nghiêm ngặt:

http://www.php.net/manual/en/types.comparisons.php

Nếu so sánh nghiêm ngặt hoặc các chức năng như is_null() được sử dụng trong bất kỳ khả năng nào, bạn sẽ nhận được các kết quả khác nhau. Tuy nhiên, với những so sánh lỏng lẻo, PHP khá dễ chịu.

Tôi không biết chắc chắn, nhưng bạn có thể sử dụng cách tiếp cận rỗng của bạn, sau đó chỉ cần gõ khi bạn đang sử dụng biến trong ngữ cảnh mà bạn gặp sự cố (ví dụ: pass (string) $ blankVar). Nếu nó hoạt động, nó có thể có nghĩa là ít thay đổi hơn là cần thiết cho mã của bạn.

+0

Điều này có vẻ hữu ích, vì vậy nếu tôi tiếp tục đặt mọi thứ thành rỗng, và nếu tôi có trục trặc, chỉ đơn giản là $ var = (string) $ myPossiblyNullString; ? – alex

+0

PHP bị nhập sai, vì vậy những thứ đó thường hoạt động, nhưng tôi chưa tự thử nó. –

1

'null' là điều duy nhất mà các biến chưa được khởi tạo tham chiếu đến. Bạn có thể đặt một biến để tham chiếu đến null. Ngoài ra còn có trạng thái 'unset' có nghĩa là biến không tồn tại chút nào. Bạn có thể kiểm tra thông qua số isset() function. Thường được sử dụng để kiểm tra nếu một phần tử của mảng tồn tại và, ví dụ, một cách để xem nếu $ _GET ['op'] đã nhận được một param chuỗi truy vấn. Bạn cũng có thể làm cho biến không được đặt (loại bỏ phần tử của mảng) qua unset() function. Ngoài ra còn có một số function empty() sẽ kiểm tra xem biến là NULL, FALSE, 0 hoặc một chuỗi rỗng

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