ฉันได้รับการบอกว่าผู้พัฒนาที่ดีสามารถมองเห็น / ใช้ประโยชน์จากความแตกต่างระหว่างNull
และFalse
และ0
กับหน่วยงาน "ไม่มีอะไร" ที่ดีอื่น ๆ ได้ทั้งหมด
อะไรคือความแตกต่างโดยเฉพาะใน PHP? มันมีบางอย่างเกี่ยวข้องกับ===
?
ฉันได้รับการบอกว่าผู้พัฒนาที่ดีสามารถมองเห็น / ใช้ประโยชน์จากความแตกต่างระหว่างNull
และFalse
และ0
กับหน่วยงาน "ไม่มีอะไร" ที่ดีอื่น ๆ ได้ทั้งหมด
อะไรคือความแตกต่างโดยเฉพาะใน PHP? มันมีบางอย่างเกี่ยวข้องกับ===
?
คำตอบ:
Null
แปลว่า " ไม่มีอะไร " var ยังไม่ได้เริ่มต้น
False
หมายถึง " ไม่จริงในบริบทบูลีน " ใช้เพื่อแสดงอย่างชัดเจนว่าคุณกำลังเผชิญกับปัญหาเชิงตรรกะ
0
int
เป็น ไม่มีส่วนเกี่ยวข้องกับส่วนที่เหลือข้างต้นใช้สำหรับวิชาคณิตศาสตร์
ตอนนี้สิ่งที่เป็นเรื่องยุ่งยากก็ว่าในภาษาแบบไดนามิกเช่น 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
(ไม่ได้ตั้งค่าเลยจะนำไปสู่การดีบักอย่างหนัก ;-))
null
null
เป็น เป็น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)
var_dump( null == 0 );
คุณสองครั้งซ้ำแล้วซ้ำอีกส่วนที่คุณจะเริ่มต้นด้วยรหัส
0 == null
และnull == []
แต่[] != 0
!!
strrpos('fail', 'search') will return false, and not null
ในความคิดของฉันถูกต้อง - ถ้าnull
หมายถึงไม่ทราบดังนั้นการstrrpos
ส่งคืนnull
จะเป็นเช่นนั้นโดยบอกว่า 'ฉันไม่รู้ว่าสตริงนั้นมีอยู่' แทนที่จะเป็น 'สตริงไม่มีหรือไม่'
ด้านล่างเป็นตัวอย่าง:
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 ควรให้ความเข้าใจที่ชัดเจน
ใน PHP คุณสามารถใช้ตัวดำเนินการ === และ! == เพื่อตรวจสอบว่าค่าเท่ากันหรือไม่ ดังนั้นสำหรับตัวอย่างเช่น0 == false
เป็นtrue
แต่เป็น0 === false
false
เดียวกันจะไปสำหรับเมื่อเทียบกับ!=
!==
ในกรณีที่คุณเปรียบเทียบnull
กับอีกสองรายการโดยใช้โอเปอเรเตอร์ที่กล่าวถึงให้คาดหวังผลลัพธ์ที่คล้ายกัน
ตอนนี้ใน PHP คุณภาพของค่านี้มักจะถูกใช้เมื่อคืนค่าซึ่งบางครั้งอาจเป็น0
(ศูนย์) แต่บางครั้งมันอาจเป็นไปได้ว่าฟังก์ชั่นล้มเหลว ในกรณีดังกล่าวใน PHP คุณกลับและคุณจะต้องตรวจสอบกรณีเหล่านี้ใช้ประกอบตัวตนfalse
===
ตัวอย่างเช่นหากคุณกำลังค้นหาตำแหน่งของสตริงหนึ่งในอีกสตริงหนึ่งและคุณกำลังใช้strpos()
ฟังก์ชันนี้จะส่งคืนตำแหน่งตัวเลขซึ่งอาจเป็น 0 หากพบสตริงที่จุดเริ่มต้น แต่ถ้าไม่พบสตริงที่ ทั้งหมดแล้วstrpos()
จะกลับมาfalse
และคุณต้องคำนึงถึงเรื่องนี้เมื่อจัดการกับผลลัพธ์
หากคุณจะใช้เทคนิคเดียวกันในฟังก์ชั่นของคุณใครก็ตามที่คุ้นเคยกับไลบรารี PHP มาตรฐานจะเข้าใจสิ่งที่เกิดขึ้นและวิธีการตรวจสอบว่าค่าที่ส่งคืนเป็นสิ่งที่ต้องการหรือทำผิดพลาดบางอย่างในขณะที่ทำการประมวลผลหรือไม่ เช่นเดียวกันกับฟังก์ชัน params คุณสามารถประมวลผลได้แตกต่างกันไปขึ้นอยู่กับว่าเป็นอาร์เรย์หรือสตริงหรือไม่และเทคนิคนี้ใช้ใน PHP อย่างมากเช่นกันดังนั้นทุกคนจะได้รับมันอย่างง่ายดาย ดังนั้นฉันเดาว่านั่นคือพลัง
เท็จ, ไม่มีค่า, ไม่มีอะไร, 0, ไม่ได้กำหนดฯลฯ ฯลฯ
แต่ละเหล่านี้มีความหมายเฉพาะที่สัมพันธ์กับแนวคิดจริง บางครั้งมีความหมายหลายอย่างมากเกินไปในคำหลักหรือค่าเดียว
ในCและC ++ , NULL
, False
และ0
มีมากเกินไปจะมีค่าเท่ากัน ในC #พวกเขา 3 แนวคิดที่แตกต่าง
null
หรือNULL
มักจะระบุถึงการขาดค่า แต่มักจะไม่ระบุสาเหตุ
0
บ่งชี้จำนวนศูนย์เป็นธรรมชาติและมีการเทียบเท่าประเภทถึง1, 2, 3,ฯลฯ และในภาษาที่สนับสนุนแนวคิดที่แยกต่างหากของNULL
ควรได้รับการปฏิบัติเพียงตัวเลข
เท็จบ่งชี้ว่าไม่ใช่ความจริง และมันก็ใช้ในค่าไบนารี 0
มันไม่ได้หมายความว่าไม่มีการตั้งค่าหรือไม่ก็หมายความว่า มันบ่งบอกถึงหนึ่งในสองค่าไบนารี
ไม่มีสิ่งใดที่สามารถบ่งบอกได้ว่าค่านั้นถูกตั้งค่าเป็นอะไรโดยเฉพาะซึ่งบ่งบอกถึงสิ่งเดียวกันกับที่เป็นโมฆะ แต่ด้วยความตั้งใจ
ไม่ได้กำหนดในบางภาษาแสดงว่ายังไม่ได้ตั้งค่าเนื่องจากไม่มีรหัสที่ระบุค่าจริง
ฉันได้สูญเสียไปเพียงแค่ 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
?
จากเอกสารออนไลน์ PHP :
ในการแปลงค่าเป็นบูลีนอย่างชัดแจ้งให้ใช้คำสั่ง (bool) หรือ (บูลีน)
อย่างไรก็ตามในกรณีส่วนใหญ่การโยนนั้นไม่จำเป็นเนื่องจากค่าจะถูกแปลงโดยอัตโนมัติหากผู้ประกอบการฟังก์ชันหรือโครงสร้างการควบคุมต้องมีอาร์กิวเมนต์บูลีน
เมื่อแปลงเป็นบูลีนค่าต่อไปนี้จะถือว่าเป็น FALSE:
FALSE
ตัวเอง 0.0
(ศูนย์) "0"
NULL
(รวมถึงตัวแปรที่ไม่ได้ตั้งค่า) 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
หวังว่านี่จะช่วยได้
ความแตกต่างระหว่างค่าเหล่านี้มักจะลงไปที่กฎเฉพาะภาษาโดยละเอียด สิ่งที่คุณเรียนรู้สำหรับ PHP นั้นไม่จำเป็นต้องเป็นจริงสำหรับ Python หรือ Perl หรือ C เป็นต้นในขณะที่มันมีประโยชน์ในการเรียนรู้กฎสำหรับภาษาที่คุณกำลังทำงานด้วยการพึ่งพาพวกเขามากเกินไปคือการถามปัญหา . ปัญหาเกิดขึ้นเมื่อโปรแกรมเมอร์รายต่อไปต้องการรักษารหัสของคุณและคุณได้ใช้โครงสร้างบางส่วนที่ใช้ประโยชน์จากรายละเอียดเล็กน้อยของ Null vs. False (ตัวอย่าง) รหัสของคุณควรดูถูกต้อง (และในทางกลับกันรหัสผิดควรดูผิด )
Null ใช้ในฐานข้อมูลเพื่อแสดง "ไม่มีการบันทึก" หรือ "ไม่มีข้อมูล" ดังนั้นคุณอาจมีฟิลด์บิตที่อธิบายว่า "ผู้ใช้รายนี้ต้องการส่งอีเมลถึงเราหรือไม่" โดยที่ True หมายถึงพวกเขาทำผิด False หมายถึงพวกเขาไม่ต้องการส่งอะไร แต่ Null จะหมายความว่าคุณไม่ได้รับ ' ไม่รู้ พวกเขาสามารถผ่านเข้าร่วมภายนอกและเช่น
ความหมายเชิงตรรกะของ Null มักแตกต่างกัน - ในบางภาษา NULL ไม่เท่ากับอะไรเลยดังนั้นหาก (a == NULL) จะเป็นเท็จเสมอ
โดยส่วนตัวแล้วฉันจะกำหนดค่าบูลีนเป็น FALSE เสมอและการกำหนดค่าเริ่มต้นให้เป็น NULL จะดูลำบากเล็กน้อย (แม้แต่ใน C ที่ทั้งสองมีค่าเป็น 0 เท่านั้น ... เป็นสิ่งที่มีสไตล์)
ฉันคิดว่านักพัฒนาที่ไม่ดีพบการใช้ 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 หรือการพึ่งพาในรหัส
ดังนั้นโดยทั่วไปแล้วการแลกเปลี่ยนบูลล์เป็นประเภทชั้นหนึ่งในภาษาก็โอเคและฉันคิดว่าโจเอลพูดถึงมันด้วยโพสต์ล่าสุดของเขา แต่พยายามอย่าใช้มิกซ์และจับคู่ข้อมูลกับข้อมูลของคุณในรูทีนและคุณควรจะปรับได้อย่างสมบูรณ์แบบ
ใน PHP มันขึ้นอยู่กับว่าคุณกำลังตรวจสอบประเภท:
(
( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
( false !== null ) && ( false == null )
)
เทคนิคโมฆะ0x00
แต่ใน ( null == 0x00 ) && ( null !== 0x00 )
PHP
0
เป็นค่าจำนวนเต็ม
ข้อเท็จจริงหนึ่งที่น่าสนใจเกี่ยวกับNULL
ใน PHP: หากคุณตั้งค่า var ให้เท่ากับจะNULL
เหมือนกับว่าคุณได้เรียกunset()
ใช้มัน
NULL
โดยพื้นฐานแล้วหมายความว่าตัวแปรไม่มีค่าที่กำหนดให้กับมัน false
เป็นค่าบูลีนที่ถูกต้อง0
เป็นค่าจำนวนเต็มถูกต้องและ PHP มีบางแปลงที่น่าเกลียดอย่างเป็นธรรมระหว่าง0
, "0"
, และ""
false
ไม่มีค่าอะไรเลย False เป็นบิตและ 0 คือ (อาจ) 32 บิต
ไม่ใช่ผู้เชี่ยวชาญ PHP แต่ในภาษาที่ทันสมัยกว่าบางภาษานั้นไม่สามารถใช้แทนกันได้ ฉันคิดถึงการมี 0 และ false สามารถแลกเปลี่ยนกันได้ แต่ด้วยบูลีนที่เป็นประเภทจริงคุณสามารถมีวิธีการและวัตถุที่เชื่อมโยงกับมันเพื่อให้เป็นเพียงการแลกเปลี่ยน Null เป็นโมฆะแม้ว่าจะไม่มีสิ่งใดเป็นหลัก
ดีฉันจำไม่ได้ว่าเพียงพอตั้งแต่สมัย PHP เพื่อตอบคำถาม "===" แต่สำหรับภาษาสไตล์ C ส่วนใหญ่ควรใช้ NULL ในบริบทของค่าตัวชี้เท็จเป็นบูลีนและเป็นศูนย์ ค่าตัวเลขเช่น int '\ 0' เป็นค่าตามธรรมเนียมสำหรับบริบทตัวละคร ฉันมักจะชอบที่จะใช้ 0.0 สำหรับลอยและคู่
ดังนั้น .. คำตอบอย่างรวดเร็วคือ: บริบท
ในสวยมากภาษาสมัยใหม่ทั้งหมด null เหตุผลหมายถึงตัวชี้ (หรือการอ้างอิง) ไม่ได้มีค่าหรือตัวแปรที่ไม่ได้เริ่มต้น 0 คือค่าจำนวนเต็มของศูนย์และเท็จคือค่าบูลีนของ, ดี, เท็จ ในการทำให้สิ่งต่าง ๆ มีความซับซ้อนใน C ตัวอย่างเช่น null, 0 และ false ล้วนแสดงถึงวิธีการเดียวกันทั้งหมด ฉันไม่รู้ว่ามันทำงานอย่างไรใน PHP
จากนั้นหากต้องการเพิ่มความซับซ้อนให้มากขึ้นฐานข้อมูลจะมีแนวคิดเป็นโมฆะซึ่งหมายถึงการขาดหายไปหรือไม่สามารถใช้ได้ ยกตัวอย่างเช่นเมื่อไม่นานมานี้ไม่มีความแตกต่างระหว่าง int เป็นโมฆะและเป็นศูนย์ แต่มันก็เปลี่ยนเป็น ints เป็นโมฆะ
ขออภัยที่ทำให้เสียงนี้ซับซ้อน มันเป็นเพียงจุดนี้เป็นจุดยึดภาษาเป็นเวลาหลายปีและจนถึงเมื่อเร็ว ๆ นี้มันก็ไม่ได้มีการแก้ไขที่ชัดเจนใด ๆ คนเคยแยกสิ่งต่าง ๆ เข้าด้วยกันหรือทำให้ว่างเปล่าหรือ 0 แทนโมฆะในฐานข้อมูลซึ่งไม่ได้ผลดีเสมอไป
False และ 0 นั้นมีความคิดคล้ายกันคือพวกมันคือ isomorphic 0 คือค่าเริ่มต้นสำหรับพีชคณิตของจำนวนธรรมชาติและ False เป็นค่าเริ่มต้นสำหรับพีชคณิตแบบบูล
กล่าวอีกนัยหนึ่ง 0 สามารถกำหนดเป็นจำนวนซึ่งเมื่อเพิ่มจำนวนธรรมชาติบางอย่างให้ผลจำนวนเดียวกัน:
x + 0 = x
ในทำนองเดียวกัน False เป็นค่าที่ความแตกต่างของมันและค่าอื่น ๆ คือค่าเดียวกัน:
x || False = x
Null เป็นแนวคิดที่ต่างไปจากเดิมอย่างสิ้นเชิง ขึ้นอยู่กับภาษานั้นมีความหมายแตกต่างกันสำหรับมัน แต่ไม่มีใครอธิบายถึง "ค่าเริ่มต้น" เป็นเท็จและ 0 เป็น ไม่มีพีชคณิตสำหรับ Null มันเกี่ยวข้องกับตัวแปรมักจะแสดงว่าตัวแปรนั้นไม่มีค่าเฉพาะในบริบทปัจจุบัน ในภาษาส่วนใหญ่ไม่มีการดำเนินการที่กำหนดไว้ใน Null และเป็นข้อผิดพลาดในการใช้ Null เป็นตัวถูกดำเนินการ ในบางภาษามีค่าพิเศษที่เรียกว่า "bottom" มากกว่า "null" ซึ่งเป็นตัวยึดตำแหน่งสำหรับค่าของการคำนวณที่ไม่ได้ยุติ
ฉันได้เขียนอย่างกว้างขวางมากขึ้นเกี่ยวกับความหมายของ NULL ที่อื่น ๆ
บางคนสามารถอธิบายให้ฉันฟังได้ว่าเพราะเหตุใด 'NULL' จึงไม่ใช่แค่สตริงในตัวอย่างการเปรียบเทียบ
$x = 0;
var_dump($x == 'NULL'); # TRUE !!!WTF!!!
php > var_dump((int) "NULL"); // => int(0)
php > var_dump((int) "BLA"); // => int(0)
ดู php.net/manual/en/language.operators.comparison.php แปลสตริงและแหล่งข้อมูลให้เป็นตัวเลขคณิตศาสตร์ปกติ
ปัญหาเกี่ยวกับความผิดพลาดมาจากประวัติ 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/
null
และเมื่อfalse
ใด ผมชอบใช้null
เมื่อดึงค่าจากวิธีการเพราะผมสามารถใช้isset
เพื่อตรวจสอบว่าค่าจะถูกส่งกลับแทนการใช้empty
ซึ่งจะไม่ใช้เวลาในบัญชี:false
,0
,'0'
หรือสตริงที่ว่างเปล่าซึ่งสามารถเป็นค่าที่ทำงานได้ในหลาย ๆ สถานการณ์ สำหรับฉันมันเป็นทางออกที่สะอาดที่สุดในโครงสร้างที่ยุ่งเหยิง