Null vs. False vs. 0 ใน PHP


146

ฉันได้รับการบอกว่าผู้พัฒนาที่ดีสามารถมองเห็น / ใช้ประโยชน์จากความแตกต่างระหว่างNullและFalseและ0กับหน่วยงาน "ไม่มีอะไร" ที่ดีอื่น ๆ ได้ทั้งหมด
อะไรคือความแตกต่างโดยเฉพาะใน PHP? มันมีบางอย่างเกี่ยวข้องกับ===?


แทบจะเป็นไปไม่ได้เลยที่จะคิดออกว่าอะไรจะใช้จริง ฉันเดาว่าสิ่งสำคัญคือคุณต้องมีความสอดคล้องเมื่อคุณใช้nullและเมื่อfalseใด ผมชอบใช้nullเมื่อดึงค่าจากวิธีการเพราะผมสามารถใช้issetเพื่อตรวจสอบว่าค่าจะถูกส่งกลับแทนการใช้emptyซึ่งจะไม่ใช้เวลาในบัญชี: false, 0, '0'หรือสตริงที่ว่างเปล่าซึ่งสามารถเป็นค่าที่ทำงานได้ในหลาย ๆ สถานการณ์ สำหรับฉันมันเป็นทางออกที่สะอาดที่สุดในโครงสร้างที่ยุ่งเหยิง
JMRC

คำตอบ:


221

เป็นภาษาเฉพาะ แต่ใน PHP:

Nullแปลว่า " ไม่มีอะไร " var ยังไม่ได้เริ่มต้น

Falseหมายถึง " ไม่จริงในบริบทบูลีน " ใช้เพื่อแสดงอย่างชัดเจนว่าคุณกำลังเผชิญกับปัญหาเชิงตรรกะ

0intเป็น ไม่มีส่วนเกี่ยวข้องกับส่วนที่เหลือข้างต้นใช้สำหรับวิชาคณิตศาสตร์

ตอนนี้สิ่งที่เป็นเรื่องยุ่งยากก็ว่าในภาษาแบบไดนามิกเช่น PHP, ทั้งหมดของพวกเขามีค่าในบริบทแบบบูลซึ่ง (ใน PHP) Falseเป็น

หากคุณทดสอบด้วย==ก็ทดสอบค่าบูลีนเพื่อให้คุณจะได้รับความเท่าเทียมกัน หากคุณทดสอบด้วย===มันจะทดสอบประเภทและคุณจะได้รับความไม่เท่าเทียมกัน

แล้วทำไมพวกเขาถึงมีประโยชน์

ดูที่strrpos()ฟังก์ชั่น มันจะส่งกลับเท็จถ้ามันไม่พบอะไร แต่เป็น 0 ถ้ามันได้พบบางอย่างที่จุดเริ่มต้นของสตริง!

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

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

และแน่นอนถ้าคุณจัดการกับรัฐ:

คุณต้องการสร้างความแตกต่างระหว่างDebugMode = False(ตั้งค่าเป็นปิด), DebugMode = True(ตั้งค่าเป็นเปิด) และDebugMode = Null(ไม่ได้ตั้งค่าเลยจะนำไปสู่การดีบักอย่างหนัก ;-))


39
หมายเหตุเกี่ยวกับ Null: PHP ใช้เป็น "ไม่มีค่า" แต่นี่ไม่ใช่นิสัยที่ดีในการเข้าใช้ โดยทั่วไป Null หมายถึง "ค่าที่ไม่รู้จัก" ซึ่งแตกต่างจาก "ไม่มีค่า" หรือ "ตัวแปรเริ่มต้น" ไม่มีอะไรบวก 1 คือ 1 ในขณะที่ค่าที่ไม่รู้จักบวกหนึ่งเป็นค่าที่ไม่รู้จัก เพียงจำไว้ว่าตัวดำเนินการใด ๆ ที่ใช้กับ null จะ (ควร) ส่งผลให้เป็นโมฆะเนื่องจากการดำเนินการใด ๆ กับ "ค่าที่ไม่รู้จัก" ส่งผลให้เกิดค่าที่ไม่รู้จัก
อีไล

7
เก็บไว้ในใจว่านี่เป็นสิ่งที่ความตั้งใจ ไม่มีอะไรเกี่ยวข้องกับสิ่งที่เกิดขึ้นในความเป็นจริง ในความเป็นจริงฟังก์ชั่นสามารถกลับเท็จสำหรับค่าที่ไม่มีอยู่ (เช่น strpos, input_filter) และ null สำหรับความล้มเหลว (เช่น input_filter) ดังนั้นคำตอบคือให้ใช้ === false และ / หรือ === null หลังจากอ่านเอกสารเกี่ยวกับฟังก์ชันนั้น ๆ
gcb

5
@Eli: คุณจะได้รับแนวคิดว่า Null หมายถึง "ค่าที่ไม่รู้จัก" โดยทั่วไป ฉันไม่สามารถนึกถึงภาษาคอมพิวเตอร์ใด ๆ ที่สิ่งนี้เป็นจริงและไม่ได้หมายความว่าในภาษาอังกฤษอย่างน้อยก็ไม่เป็นไปตามคำจำกัดความที่ฉันพบหรือได้ยิน บางทีคุณอาจรู้บางสิ่งที่ฉันไม่รู้
iconoclast

2
@iconoclast - ฉันเอามันจากโลกของฐานข้อมูล ตามที่ฉันเข้าใจแล้วจะใช้ null เป็นตัวยึดตำแหน่งสำหรับค่าข้อมูลที่ไม่มีอยู่ในฐานข้อมูลหรือไม่เป็นที่รู้จัก ดูdev.mysql.com/doc/refman/5.0/en/working-with-null.htmlหรือen.wikipedia.org/wiki/Null_%28SQL%29
อีไล

2
อีไลไม่ผิด เขาระบุว่ามีความหมายเมื่อคุณใช้ null คุณส่งสัญญาณโปรแกรมเมอร์อื่นที่คุณไม่รู้ว่ามีอะไรอยู่ในนั้น มันไม่ได้กำหนด ขณะที่คุณใช้ 0 คุณจะส่งสัญญาณว่าคุณรู้ว่ามีอะไรอยู่ในนั้น: ตัวเลข และที่นี่ตัวเลขแสดงถึงการขาดสิ่งต่าง ๆ โปรดจำไว้ว่าไม่ว่าค่าการคุกคามของ PHP จะเป็นอย่างไรค่าจะมีความหมายและค่านั้นเป็นรูปแบบของเอกสาร
e-Satisfaction

45

nullnullเป็น เป็นfalse falseเศร้า แต่จริง

PHP มีความสอดคล้องไม่มาก นักพัฒนาพยายามที่จะทำให้เป็นโมฆะหมายถึง "ไม่รู้จัก" หรือ "ไม่มีอยู่จริง" แต่บ่อยครั้งที่เท็จจะทำหน้าที่เป็น 'ไม่มีอยู่จริง' (เช่น strrpos ('ล้มเหลว', 'ค้นหา') จะกลับมาเป็นเท็จและไม่เป็นโมฆะ)

คุณมักจะเห็นว่ามีการใช้งานว่างเมื่อพวกเขาใช้เท็จสำหรับบางสิ่งอยู่แล้ว เช่น filter_input () พวกเขากลับเท็จถ้าตัวแปรล้มเหลวในการกรอง และ null ถ้าตัวแปรไม่มีอยู่ (ไม่มีอยู่หมายความว่ามันไม่สามารถกรองได้ดังนั้นทำไมถึงส่งคืน null?!?)

PHP มีความสะดวกในการส่งคืนข้อมูลในฟังก์ชั่น และ ofter นักพัฒนายัดเยียดในสถานะความล้มเหลวทุกชนิดแทนข้อมูล

และไม่มีวิธีที่มีเหตุผลใน PHP ในการตรวจสอบข้อมูล (int, str, ฯลฯ ) จากความล้มเหลว (false, null)

คุณสวยมากต้องทดสอบ === null หรือ === false เสมอขึ้นอยู่กับฟังก์ชัน หรือสำหรับทั้งสองกรณีเช่น filter_input () / filter_var ()

และนี่คือความสนุกกับการเล่นปาหี่ประเภท ไม่รวมถึงอาร์เรย์และวัตถุ

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
ใน opionion ของฉัน 0 == null เป็นเรื่องไร้สาระสัมบูรณ์เนื่องจาก 0 เป็นค่าและ null เป็นแฟล็กที่แสดงตัวแปรนั้นไม่ได้กำหนดค่าเริ่มต้น ขอบคุณทีม php
mercsen

1
var_dump( null == 0 );คุณสองครั้งซ้ำแล้วซ้ำอีกส่วนที่คุณจะเริ่มต้นด้วยรหัส
ปา

2
สิ่งที่แปลกจริงๆใน php: null <-1 => TRUE
thehpi

1
@mercsen อย่างน้อยถ้า PHP มีพฤติกรรมอย่างต่อเนื่องเช่น 0 == null ฉันก็คงจะโอเคกับมัน แปลก0 == nullและnull == []แต่[] != 0!!
nawfal

1
strrpos('fail', 'search') will return false, and not nullในความคิดของฉันถูกต้อง - ถ้าnullหมายถึงไม่ทราบดังนั้นการstrrposส่งคืนnullจะเป็นเช่นนั้นโดยบอกว่า 'ฉันไม่รู้ว่าสตริงนั้นมีอยู่' แทนที่จะเป็น 'สตริงไม่มีหรือไม่'
Eborbob

22

ด้านล่างเป็นตัวอย่าง:

            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

โปรดดูสิ่งนี้สำหรับการอ้างอิงเพิ่มเติมของการเปรียบเทียบประเภทใน PHP ควรให้ความเข้าใจที่ชัดเจน


5

ใน PHP คุณสามารถใช้ตัวดำเนินการ === และ! == เพื่อตรวจสอบว่าค่าเท่ากันหรือไม่ ดังนั้นสำหรับตัวอย่างเช่น0 == falseเป็นtrueแต่เป็น0 === false falseเดียวกันจะไปสำหรับเมื่อเทียบกับ!= !==ในกรณีที่คุณเปรียบเทียบnullกับอีกสองรายการโดยใช้โอเปอเรเตอร์ที่กล่าวถึงให้คาดหวังผลลัพธ์ที่คล้ายกัน

ตอนนี้ใน PHP คุณภาพของค่านี้มักจะถูกใช้เมื่อคืนค่าซึ่งบางครั้งอาจเป็น0(ศูนย์) แต่บางครั้งมันอาจเป็นไปได้ว่าฟังก์ชั่นล้มเหลว ในกรณีดังกล่าวใน PHP คุณกลับและคุณจะต้องตรวจสอบกรณีเหล่านี้ใช้ประกอบตัวตนfalse ===ตัวอย่างเช่นหากคุณกำลังค้นหาตำแหน่งของสตริงหนึ่งในอีกสตริงหนึ่งและคุณกำลังใช้strpos()ฟังก์ชันนี้จะส่งคืนตำแหน่งตัวเลขซึ่งอาจเป็น 0 หากพบสตริงที่จุดเริ่มต้น แต่ถ้าไม่พบสตริงที่ ทั้งหมดแล้วstrpos()จะกลับมาfalseและคุณต้องคำนึงถึงเรื่องนี้เมื่อจัดการกับผลลัพธ์

หากคุณจะใช้เทคนิคเดียวกันในฟังก์ชั่นของคุณใครก็ตามที่คุ้นเคยกับไลบรารี PHP มาตรฐานจะเข้าใจสิ่งที่เกิดขึ้นและวิธีการตรวจสอบว่าค่าที่ส่งคืนเป็นสิ่งที่ต้องการหรือทำผิดพลาดบางอย่างในขณะที่ทำการประมวลผลหรือไม่ เช่นเดียวกันกับฟังก์ชัน params คุณสามารถประมวลผลได้แตกต่างกันไปขึ้นอยู่กับว่าเป็นอาร์เรย์หรือสตริงหรือไม่และเทคนิคนี้ใช้ใน PHP อย่างมากเช่นกันดังนั้นทุกคนจะได้รับมันอย่างง่ายดาย ดังนั้นฉันเดาว่านั่นคือพลัง


5

เท็จ, ไม่มีค่า, ไม่มีอะไร, 0, ไม่ได้กำหนดฯลฯ ฯลฯ

แต่ละเหล่านี้มีความหมายเฉพาะที่สัมพันธ์กับแนวคิดจริง บางครั้งมีความหมายหลายอย่างมากเกินไปในคำหลักหรือค่าเดียว

ในCและC ++ , NULL, Falseและ0มีมากเกินไปจะมีค่าเท่ากัน ในC #พวกเขา 3 แนวคิดที่แตกต่าง

nullหรือNULLมักจะระบุถึงการขาดค่า แต่มักจะไม่ระบุสาเหตุ 0บ่งชี้จำนวนศูนย์เป็นธรรมชาติและมีการเทียบเท่าประเภทถึง1, 2, 3,ฯลฯ และในภาษาที่สนับสนุนแนวคิดที่แยกต่างหากของNULLควรได้รับการปฏิบัติเพียงตัวเลข

เท็จบ่งชี้ว่าไม่ใช่ความจริง และมันก็ใช้ในค่าไบนารี 0มันไม่ได้หมายความว่าไม่มีการตั้งค่าหรือไม่ก็หมายความว่า มันบ่งบอกถึงหนึ่งในสองค่าไบนารี

ไม่มีสิ่งใดที่สามารถบ่งบอกได้ว่าค่านั้นถูกตั้งค่าเป็นอะไรโดยเฉพาะซึ่งบ่งบอกถึงสิ่งเดียวกันกับที่เป็นโมฆะ แต่ด้วยความตั้งใจ

ไม่ได้กำหนดในบางภาษาแสดงว่ายังไม่ได้ตั้งค่าเนื่องจากไม่มีรหัสที่ระบุค่าจริง


บางทีอาจเป็นเรื่องที่น่าสนใจ แต่ไม่ได้พูดถึง PHP เลย
แบรด

4

ฉันได้สูญเสียไปเพียงแค่ 1/2 วันพยายามที่จะได้รับอย่างใดอย่างหนึ่ง0, null, falseจะกลับมาจากstrops!

นี่คือทั้งหมดที่ฉันพยายามทำก่อนที่ฉันจะพบว่าตรรกะไม่ไหลไปในทิศทางที่ถูกต้องดูเหมือนว่ามี blackhole ในการเขียนโค้ด php:

แนวคิดใช้ชื่อโดเมนที่โฮสต์บนเซิร์ฟเวอร์และตรวจสอบให้แน่ใจว่าไม่ใช่ระดับรูทตกลงวิธีต่าง ๆ ในการทำเช่นนี้ แต่ฉันเลือกที่แตกต่างกันเนื่องจากฟังก์ชัน / โครงสร้าง php อื่น ๆ ที่ฉันทำ

อย่างไรก็ตามนี่คือพื้นฐานของ 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"; 
    }
}

ในที่สุดหลังจากอ่านหัวข้อนี้ฉันพบว่ามันใช้งานได้ !!!

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

ขอขอบคุณสำหรับบทความนี้ฉันเข้าใจแล้วว่าถึงแม้จะเป็นคริสมาสต์ แต่ก็อาจไม่ใช่คริสมาสต์เหมือนfalseกันเพราะมันอาจเป็นNULLวันได้!

หลังจากเสียวันในการดีบักโค้ดง่าย ๆ บางอย่างฉันหวังว่าฉันจะรู้เรื่องนี้มาก่อนเพราะฉันจะสามารถระบุปัญหาได้แทนที่จะไปทั่วสถานที่ที่พยายามให้มันทำงาน มันไม่ได้ทำงานเป็นFalse, NULLและ0ไม่ได้ทั้งหมดเช่นเดียวกับTrue or False or NULL?


2

จากเอกสารออนไลน์ PHP :

ในการแปลงค่าเป็นบูลีนอย่างชัดแจ้งให้ใช้คำสั่ง (bool) หรือ (บูลีน)
อย่างไรก็ตามในกรณีส่วนใหญ่การโยนนั้นไม่จำเป็นเนื่องจากค่าจะถูกแปลงโดยอัตโนมัติหากผู้ประกอบการฟังก์ชันหรือโครงสร้างการควบคุมต้องมีอาร์กิวเมนต์บูลีน
เมื่อแปลงเป็นบูลีนค่าต่อไปนี้จะถือว่าเป็น FALSE:

  • บูลีนFALSEตัวเอง
  • จำนวนเต็ม `` 0 (ศูนย์)
  • ลอย0.0(ศูนย์)
  • สตริงว่างและสตริง "0"
  • อาร์เรย์ที่มีองค์ประกอบศูนย์
  • วัตถุที่มีตัวแปรสมาชิกเป็นศูนย์ (PHP 4 เท่านั้น)
  • ชนิดพิเศษNULL(รวมถึงตัวแปรที่ไม่ได้ตั้งค่า)
  • วัตถุ SimpleXML ที่สร้างจากแท็กเปล่า
    ค่าอื่น ๆ จะถูกพิจารณาTRUE(รวมถึงทรัพยากรใด ๆ )

ดังนั้นในกรณีส่วนใหญ่มันเหมือนกัน

ในทางกลับกัน===และสิ่ง==ที่ไม่เหมือนกัน เป็นประจำคุณเพียงแค่ต้องการตัวดำเนินการ "เท่ากับ" เพื่อชี้แจง:

$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. 

สำหรับข้อมูลเพิ่มเติมตรวจสอบหน้า " ผู้ดำเนินการเปรียบเทียบ " ในเอกสารออนไลน์ของ PHP

หวังว่านี่จะช่วยได้


1

ความแตกต่างระหว่างค่าเหล่านี้มักจะลงไปที่กฎเฉพาะภาษาโดยละเอียด สิ่งที่คุณเรียนรู้สำหรับ PHP นั้นไม่จำเป็นต้องเป็นจริงสำหรับ Python หรือ Perl หรือ C เป็นต้นในขณะที่มันมีประโยชน์ในการเรียนรู้กฎสำหรับภาษาที่คุณกำลังทำงานด้วยการพึ่งพาพวกเขามากเกินไปคือการถามปัญหา . ปัญหาเกิดขึ้นเมื่อโปรแกรมเมอร์รายต่อไปต้องการรักษารหัสของคุณและคุณได้ใช้โครงสร้างบางส่วนที่ใช้ประโยชน์จากรายละเอียดเล็กน้อยของ Null vs. False (ตัวอย่าง) รหัสของคุณควรดูถูกต้อง (และในทางกลับกันรหัสผิดควรดูผิด )


1

Null ใช้ในฐานข้อมูลเพื่อแสดง "ไม่มีการบันทึก" หรือ "ไม่มีข้อมูล" ดังนั้นคุณอาจมีฟิลด์บิตที่อธิบายว่า "ผู้ใช้รายนี้ต้องการส่งอีเมลถึงเราหรือไม่" โดยที่ True หมายถึงพวกเขาทำผิด False หมายถึงพวกเขาไม่ต้องการส่งอะไร แต่ Null จะหมายความว่าคุณไม่ได้รับ ' ไม่รู้ พวกเขาสามารถผ่านเข้าร่วมภายนอกและเช่น

ความหมายเชิงตรรกะของ Null มักแตกต่างกัน - ในบางภาษา NULL ไม่เท่ากับอะไรเลยดังนั้นหาก (a == NULL) จะเป็นเท็จเสมอ

โดยส่วนตัวแล้วฉันจะกำหนดค่าบูลีนเป็น FALSE เสมอและการกำหนดค่าเริ่มต้นให้เป็น NULL จะดูลำบากเล็กน้อย (แม้แต่ใน C ที่ทั้งสองมีค่าเป็น 0 เท่านั้น ... เป็นสิ่งที่มีสไตล์)


1

ฉันคิดว่านักพัฒนาที่ไม่ดีพบการใช้ null / 0 / false ที่แตกต่างกันทั้งหมดในโค้ด

ตัวอย่างเช่นหนึ่งในข้อผิดพลาดที่นักพัฒนาทั่วไปทำคือการส่งคืนรหัสข้อผิดพลาดในรูปแบบของข้อมูลด้วยฟังก์ชัน

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

นี่คือตัวอย่างของอินเตอร์เฟสน้ำตาล นี่คือตัวอย่างในหนังสือ "การดีบักการพัฒนาซอฟต์แวร์" และในหนังสืออีกเล่มหนึ่ง "การเขียนรหัสที่ถูกต้อง"

ปัญหาเกี่ยวกับสิ่งนี้คือความหมายหรือข้อสมมติที่เกิดขึ้นกับชนิดของถ่าน ในคอมไพเลอร์บางประเภทถ่านสามารถไม่ได้ลงนาม ดังนั้นแม้ว่าคุณจะคืนค่า -1 คอมไพเลอร์สามารถคืนค่า 1 แทน สมมติฐานคอมไพเลอร์ชนิดนี้ใน C ++ หรือ C ยากต่อการตรวจจับ

วิธีที่ดีที่สุดคืออย่าผสมรหัสข้อผิดพลาดกับข้อมูลของคุณ ดังนั้นฟังก์ชั่นดังต่อไปนี้

char GetChar()

ตอนนี้กลายเป็น

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

ซึ่งหมายความว่าไม่ว่านักพัฒนาซอฟต์แวร์จะอยู่ในร้านพัฒนาของคุณไม่ว่าเขาหรือเธอจะไม่ผิดพลาด แม้ว่านี่จะไม่ได้พูดถึง redudancy หรือการพึ่งพาในรหัส

ดังนั้นโดยทั่วไปแล้วการแลกเปลี่ยนบูลล์เป็นประเภทชั้นหนึ่งในภาษาก็โอเคและฉันคิดว่าโจเอลพูดถึงมันด้วยโพสต์ล่าสุดของเขา แต่พยายามอย่าใช้มิกซ์และจับคู่ข้อมูลกับข้อมูลของคุณในรูทีนและคุณควรจะปรับได้อย่างสมบูรณ์แบบ


1

ใน PHP มันขึ้นอยู่กับว่าคุณกำลังตรวจสอบประเภท:

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

เทคนิคโมฆะ0x00แต่ใน ( null == 0x00 ) && ( null !== 0x00 )PHP

0 เป็นค่าจำนวนเต็ม


1

ข้อเท็จจริงหนึ่งที่น่าสนใจเกี่ยวกับNULLใน PHP: หากคุณตั้งค่า var ให้เท่ากับจะNULLเหมือนกับว่าคุณได้เรียกunset()ใช้มัน

NULLโดยพื้นฐานแล้วหมายความว่าตัวแปรไม่มีค่าที่กำหนดให้กับมัน falseเป็นค่าบูลีนที่ถูกต้อง0เป็นค่าจำนวนเต็มถูกต้องและ PHP มีบางแปลงที่น่าเกลียดอย่างเป็นธรรมระหว่าง0, "0", และ""false


0

ไม่มีค่าอะไรเลย False เป็นบิตและ 0 คือ (อาจ) 32 บิต

ไม่ใช่ผู้เชี่ยวชาญ PHP แต่ในภาษาที่ทันสมัยกว่าบางภาษานั้นไม่สามารถใช้แทนกันได้ ฉันคิดถึงการมี 0 และ false สามารถแลกเปลี่ยนกันได้ แต่ด้วยบูลีนที่เป็นประเภทจริงคุณสามารถมีวิธีการและวัตถุที่เชื่อมโยงกับมันเพื่อให้เป็นเพียงการแลกเปลี่ยน Null เป็นโมฆะแม้ว่าจะไม่มีสิ่งใดเป็นหลัก


0

ดีฉันจำไม่ได้ว่าเพียงพอตั้งแต่สมัย PHP เพื่อตอบคำถาม "===" แต่สำหรับภาษาสไตล์ C ส่วนใหญ่ควรใช้ NULL ในบริบทของค่าตัวชี้เท็จเป็นบูลีนและเป็นศูนย์ ค่าตัวเลขเช่น int '\ 0' เป็นค่าตามธรรมเนียมสำหรับบริบทตัวละคร ฉันมักจะชอบที่จะใช้ 0.0 สำหรับลอยและคู่

ดังนั้น .. คำตอบอย่างรวดเร็วคือ: บริบท


0

ในสวยมากภาษาสมัยใหม่ทั้งหมด null เหตุผลหมายถึงตัวชี้ (หรือการอ้างอิง) ไม่ได้มีค่าหรือตัวแปรที่ไม่ได้เริ่มต้น 0 คือค่าจำนวนเต็มของศูนย์และเท็จคือค่าบูลีนของ, ดี, เท็จ ในการทำให้สิ่งต่าง ๆ มีความซับซ้อนใน C ตัวอย่างเช่น null, 0 และ false ล้วนแสดงถึงวิธีการเดียวกันทั้งหมด ฉันไม่รู้ว่ามันทำงานอย่างไรใน PHP

จากนั้นหากต้องการเพิ่มความซับซ้อนให้มากขึ้นฐานข้อมูลจะมีแนวคิดเป็นโมฆะซึ่งหมายถึงการขาดหายไปหรือไม่สามารถใช้ได้ ยกตัวอย่างเช่นเมื่อไม่นานมานี้ไม่มีความแตกต่างระหว่าง int เป็นโมฆะและเป็นศูนย์ แต่มันก็เปลี่ยนเป็น ints เป็นโมฆะ

ขออภัยที่ทำให้เสียงนี้ซับซ้อน มันเป็นเพียงจุดนี้เป็นจุดยึดภาษาเป็นเวลาหลายปีและจนถึงเมื่อเร็ว ๆ นี้มันก็ไม่ได้มีการแก้ไขที่ชัดเจนใด ๆ คนเคยแยกสิ่งต่าง ๆ เข้าด้วยกันหรือทำให้ว่างเปล่าหรือ 0 แทนโมฆะในฐานข้อมูลซึ่งไม่ได้ผลดีเสมอไป


0

False และ 0 นั้นมีความคิดคล้ายกันคือพวกมันคือ isomorphic 0 คือค่าเริ่มต้นสำหรับพีชคณิตของจำนวนธรรมชาติและ False เป็นค่าเริ่มต้นสำหรับพีชคณิตแบบบูล

กล่าวอีกนัยหนึ่ง 0 สามารถกำหนดเป็นจำนวนซึ่งเมื่อเพิ่มจำนวนธรรมชาติบางอย่างให้ผลจำนวนเดียวกัน:

x + 0 = x

ในทำนองเดียวกัน False เป็นค่าที่ความแตกต่างของมันและค่าอื่น ๆ คือค่าเดียวกัน:

x || False = x

Null เป็นแนวคิดที่ต่างไปจากเดิมอย่างสิ้นเชิง ขึ้นอยู่กับภาษานั้นมีความหมายแตกต่างกันสำหรับมัน แต่ไม่มีใครอธิบายถึง "ค่าเริ่มต้น" เป็นเท็จและ 0 เป็น ไม่มีพีชคณิตสำหรับ Null มันเกี่ยวข้องกับตัวแปรมักจะแสดงว่าตัวแปรนั้นไม่มีค่าเฉพาะในบริบทปัจจุบัน ในภาษาส่วนใหญ่ไม่มีการดำเนินการที่กำหนดไว้ใน Null และเป็นข้อผิดพลาดในการใช้ Null เป็นตัวถูกดำเนินการ ในบางภาษามีค่าพิเศษที่เรียกว่า "bottom" มากกว่า "null" ซึ่งเป็นตัวยึดตำแหน่งสำหรับค่าของการคำนวณที่ไม่ได้ยุติ

ฉันได้เขียนอย่างกว้างขวางมากขึ้นเกี่ยวกับความหมายของ NULL ที่อื่น ๆ


1
offtopic, false == 0 ถูกหน่วงอย่างสมบูรณ์ มากยิ่งขึ้นด้วย php ที่คืนค่าข้อมูลหรือความล้มเหลวในฟังก์ชั่น เห็นผลตอบแทนสำหรับ mysql_insert_id "" "ID ที่สร้างขึ้นสำหรับคอลัมน์ AUTO_INCREMENT โดยแบบสอบถามก่อนหน้านี้เกี่ยวกับความสำเร็จ, 0 ถ้าแบบสอบถามก่อนหน้านี้ไม่ได้สร้างค่า AUTO_INCREMENT หรือ FALSE หากไม่มีการเชื่อมต่อ MySQL สำเร็จ" "" โดยทั่วไปแล้วสามารถส่งคืน A) id ได้ B) ศูนย์, C) false ... ตอนนี้ถ้านั่นคือรายการแรกในตาราง id จะเป็นศูนย์! ดังนั้นทั้งสามค่าจึงเหมือนกัน! นักพัฒนาสามารถทำให้ความรู้สึกของศูนย์สามประเภทได้อย่างไร ... และฉันเห็นด้วยกับโพสต์ของคุณเป็นโมฆะ
gcb

0

บางคนสามารถอธิบายให้ฉันฟังได้ว่าเพราะเหตุใด 'NULL' จึงไม่ใช่แค่สตริงในตัวอย่างการเปรียบเทียบ

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

1
เพราะ PHP นั้นมันจะแปลงค่าเป็นจำนวนเต็มภายในแล้วทำการเปรียบเทียบ php > var_dump((int) "NULL"); // => int(0) php > var_dump((int) "BLA"); // => int(0)ดู php.net/manual/en/language.operators.comparison.php แปลสตริงและแหล่งข้อมูลให้เป็นตัวเลขคณิตศาสตร์ปกติ
Sevyls

-1

ปัญหาเกี่ยวกับความผิดพลาดมาจากประวัติ PHP ปัญหากำหนดเป้าหมายประเภทสเกลาร์ที่ไม่ได้นิยามไว้อย่างชัดเจน

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

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

ความเข้มงวดของ PHP7 เป็นขั้นตอนต่อไป แต่อาจไม่เพียงพอ https://web-techno.net/typing-with-php-7-what-you-shouldnt-do/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.