Không so với Sai so với 0 trong PHP


146

Tôi nói với các nhà phát triển tốt có thể nhận ra / sử dụng sự khác biệt giữa NullFalse0và tất cả các tốt "không có gì" các đơn vị khác.
Có gì sự khác biệt, đặc biệt trong PHP? Nó có cái gì để làm với ===?


Hầu như không thể thực sự tìm ra khi nào những gì được sử dụng. Tôi đoán điều quan trọng là bạn TIN TƯỞNG khi bạn sử dụng nullvà khi nào false. Tôi thích sử dụng nullkhi lấy một giá trị từ một phương pháp, bởi vì tôi có thể sử dụng issetđể xác định xem một giá trị được trả về thay vì sử dụng emptymà sẽ không có trong tài khoản: false, 0, '0'hoặc một chuỗi rỗng, mà có thể là giá trị hữu hiệu trong nhiều tình huống. Đối với tôi đó là giải pháp sạch nhất trong một công trình lộn xộn.
JMRC

Câu trả lời:


221

Đó là ngôn ngữ cụ thể, nhưng trong PHP:

Nullcó nghĩa là " không có gì ". Các var chưa được khởi tạo.

Falsecó nghĩa là " không đúng trong bối cảnh boolean ". Được sử dụng để hiển thị rõ ràng bạn đang xử lý các vấn đề hợp lý.

0là một int. Không có gì để làm với phần còn lại ở trên, được sử dụng cho toán học.

Bây giờ, điều khó khăn là, trong các ngôn ngữ động như PHP, tất cả chúng đều có giá trị trong ngữ cảnh boolean , mà (trong PHP) là False.

Nếu bạn kiểm tra nó ==, nó sẽ kiểm tra giá trị boolean, vì vậy bạn sẽ có được sự bằng nhau. Nếu bạn kiểm tra nó ===, nó sẽ kiểm tra loại và bạn sẽ nhận được sự bất bình đẳng.

Vậy tại sao chúng hữu ích?

Vâng, nhìn vào strrpos()chức năng. Nó trả về Sai nếu không tìm thấy gì, nhưng 0 nếu tìm thấy thứ gì đó ở đầu chuỗi!

<?php
// pitfall :
if (strrpos("Hello World", "Hello")) { 
    // never exectuted
}

// smart move :
if (strrpos("Hello World", "Hello") !== False) {
    // that works !
}
?>

Và tất nhiên, nếu bạn đối phó với các tiểu bang:

Bạn muốn tạo sự khác biệt giữa DebugMode = False(đặt thành tắt), DebugMode = True(đặt thành bật) và DebugMode = Null(hoàn toàn không được đặt, sẽ dẫn đến gỡ lỗi cứng ;-)).


39
Lưu ý về Null: PHP sử dụng nó là "không có giá trị" nhưng đây không phải là một thói quen tốt để tham gia. Nói chung, Null có nghĩa là "giá trị không xác định" khác với "không có giá trị" hoặc "biến chưa được khởi tạo". Không có gì cộng 1 là 1, trong khi giá trị không xác định cộng với một là giá trị không xác định. Chỉ cần nhớ rằng bất kỳ toán tử nào được áp dụng cho null sẽ (nên) đều dẫn đến null, bởi vì bất kỳ thao tác nào trên "giá trị không xác định" đều dẫn đến một giá trị không xác định.
Eli

7
Hãy nhớ rằng đây là tất cả các ý định . không có gì để làm với những gì xảy ra trong thực tế trong thực tế, một hàm có thể trả về false cho các giá trị không tồn tại (ví dụ: strpose, input_filter) và null cho thất bại (ví dụ input_filter). Vì vậy, câu trả lời là, sử dụng === false và / hoặc === null, sau khi đọc tài liệu chức năng cụ thể đó.
gcb

5
@Eli: bạn lấy ý tưởng từ đâu mà Null có nghĩa là "giá trị không xác định" nói chung. Tôi không thể nghĩ về bất kỳ ngôn ngữ máy tính nào mà điều này là đúng, cũng không có nghĩa là trong tiếng Anh, ít nhất là không theo bất kỳ định nghĩa nào tôi có thể tìm thấy hoặc đã nghe. Có lẽ bạn biết điều gì đó tôi không biết?
iconoclast

2
@iconoclast - Tôi đang lấy nó từ thế giới cơ sở dữ liệu. Theo tôi hiểu, null được sử dụng như một trình giữ chỗ cho một giá trị dữ liệu không tồn tại trong cơ sở dữ liệu hoặc không xác định. Xem dev.mysql.com/doc/refman/5.0/en/usiness-with-null.html hoặc en.wikipedia.org/wiki/Null_%28Query%29 .
Eli

2
Eli không sai. Anh ta nói rằng về mặt ngữ nghĩa, khi bạn sử dụng null, bạn báo hiệu cho các lập trình viên khác rằng bạn không biết những gì trong đó. Nó không được xác định. Trong khi bạn sử dụng 0, bạn báo hiệu rằng bạn biết những gì trong đó: một số. Và ở đây con số đại diện cho sự vắng mặt của sự vật. Hãy nhớ rằng cho dù PHP đe dọa các giá trị như thế nào, các giá trị mang một ý nghĩa, các giá trị là một dạng tài liệu.
e-satis

45

nullnull. falsefalse . Đáng buồn nhưng là sự thật.

Không có nhiều tính nhất quán trong PHP. Các nhà phát triển THỬ để tạo null có nghĩa là "không xác định" hoặc "không tồn tại". nhưng thường Sai sẽ đóng vai trò là 'không tồn tại' (ví dụ: strrpose ('fail', 'search') sẽ trả về false và không null

bạn sẽ thường thấy null được sử dụng khi họ đã sử dụng false cho một cái gì đó. ví dụ: bộ lọc_input (). Chúng trả về false nếu biến bị lỗi bộ lọc. và null nếu biến không tồn tại (không tồn tại có nghĩa là nó cũng bị lỗi bộ lọc? vậy tại sao thậm chí trả về null?!?)

php có sự tiện lợi của việc trả lại dữ liệu trong các hàm. và thay đổi các nhà phát triển nhồi nhét trong tất cả các loại trạng thái thất bại thay vì dữ liệu.

Và PHP không có cách nào lành mạnh để phát hiện dữ liệu (int, str, v.v.) từ thất bại (false, null)

bạn khá nhiều phải luôn luôn kiểm tra === null hoặc === false, tùy thuộc vào chức năng. hoặc cho cả hai, trong các trường hợp như bộ lọc_input () / filter_var ()

và đây là một số niềm vui với kiểu tung hứng. thậm chí không bao gồm mảng và đối tượng.

var_dump( 0<0 );        #bool(false)
var_dump( 1<0 );        #bool(false)
var_dump( -1<0 );       #bool(true)
var_dump( false<0 );    #bool(false)
var_dump( null<0 );     #bool(false)
var_dump( ''<0 );       #bool(false)
var_dump( 'a'<0 );      #bool(false)
echo "\n";
var_dump( !0 );        #bool(true)
var_dump( !1 );        #bool(false)
var_dump( !-1 );       #bool(false)
var_dump( !false );    #bool(true)
var_dump( !null );     #bool(true)
var_dump( !'' );       #bool(true)
var_dump( !'a' );      #bool(false)
echo "\n";
var_dump( false == 0 );        #bool(true)
var_dump( false == 1 );        #bool(false)
var_dump( false == -1 );       #bool(false)
var_dump( false == false );    #bool(true)
var_dump( false == null );     #bool(true)
var_dump( false == '' );       #bool(true)
var_dump( false == 'a' );      #bool(false)
echo "\n";
var_dump( null == 0 );        #bool(true)
var_dump( null == 1 );        #bool(false)
var_dump( null == -1 );       #bool(false)
var_dump( null == false );    #bool(true)
var_dump( null == null );     #bool(true)
var_dump( null == '' );       #bool(true)
var_dump( null == 'a' );      #bool(false)
echo "\n";
$a=0; var_dump( empty($a) );        #bool(true)
$a=1; var_dump( empty($a) );        #bool(false)
$a=-1; var_dump( empty($a) );       #bool(false)
$a=false; var_dump( empty($a) );    #bool(true)
$a=null; var_dump( empty($a) );     #bool(true)
$a=''; var_dump( empty($a) );       #bool(true)
$a='a'; var_dump( empty($a));      # bool(false)
echo "\n"; #new block suggested by @thehpi
var_dump( null < -1 ); #bool(true)
var_dump( null < 0 ); #bool(false)
var_dump( null < 1 ); #bool(true)
var_dump( -1 > true ); #bool(false)
var_dump( 0 > true ); #bool(false)
var_dump( 1 > true ); #bool(true)
var_dump( -1 > false ); #bool(true)
var_dump( 0 > false ); #bool(false)
var_dump( 1 > true ); #bool(true)

24
trong ý kiến ​​của tôi 0 == null là vô nghĩa tuyệt đối, vì 0 là một giá trị và null là một cờ hiển thị biến không được khởi tạo. Cảm ơn đội ngũ php
mercsen

1
Bạn hai lần lặp lại phần mã của bạn bắt đầu với var_dump( null == 0 );.
Sparky

2
Điều gì thực sự kỳ lạ trong php: null <-1 => TRUE
thehpi

1
@mercsen Ít nhất nếu PHP luôn hành xử như 0 == null thì tôi sẽ ổn với nó. Kì lạ, 0 == nullnull == [], nhưng [] != 0!!
nawfal

1
strrpos('fail', 'search') will return false, and not nulltheo ý kiến ​​của tôi là chính xác - nếu nullcó nghĩa là không biết thì việc strrpostrả về nullsẽ giống như câu nói 'Tôi không biết chuỗi có ở đó không' thay vì 'Chuỗi không có ở đó'.
Eborbob

22

Dưới đây là một ví dụ:

            Comparisons of $x with PHP functions

Expression          gettype()   empty()     is_null()   isset() boolean : if($x)
$x = "";            string      TRUE        FALSE       TRUE    FALSE
$x = null;          NULL        TRUE        TRUE        FALSE   FALSE
var $x;             NULL        TRUE        TRUE        FALSE   FALSE
$x is undefined     NULL        TRUE        TRUE        FALSE   FALSE
$x = array();       array       TRUE        FALSE       TRUE    FALSE
$x = false;         boolean     TRUE        FALSE       TRUE    FALSE
$x = true;          boolean     FALSE       FALSE       TRUE    TRUE
$x = 1;             integer     FALSE       FALSE       TRUE    TRUE
$x = 42;            integer     FALSE       FALSE       TRUE    TRUE
$x = 0;             integer     TRUE        FALSE       TRUE    FALSE
$x = -1;            integer     FALSE       FALSE       TRUE    TRUE
$x = "1";           string      FALSE       FALSE       TRUE    TRUE
$x = "0";           string      TRUE        FALSE       TRUE    FALSE
$x = "-1";          string      FALSE       FALSE       TRUE    TRUE
$x = "php";         string      FALSE       FALSE       TRUE    TRUE
$x = "true";        string      FALSE       FALSE       TRUE    TRUE
$x = "false";       string      FALSE       FALSE       TRUE    TRUE

Vui lòng xem phần này để tham khảo thêm các so sánh kiểu trong PHP. Nó sẽ cung cấp cho bạn một sự hiểu biết rõ ràng.


5

Trong PHP, bạn có thể sử dụng các toán tử === và! == để kiểm tra không chỉ các giá trị bằng nhau mà còn nếu các kiểu của chúng khớp với nhau. Vì vậy, ví dụ: 0 == falsetrue, nhưng 0 === falsefalse. Tương tự như vậy đối !=với !==. Ngoài ra trong trường hợp bạn so sánh nullvới hai người kia bằng cách sử dụng các toán tử được đề cập, mong đợi kết quả tương tự.

Bây giờ trong PHP chất lượng của các giá trị này thường được sử dụng khi trả về một giá trị đôi khi có thể là 0(không), nhưng đôi khi có thể là hàm bị lỗi. Trong các trường hợp như vậy trong PHP bạn quay lại falsevà bạn phải kiểm tra các trường hợp này bằng cách sử dụng toán tử nhận dạng ===. Ví dụ: nếu bạn đang tìm kiếm vị trí của một chuỗi bên trong chuỗi khác và bạn đang sử dụng strpos(), hàm này sẽ trả về vị trí số có thể là 0 nếu chuỗi được tìm thấy ngay từ đầu, nhưng nếu không tìm thấy chuỗi tại tất cả, sau đó strpos()sẽ trở lại falsevà bạn phải tính đến điều này khi xử lý kết quả.

Nếu bạn sẽ sử dụng cùng một kỹ thuật trong các hàm của mình, bất kỳ ai quen thuộc với thư viện PHP tiêu chuẩn sẽ hiểu điều gì đang xảy ra và làm thế nào để kiểm tra xem giá trị trả về có phải là điều mong muốn hay đã xảy ra lỗi trong khi xử lý. Điều tương tự cũng thực sự xảy ra đối với các tham số hàm, bạn có thể xử lý chúng khác nhau tùy thuộc vào việc chúng là mảng hay chuỗi hay không, và kỹ thuật này được sử dụng trong toàn bộ PHP, vì vậy mọi người sẽ dễ dàng nhận được nó. Vì vậy, tôi đoán đó là sức mạnh.


5

Sai, Không, Không có gì, 0, Không xác định , v.v., v.v.

Mỗi trong số này có ý nghĩa cụ thể tương quan với các khái niệm thực tế. Đôi khi nhiều nghĩa được quá tải vào một từ khóa hoặc giá trị.

Trong CC ++ , NULL, False0đang quá tải để cùng giá trị. Trong C # họ là 3 khái niệm riêng biệt.

nullhoặc NULLthường chỉ ra sự thiếu giá trị, nhưng thường không xác định lý do tại sao. 0chỉ ra số tự nhiên bằng 0 và có loại tương đương với 1, 2, 3, v.v. và trong các ngôn ngữ hỗ trợ các khái niệm riêng biệt NULLchỉ nên được xử lý một số.

Sai chỉ ra sự thật. Và nó được sử dụng trong các giá trị nhị phân . Nó không có nghĩa là không đặt, cũng không có nghĩa là0 . Nó chỉ đơn giản chỉ ra một trong hai giá trị nhị phân.

Không có gì có thể chỉ ra rằng giá trị được đặt cụ thể là không có gì biểu thị điều tương tự như null, nhưng với mục đích.

Không xác định trong một số ngôn ngữ cho biết giá trị vẫn chưa được đặt vì không có mã nào chỉ định giá trị thực.


Thú vị, có lẽ, nhưng không thảo luận về PHP.
Brad

4

Tôi vừa lãng phí 1/2 một ngày cố gắng để có được hoặc là một 0, null, falsetrở về từ strops!

Đây là tất cả những gì tôi đã cố gắng làm, trước khi tôi thấy rằng logic không đi đúng hướng, dường như có một lỗ đen trong mã hóa php:

Khái niệm lấy một tên miền được lưu trữ trên một máy chủ và đảm bảo rằng nó không phải là cấp gốc, OK một số cách khác nhau để làm điều này, nhưng tôi đã chọn khác nhau do các chức năng / cấu trúc php khác mà tôi đã thực hiện.

Dù sao ở đây là cơ sở của cosing:

if (strpos($_SERVER ['SERVER_NAME'], dirBaseNAME ()) 
{ 
    do this 
} else {
    or that
}

{
echo strpos(mydomain.co.uk, mydomain);  

if ( strpos(mydomain, xmas) == null ) 
    {
        echo "\n1 is null"; 
    }

if ( (strpos(mydomain.co.uk, mydomain)) == 0 ) 
    {
        echo "\n2 is 0"; 
    } else {
        echo "\n2 Something is WRONG"; 
    }

if ( (mydomain.co.uk, mydomain)) != 0 ) 
    {
        echo "\n3 is 0"; 
    } else {
        echo "\n3 it is not 0"; 
    }

if ( (mydomain.co.uk, mydomain)) == null ) 
    {
        echo "\n4 is null"; 
    } else {
        echo "\n4 Something is WRONG"; 
    }
}

Cuối cùng sau khi đọc chủ đề này, tôi thấy rằng điều này đã làm việc !!!

{
if ((mydomain.co.uk, mydomain)) !== false ) 
    {
        echo "\n5 is True"; 
    } else {
        echo "\n5 is False"; 
    }
}

Cảm ơn vì bài viết này, bây giờ tôi hiểu rằng mặc dù là Giáng sinh, nhưng nó có thể không phải là Giáng sinh false, vì nó cũng có thể là một NULLngày!

Sau khi lãng phí một ngày để gỡ lỗi một số mã đơn giản, tôi ước rằng tôi đã biết điều này trước đây, vì tôi sẽ có thể xác định được vấn đề, thay vì đi khắp nơi để cố gắng làm cho nó hoạt động. Nó không hoạt động, như False, NULL0không phải tất cả giống như True or False or NULL?


2

Từ tài liệu trực tuyến PHP :

Để chuyển đổi rõ ràng một giá trị thành boolean, hãy sử dụng các phôi (bool) hoặc (boolean).
Tuy nhiên, trong hầu hết các trường hợp, việc truyền là không cần thiết, vì một giá trị sẽ được tự động chuyển đổi nếu một toán tử, hàm hoặc cấu trúc điều khiển yêu cầu một đối số boolean.
Khi chuyển đổi sang boolean, các giá trị sau được coi là FALSE:

  • FALSEchính boolean
  • số nguyên `` 0 (không)
  • phao 0.0(không)
  • chuỗi rỗng và chuỗi "0"
  • một mảng có các phần tử bằng không
  • một đối tượng không có biến thành viên (chỉ PHP 4)
  • loại đặc biệt NULL(bao gồm các biến không đặt)
  • Các đối tượng SimpleXML được tạo từ các thẻ trống
    Mọi giá trị khác được xem xét TRUE(bao gồm mọi tài nguyên).

Vì vậy, trong hầu hết các trường hợp, nó đều giống nhau.

Mặt khác, =====không giống nhau. Thường xuyên, bạn chỉ cần toán tử "bằng". Làm rõ:

$a == $b    //Equal. TRUE if $a is equal to $b.
$a === $b   //Identical. TRUE if $a is equal to $b, and they are of the same type. 

Để biết thêm thông tin, hãy kiểm tra " Toán tử so sánh " trong tài liệu trực tuyến PHP.

Hi vọng điêu nay co ich.


1

Sự khác biệt giữa các giá trị này luôn đi đến các quy tắc cụ thể về ngôn ngữ. Những gì bạn học được cho PHP không nhất thiết đúng với Python, hoặc Perl hoặc C, v.v. Mặc dù việc học các quy tắc cho ngôn ngữ mà bạn đang làm việc là rất có giá trị, việc dựa vào chúng quá nhiều là yêu cầu rắc rối . Rắc rối xảy ra khi lập trình viên tiếp theo cần duy trì mã của bạn và bạn đã sử dụng một số cấu trúc để tận dụng một số chi tiết nhỏ của Null so với Sai (ví dụ). Mã của bạn sẽ trông chính xác (và ngược lại, mã sai sẽ nhìn sai ).


1

Null được sử dụng trong cơ sở dữ liệu để thể hiện "không có hồ sơ" hoặc "không có thông tin". Vì vậy, bạn có thể có một trường bit mô tả "người dùng này có muốn gửi email cho chúng tôi không", trong đó True có nghĩa là họ làm, Sai có nghĩa là họ không muốn được gửi bất cứ điều gì, nhưng Null có nghĩa là bạn không ' t biết Họ có thể đến thông qua các liên kết bên ngoài và như vậy.

Hàm ý logic của Null thường khác nhau - trong một số ngôn ngữ, NULL không bằng bất cứ thứ gì, vì vậy, nếu (a == NULL) sẽ luôn sai.

Vì vậy, cá nhân tôi luôn luôn khởi tạo một boolean thành FALSE và việc khởi tạo một cái thành NULL sẽ trông hơi kỳ cục (ngay cả trong C trong đó cả hai chỉ là 0 ... chỉ là một kiểu cách).


1

Tôi nghĩ rằng các nhà phát triển xấu tìm thấy tất cả các cách sử dụng khác nhau của null / 0 / false trong mã đó.

Ví dụ, một trong những lỗi phổ biến nhất mà các nhà phát triển mắc phải là trả về mã lỗi dưới dạng dữ liệu có hàm.

// On error GetChar returns -1
int GetChar()

Đây là một ví dụ về giao diện đường. Điều này được tách ra trong cuốn sách "Gỡ lỗi công cụ phát triển phần mềm" và trong một cuốn sách khác "viết mã chính xác".

Vấn đề với điều này, là hàm ý hoặc giả định được thực hiện trên loại char. Trên một số trình biên dịch, kiểu char có thể không được ký. Vì vậy, mặc dù bạn trả về -1, trình biên dịch có thể trả về 1 thay vào đó. Những giả định trình biên dịch trong C ++ hoặc C rất khó phát hiện.

Thay vào đó, cách tốt nhất là không trộn mã lỗi với dữ liệu của bạn. Vậy hàm sau.

char GetChar()

bây giờ trở thành

// On success return 1
// on failure return 0
bool GetChar(int &char)

Điều này có nghĩa là cho dù nhà phát triển trẻ tuổi trong cửa hàng phát triển của bạn như thế nào, anh ấy hoặc cô ấy sẽ không bao giờ mắc phải lỗi này. Mặc dù điều này không nói về sự chuyển hướng hoặc sự phụ thuộc trong mã.

Vì vậy, nói chung, hoán đổi bool là loại lớp đầu tiên trong ngôn ngữ là ổn và tôi nghĩ joel đã nói về nó với postcast gần đây của mình. Nhưng cố gắng không sử dụng hỗn hợp và kết hợp các dữ liệu với dữ liệu của bạn trong thói quen của bạn và bạn sẽ hoàn toàn ổn.


1

Trong PHP, nó phụ thuộc vào việc bạn đang xác nhận các loại:

( 
 ( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
 ( false !== null ) && ( false == null ) 
)

Về mặt kỹ thuật là null 0x00nhưng trong PHP ( null == 0x00 ) && ( null !== 0x00 ).

0 là một giá trị nguyên.


1

Một sự thật thú vị về NULLPHP: Nếu bạn đặt một var bằng NULL, thì nó giống như khi bạn gọi unset()nó.

NULLvề cơ bản có nghĩa là một biến không có giá trị được gán cho nó; falselà một giá trị Boolean hợp lệ, 0là một giá trị số nguyên hợp lệ, và PHP có một số chuyển đổi khá xấu xí giữa 0, "0", "", và false.


0

Null không là gì, Sai là một bit và 0 là (có thể) 32 bit.

Không phải là một chuyên gia PHP, nhưng trong một số ngôn ngữ hiện đại hơn không thể thay thế cho nhau. Tôi có thể bỏ lỡ 0 và sai có thể hoán đổi cho nhau, nhưng với boolean là một loại thực tế, bạn có thể có các phương thức và đối tượng liên quan đến nó để đó chỉ là một sự đánh đổi. Null là null mặc dù, sự vắng mặt của bất cứ điều gì về cơ bản.


0

Chà, tôi không thể nhớ đủ từ những ngày PHP của mình để trả lời phần "===", nhưng đối với hầu hết các ngôn ngữ kiểu C, NULL nên được sử dụng trong ngữ cảnh của các giá trị con trỏ, sai là boolean và 0 là a giá trị số như int. '\ 0' là giá trị tùy chỉnh cho bối cảnh ký tự. Tôi cũng thường thích sử dụng 0,0 cho phao và đôi.

Vì vậy, câu trả lời nhanh chóng là: bối cảnh.


0

Trong hầu hết tất cả các ngôn ngữ hiện đại, null đều đề cập một cách hợp lý các con trỏ (hoặc tham chiếu) không có giá trị hoặc một biến không được khởi tạo. 0 là giá trị nguyên của 0 và false là giá trị boolean của, well, false. Để làm cho mọi thứ trở nên phức tạp, ví dụ, trong C, null, 0 và false đều được biểu diễn theo cùng một cách chính xác. Tôi không biết làm thế nào nó hoạt động trong PHP.

Sau đó, để làm phức tạp hơn, cơ sở dữ liệu có khái niệm null, có nghĩa là thiếu hoặc không áp dụng được và hầu hết các ngôn ngữ không có cách trực tiếp để ánh xạ DBNull thành null. Cho đến gần đây, chẳng hạn, không có sự phân biệt giữa int là null và zero, nhưng điều đó đã được thay đổi với ints nullable.

Xin lỗi để làm cho âm thanh này phức tạp. Chỉ là điều này đã trở thành một điểm nhấn bừa bãi trong các ngôn ngữ trong nhiều năm và cho đến gần đây, nó không có bất kỳ giải pháp rõ ràng nào ở bất cứ đâu. Mọi người thường chỉ kết hợp mọi thứ lại với nhau hoặc để trống hoặc 0 đại diện cho null trong cơ sở dữ liệu, điều này không phải lúc nào cũng hoạt động tốt.


0

Sai và 0 giống nhau về mặt khái niệm, tức là chúng là đẳng cấu. 0 là giá trị ban đầu cho đại số của các số tự nhiên và Sai là giá trị ban đầu cho đại số Boolean.

Nói cách khác, 0 có thể được định nghĩa là số mà khi thêm vào một số tự nhiên sẽ sinh ra cùng một số:

x + 0 = x

Tương tự, Sai là một giá trị sao cho sự phân biệt của nó và bất kỳ giá trị nào khác có cùng giá trị:

x || False = x

Null về mặt khái niệm là một cái gì đó hoàn toàn khác nhau. Tùy thuộc vào ngôn ngữ, có các ngữ nghĩa khác nhau cho ngôn ngữ đó, nhưng không có ngôn ngữ nào mô tả "giá trị ban đầu" là Sai và 0. Không có đại số cho Null. Nó liên quan đến các biến, thường để biểu thị rằng biến không có giá trị cụ thể trong bối cảnh hiện tại. Trong hầu hết các ngôn ngữ, không có thao tác nào được xác định trên Null và đó là lỗi khi sử dụng Null làm toán hạng. Trong một số ngôn ngữ, có một giá trị đặc biệt gọi là "dưới cùng" thay vì "null", đó là một giữ chỗ cho giá trị của một tính toán không chấm dứt.

Tôi đã viết nhiều hơn về ý nghĩa của NULL ở nơi khác.


1
offtopic, false == 0 bị chậm hoàn toàn. Thậm chí nhiều hơn với php trả lại dữ liệu HOẶC thất bại trong một chức năng. xem lợi nhuận cho mysql_insert_id. "" "ID được tạo cho cột AUTO_INCREMENT theo truy vấn trước đó thành công, 0 nếu truy vấn trước đó không tạo ra giá trị AUTO_INCREMENT hoặc FALSE nếu không có kết nối MySQL nào được thiết lập." "" Về cơ bản, nó có thể trả về A) id, B) zero, C) false ... bây giờ nếu đó là mục đầu tiên trong bảng, id sẽ bằng 0! vì vậy cả ba giá trị đều giống nhau! Làm thế nào nhà phát triển có thể hiểu ý nghĩa của ba loại số không? ... và tôi đồng ý với bài viết của bạn trên null.
gcb

0

Ai đó có thể giải thích cho tôi tại sao 'NULL' không chỉ là một chuỗi trong một ví dụ so sánh?

$x = 0;
var_dump($x == 'NULL');  # TRUE   !!!WTF!!!

1
Bởi vì nội bộ PHP chuyển sang kiểu số nguyên và so sánh sau đó. php > var_dump((int) "NULL"); // => int(0) php > var_dump((int) "BLA"); // => int(0)xem php.net/manual/en/lingu.operators.comparison.php Dịch chuỗi và tài nguyên sang số, toán học thông thường
Sevyls

-1

Các vấn đề với sự giả dối xuất phát từ lịch sử PHP. Vấn đề nhắm vào loại vô hướng được xác định rõ.

'*' == true -> true (string match)
'*' === true -> false (numberic match)

(int)'*' == true -> false
(string)'*' == true -> true

Sự nghiêm ngặt của PHP7 là một bước tiến, nhưng có lẽ chưa đủ. https://web-techno.net/typing-with-php-7-what-you-shouldnt-do/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.