บูลีนตัวพิมพ์ใหญ่เทียบกับตัวพิมพ์เล็กใน PHP


137

ตอนที่ฉันเรียน PHP ฉันอ่านที่ไหนสักแห่งว่าคุณควรใช้บูลีนเวอร์ชันตัวพิมพ์ใหญ่เสมอTRUEและFALSEเนื่องจากเวอร์ชันตัวพิมพ์เล็ก "ปกติ" trueและfalseไม่ "ปลอดภัย" ที่จะใช้

ตอนนี้เป็นเวลาหลายปีแล้วและทุกสคริปต์ PHP ที่ฉันเขียนใช้เวอร์ชันตัวพิมพ์ใหญ่ ตอนนี้ฉันกำลังตั้งคำถามว่าเนื่องจากฉันได้เห็น PHP มากมายที่เขียนด้วยตัวพิมพ์เล็ก (เช่น Zend Framework)

เคยมีเหตุผลที่จะใช้ตัวพิมพ์ใหญ่หรือไม่หรือใช้ตัวพิมพ์เล็กได้อย่างสมบูรณ์แบบ?

แก้ไข: ลืมบอกไปว่าสิ่งนี้ใช้ได้กับNULLและnullเช่นกัน


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

2
ที่ไม่เป็นความจริง. ฉันทดสอบด้วยการทำซ้ำ 5M และทั้งคู่ให้ผลลัพธ์เหมือนกัน 0.5 วินาทีบนพีซีของฉัน: P
Alex

9
@Alex Pekka อาจหมายความว่าการเขียนบูลีนตัวพิมพ์เล็กที่แท้จริงนั้นเร็วกว่า นั่นเป็นเหตุผลที่ต้องใช้คีย์น้อยลง แม้ว่าความแตกต่างนั้นเล็กมาก
Martti Laine

ขอโทษค่ะฉันเผลอโหวตลงไปหลังจากโหวตให้คุณแล้ว
SIFE

2
ข้อสังเกตที่น่าสนใจ: var_export () เขียนจริงและเท็จเป็นตัวพิมพ์เล็ก แต่ NULL เป็นตัวพิมพ์ใหญ่ น่ารักใช่มั้ย 3v4l.org/6Oelk
donquixote

คำตอบ:


91

คู่มือ PHP อย่างเป็นทางการกล่าวว่า:

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

เพื่อใช่และtrue === TRUEfalse === FALSE

อย่างไรก็ตามโดยส่วนตัวแล้วฉันชอบTRUEซ้ำtrueแล้วFALSEซ้ำfalseเล่าด้วยเหตุผลด้านความสามารถในการอ่าน มันเป็นเหตุผลเดียวกันสำหรับการตั้งค่าของฉันเกี่ยวกับการใช้ORมากกว่าorหรือ||และเกี่ยวกับการใช้ANDมากกว่าหรือand&&

PSR-2มาตรฐานต้องtrue, falseและnullจะอยู่ในกรณีที่ต่ำกว่า


83
แค่อยากจะชี้ให้เห็นว่าORและ||ผู้ประกอบการที่แตกต่างกันใน PHP (ในขณะที่พวกเขามีความสำคัญแตกต่างกัน) เช่นเดียวกับและAND &&(ดังนั้นสำหรับตัวอย่าง&&และ||มีความสำคัญสูงกว่าผู้ประกอบการที่ได้รับมอบหมาย แต่ORและANDไม่ได้.)
Johrn

22
นอกจากนี้ด้วย IDE ของวันนี้ฉันไม่เห็นเหตุผลที่จะมีบูลีนตัวพิมพ์ใหญ่ที่บริสุทธิ์เป็นตัวเน้นไวยากรณ์สำหรับ IDE ส่วนใหญ่แยกพวกเขาออกด้วยความแตกต่างอย่างมาก
RobertPitt

37
ฉันชอบพิมพ์ตัวพิมพ์เล็กมากดังนั้นฉันจึงไม่ต้องกดปุ่ม shift ค้างไว้
ack

6
ฉันชอบตัวพิมพ์เล็กเช่นกัน - เหมือนใน java แต่สำหรับแต่ละคนมีของตัวเอง ฉันหวังว่าพวกเขาจะตั้งรกรากในทางเดียวและทำให้เราเปลี่ยนไปทางใดทางหนึ่ง !!!!! นี่ไม่ใช่ความยืดหยุ่นที่ฉันจำเป็นต้องมีจริงๆ!
Ray

5
@Cyril: มีเหตุผลดีๆมากมายที่จะหลงระเริงในการเกลียด PHP (เช่นแค่เห็นสิ่งที่ Johrn กล่าวถึงข้างต้นฉันไม่รู้เรื่องนี้) แต่เนื่องจากโดยพื้นฐานแล้วไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่จึงไม่มีอะไรแปลกในกรณีผสม นิพจน์เหมือนกัน อย่างไรก็ตามอะไรคือเรื่องไร้สาระที่ผสมผสานความอ่อนไหวของตัวพิมพ์เล็กและตัวพิมพ์เล็กเข้ากับความไม่เข้าใจทั่วไป (ดูเช่นstackoverflow.com/questions/5643496/… )
Sz.

111
define('TRUE', false);
define('FALSE', true);

ขอให้มีความสุขในการแก้ไขข้อบกพร่อง! (PHP < 5.1.3 (2 พฤษภาคม 2549)ดูการสาธิต )

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


Eliminated run-time constant fetching for TRUE, FALSE and NULL

author      dmitry <dmitry>
            Wed, 15 Mar 2006 09:04:48 +0000 (09:04 +0000)
committer   dmitry <dmitry>
            Wed, 15 Mar 2006 09:04:48 +0000 (09:04 +0000)
commit      d51599dfcd3282049c7a91809bb83f665af23b69
tree        05b23b2f97cf59422ff71cc6a093e174dbdecbd3
parent      a623645b6fd66c14f401bb2c9e4a302d767800fd

กระทำd51599dfcd3282049c7a91809bb83f665af23b69 (และ6f76b17079a709415195a7c27607cd52d039d7c3 )


7
-1 เพราะ A) นี่ไม่มีจุดหมาย B) สิ่งนี้ไม่ตอบคำถาม และ C) ฉันยอมรับคำตอบที่ถูกต้องแล้วและสิ่งนี้ไม่ได้นำเสนอข้อมูลที่เป็นประโยชน์เพิ่มเติม
Austin Hyde

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

13
ฉันเข้าใจประเด็นที่คุณกำลังทำอยู่ (ตอนนี้) แต่วิธีที่คุณทำในตอนแรกนั้นเป็น (IMO) ที่คลุมเครือและไร้จุดหมาย หากคุณเพิ่งแก้ไขคำตอบของคุณในตอนแรกฉันจะเพิ่มคะแนนให้เพราะนี่เป็นจุดที่ดีมากจริงๆ
Austin Hyde

4
นี่คือคำตอบที่ใช่ ควรได้รับคะแนนสำหรับเรื่องนี้
serialworm

24
ในฐานะที่เป็นสำหรับการแก้ไขคำอธิบายที่เป็นบิตทำให้เข้าใจผิด ... ค่าตัวจริง (ซึ่งได้รับการรวบรวมลงในราชสกุลT_NULL, T_TRUEและT_FALSEในเวลาแจง) เป็นกรณีตายเพื่อใช้NULLไม่จริง "คงที่" --- เว้นแต่คุณทำให้define()มันคงใช้ เพียงแค่ใช้NULLหรือTRUEไม่ได้หมายความว่ามันเป็นค่าคงที่ราวกับว่าไม่มีค่าคงที่ PHP แปลว่ามันเป็นตัวอักษร คำอธิบายที่ถูกต้องมากขึ้นคือการที่รุ่นตัวพิมพ์เล็กไม่สามารถได้รับการนิยามใหม่ในขณะที่คนอื่น ๆ กรณีรูปแบบกระป๋อง
โจ

31

ใช้ตัวพิมพ์เล็ก

  1. พิมพ์ได้ง่ายกว่า (IMO)
  2. อ่านง่ายกว่า (IMO)
  3. บูลีนของ JavaScript เป็นตัวพิมพ์เล็กและตัวพิมพ์เล็ก

7
+1; ฉันแค่เพิ่มอาร์กิวเมนต์ Javascript: เนื่องจากเป็นเรื่องปกติมากในการเขียนโปรแกรมบนเว็บเพื่อเขียนโค้ด PHP และ JS กล้ามเนื้อนิ้วการพัฒนาเว็บที่พัฒนามาอย่างดียังคงใช้ตัวอักษรเดียวกันกับที่ใช้ในบริบทภาษาสุดท้ายเป็นประจำ อย่างน้อยฉันมักพบว่าตัวเองเขียน TRUE หรือ FALSE ใน Javascript หลังจากเปลี่ยนจาก PHP การใช้ตัวพิมพ์เล็กใน PHP แก้ไขสิ่งนี้ให้ดี
Sz.

11

หากคุณตั้งใจจะใช้ JSON RFC7159 จะพูดว่า:

ชื่อตามตัวอักษรต้องเป็นตัวพิมพ์เล็ก ไม่อนุญาตให้ใช้ชื่อตามตัวอักษรอื่น ๆ

จากรายการการเปลี่ยนแปลงย้อนหลังที่เข้ากันไม่ได้ในPHP 5.6 :

json_decode () ตอนนี้ปฏิเสธตัวแปรที่ไม่ใช่ตัวพิมพ์เล็กของตัวอักษร JSON จริงเท็จและเป็นโมฆะตลอดเวลาตามข้อกำหนด JSON

ตามมาตรฐาน PSR-2 :

คำหลัก PHP ต้องเป็นตัวพิมพ์เล็ก

ค่าคงที่ของ PHP จริงเท็จและเป็นโมฆะต้องเป็นตัวพิมพ์เล็ก


ถูกต้อง แต่คำถามนี้เกี่ยวข้องกับบูลีนตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กในPHPไม่ใช่ JSON ยกตัวอย่างเช่นทั้งสองjson_encode(TRUE)และอัตราผลตอบแทนjson_encode(true) 'true'
Austin Hyde

3
ขอโทษที่พูดถึง JSON จะดีกว่าไหมถ้าฉันลบข้อมูลอ้างอิงเหล่านั้นออกทั้งหมดและพูดถึง PSR-2 เท่านั้น
Mandrake

4
ฉันคิดว่าการอ้างอิงถึง JSON นั้นเหมาะสมเนื่องจากคุณใช้ javascript / JSON กับ PHP เป็นประจำและอาจมองหาความสอดคล้องกัน
Doug Kress

9

ฉันเคยทำ C style TRUE / FALSE booleans เหมือน const ทั้งหมดในตัวพิมพ์ใหญ่ทั้งหมดจนกระทั่งฉันได้PSR bandwagon

ส่วนที่ 2.5 ของ PSR-2:

ค่าคงที่ของ PHP จริงเท็จและเป็นโมฆะต้องเป็นตัวพิมพ์เล็ก

โดยพื้นฐานแล้วถ้าคุณต้องการเล่นให้ดีกับรายละเอียดสไตล์โอเพนซอร์สบูลีนต้องเป็นตัวพิมพ์เล็ก


5

มันไม่สำคัญtrueเหมือนกันTRUEทุกประการ เช่นเดียวกันสำหรับfalseและnullและฉันไม่เคยได้ยินมาก่อนว่ามันจะมีความสำคัญในตอนไหน

วิธีเดียวที่คุณจะทำให้สิ่งต่าง ๆ ยุ่งเหยิงคือการอ้างค่าเหล่านั้นตัวอย่างเช่น:

$foo = false;   // FALSE
$bar = "false"; // TRUE

$foo2 = true;   // TRUE
$bar2 = "true"; // TRUE

$foo3 = null;   // NULL
$bar3 = "null"; // TRUE

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


FALSE และ NULL ไม่เหมือนกัน is_null () ไม่ส่งคืนจริงหากค่า === FALSE
Noah Goodrich

9
@ โนอาห์กู๊ดริชฉันไม่ได้บอกเป็นนัยว่าfalseและnullจะเหมือนเดิม ฉันบอกว่า "เหมือนกันไปสำหรับfalseและnull" ซึ่งหมายความว่าทั้งสองสามารถแสดงเป็นตัวอักษรตัวล่างหรือตัวพิมพ์ใหญ่
Tatu Ulmanen

5

ฉันได้เขียนโค้ดง่ายๆเพื่อตรวจสอบความแตกต่างระหว่างเท็จและเท็จ : การทำซ้ำแต่ละครั้งกำลังทำสิ่งที่:

    for ($i = 0; $i < self::ITERATIONS; ++$i) {
       (0 == FALSE) ;
    }

นี่คือผลลัพธ์:

Iterations: 100000000
using 'FALSE': 25.427761077881 sec
using 'false': 25.01614689827 sec

ดังนั้นเราจึงเห็นได้ว่าประสิทธิภาพนั้นสัมผัสได้จากบูลีนเคสเล็กน้อย - ตัวพิมพ์เล็กเร็วกว่า แต่คุณจะไม่เห็นแน่นอน


เครื่องยนต์ JS อะไร ปัจจุบัน JS ถูกรวบรวมไว้ในหน่วยความจำก่อนดำเนินการ
Tiberiu-Ionuț Stan

1
PHP เป็นโทเค็นก่อนการดำเนินการและไม่ควรมีความแตกต่างในเวลา อีกคำตอบระบุว่าอัปเปอร์เร็วกว่า ควรละเว้นความแตกต่างของขนาดนี้ในการทดสอบใด ๆ - ความแตกต่างนี้คือ 2.5e-7 ต่อการวนซ้ำ
Doug Kress

4

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

ข้อดีอย่างหนึ่งของการใช้ตัวพิมพ์ใหญ่ที่อยู่ในใจก็คือพวกมันดูโดดเด่นและง่ายต่อการค้นหาในโค้ด


2
+1 เพื่อความเป็นระเบียบเรียบร้อย ประเพณีตัวพิมพ์ใหญ่ทั้งหมดมาจาก C แต่ถึงเวลาแล้วที่เราจะกำจัดรูปแบบที่น่าเกลียดนั้นออกไป
Petruza

2

ฉันเจอคำถามเก่า ๆ นี้ในขณะที่ถามตัวเองในสิ่งเดียวกัน จุดดีด้วย define ('TRUE', false); define ('FALSE', true); ใช้ไม่ได้กับ php5 แม้ว่า การเขียนบรรทัดเหล่านั้นในโค้ด php5 ก็เหมือนกับการเขียนความคิดเห็น


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

8
จริง ๆ แล้วการรู้ว่าสิ่งนี้ใช้ไม่ได้อีกต่อไปใน PHP 5: P
Alex

1

นี่คือการทดสอบของฉันบน Windows 7x64bit Apache / 2.4.9 PHP / 5.5.14

$blockLimit = 50;
while($blockLimit > 0): $blockLimit--;

//STAR Here ================================================

$msc = microtime(true);
for ($i = 0; $i < 100000; $i++) {
   echo (FALSE);
}
echo 'FALSE took ' . number_format(microtime(true)-$msc,4) . " Seconds\r\n";
$msc = microtime(true);
for ($i = 0; $i < 100000; $i++) {
   echo (false);
}
echo 'false took ' . number_format(microtime(true)-$msc,4) . " Seconds\r\n";

echo "\r\n --- \r\n";
//Shutdown ==================================================
endwhile;

ครั้งนี้ FALSE ชนะ 20 ครั้ง ตัวพิมพ์ใหญ่จึงเร็วกว่าในสภาพแวดล้อมของฉัน


0

ฉันมางานปาร์ตี้ช้าไปหลายปี แต่อยากจะพูดถึงสิ่งที่น่าสนใจที่ยังไม่มีในกระทู้นี้ วันนี้ฉันค้นพบTrueนี้ยังเป็นที่ถูกต้องไม่ได้เป็นเพียงหรือtrue TRUEการสะกดทั้งหมดเทียบเท่ากัน นี้มีความเกี่ยวข้องเนื่องจากการกำเนิดระบบ Open API สำหรับ PHP Trueจะใช้ (ซึ่งทำให้ฉันรู้สึกสับสนและการค้นหาที่พบหน้านี้)

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