ฉันจำได้ว่าอ่านย้อนหลังเกี่ยวกับตัวดำเนินการเชิงตรรกะในกรณีของการORใช้งาน||นั้นดีกว่าor(หรือในทางกลับกัน)
ฉันต้องใช้สิ่งนี้ในโปรเจ็กต์ของฉันเมื่อมันกลับมาหาฉัน แต่ฉันจำไม่ได้ว่ามีการแนะนำตัวดำเนินการใดหรือเป็นจริง
ไหนดีกว่ากันและทำไม?
ฉันจำได้ว่าอ่านย้อนหลังเกี่ยวกับตัวดำเนินการเชิงตรรกะในกรณีของการORใช้งาน||นั้นดีกว่าor(หรือในทางกลับกัน)
ฉันต้องใช้สิ่งนี้ในโปรเจ็กต์ของฉันเมื่อมันกลับมาหาฉัน แต่ฉันจำไม่ได้ว่ามีการแนะนำตัวดำเนินการใดหรือเป็นจริง
ไหนดีกว่ากันและทำไม?
คำตอบ:
ไม่มี "ดี" ||แต่คนทั่วไปมากขึ้นคือ พวกเขามีลำดับความสำคัญที่แตกต่างกันและ||จะทำงานอย่างที่คาดหวังตามปกติ
ดูเพิ่มเติม: ตัวดำเนินการเชิงตรรกะ ( ตัวอย่างต่อไปนี้นำมาจากที่นั่น ):
// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;
// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;
27 or 0คืนให้27ฉัน
orส่งคืนบูลีนด้วย ความสำคัญของมันต่ำมากจนบางครั้งดูเหมือนทำอย่างอื่น :) print 27 or 0จะพิมพ์27เพราะorเกิดขึ้นหลังจากที่ print 27BTW, echoไม่ได้หลงกล - เอาท์พุทหากว่าecho 27 or 0 1
ใช้เพื่อวัตถุประสงค์ที่แตกต่างกันและในความเป็นจริงมีลำดับความสำคัญของตัวดำเนินการที่แตกต่างกัน ตัวดำเนินการ&&และ||มีไว้สำหรับเงื่อนไขบูลีนในขณะที่andและorมีไว้สำหรับโฟลว์ควบคุม
ตัวอย่างเช่นต่อไปนี้เป็นเงื่อนไขบูลีน:
if ($foo == $bar && $baz != $quxx) {
สิ่งนี้แตกต่างจากขั้นตอนการควบคุม:
doSomething() or die();
die()ฟังก์ชันจะถูกเรียกว่าdoSomething()จะกลับมาfalseหรือnull? เกิดอะไรขึ้นถ้าdoSomething()คืนtrueหรือไม่มีอะไร?
doSomething()ได้รับการประเมินเป็นบูลีน ถ้าจะส่งกลับค่า PHP พิจารณา truthy ( trueสตริงไม่ว่างเปล่า ฯลฯ ) die()ก็จะไม่โทร
ความแตกต่างระหว่างตามลำดับ || และ OR และ && และ AND เป็นลำดับความสำคัญของตัวดำเนินการ :
$bool = FALSE || TRUE;($bool = (FALSE || TRUE))$boolคือTRUE$bool = FALSE OR TRUE;(($bool = FALSE) OR TRUE)$boolคือFALSE$bool = TRUE && FALSE;($bool = (TRUE && FALSE))$boolคือFALSE$bool = TRUE AND FALSE;(($bool = TRUE) AND FALSE)$boolคือTRUEที่มา: http://wallstreetdeveloper.com/php-logical-operators/
นี่คือโค้ดตัวอย่างสำหรับการทำงานกับตัวดำเนินการเชิงตรรกะ:
<html>
<head>
<title>Logical</title>
</head>
<body>
<?php
$a = 10;
$b = 20;
if ($a>$b)
{
echo " A is Greater";
}
elseif ($a<$b)
{
echo " A is lesser";
}
else
{
echo "A and B are equal";
}
?>
<?php
$c = 30;
$d = 40;
//if (($a<$c) AND ($b<$d))
if (($a<$c) && ($b<$d))
{
echo "A and B are larger";
}
if (isset($d))
$d = 100;
echo $d;
unset($d);
?>
<?php
$var1 = 2;
switch($var1)
{
case 1: echo "var1 is 1";
break;
case 2: echo "var1 is 2";
break;
case 3: echo "var1 is 3";
break;
default: echo "var1 is unknown";
}
?>
</body>
</html>
ฉันรู้ว่ามันเป็นหัวข้อเก่า แต่ก็ยัง ฉันเพิ่งพบปัญหาในรหัสที่ฉันกำลังแก้ไขจุดบกพร่องในที่ทำงานและอาจมีใครบางคนมีปัญหาคล้ายกัน ...
สมมติว่าโค้ดมีลักษณะดังนี้:
$positions = $this->positions() || [];
คุณจะคาดหวัง (ตามที่คุณคุ้นเคยจากเช่น javascript) ว่าเมื่อ $ this-> position () ส่งคืนเท็จหรือ null ตำแหน่ง $ จะเป็นอาร์เรย์ว่าง แต่มันไม่ใช่ ค่าเป็น TRUE หรือ FALSE ขึ้นอยู่กับสิ่งที่ $ this-> position () ส่งกลับ
หากคุณต้องการรับค่า $ this-> position () หรืออาร์เรย์ว่างคุณต้องใช้:
$positions = $this->positions() or [];
แก้ไข:
ตัวอย่างข้างต้นไม่ได้ผลตามที่ตั้งใจไว้ แต่ความจริงก็เป็นเช่นนั้น||และorไม่เหมือนกัน ... ลองทำดังนี้
<?php
function returnEmpty()
{
//return "string";
//return [1];
return null;
}
$first = returnEmpty() || [];
$second = returnEmpty() or [];
$third = returnEmpty() ?: [];
var_dump($first);
var_dump($second);
var_dump($third);
echo "\n";
นี่คือผลลัพธ์:
bool(false)
NULL
array(0) {
}
ดังนั้นตัวเลือกที่สาม?:เป็นวิธีแก้ปัญหาที่ถูกต้องเมื่อคุณต้องการตั้งค่าที่ส่งคืนหรืออาร์เรย์ว่าง
$positions = $this->positions() ?: [];
ทดสอบด้วย PHP 7.2.1
$positions = $this->positions() ?? [];เป็นไปได้ว่าคุณต้องการอะไร
ฉันไม่คิดว่าจะดีกว่าอีกอันหนึ่งโดยเนื้อแท้ แต่ฉันขอแนะนำให้ใช้ || เนื่องจากเป็นค่าเริ่มต้นในภาษาส่วนใหญ่
แก้ไข: ตามที่คนอื่น ๆ ชี้ให้เห็นว่ามีความแตกต่างระหว่างทั้งสองอย่างแน่นอน
ไม่มีอะไรเลวร้ายหรือดีขึ้นเพียงขึ้นอยู่กับลำดับความสำคัญของตัวดำเนินการ เนื่องจาก||มีความสำคัญสูงกว่าorจึงใช้||เป็นส่วนใหญ่
บางภาษาใช้การลัดวงจรและภาษาอื่น ๆ ใช้การประเมินบูลีนเต็มรูปแบบ (ถ้าคุณรู้สิ่งนี้จะคล้ายกับคำสั่ง $Bในภาษาปาสคาล)
คำอธิบาย:
function A(){
...Do something..
return true;
}
function B(){
...Do something..
return true;
}
if ( A() OR B() ) { .....
ในตัวอย่างนี้ฟังก์ชันB()จะไม่ถูกเรียกใช้งาน ตั้งแต่ฟังก์ชั่นA()ส่งคืนค่า TRUE ผลลัพธ์ของคำสั่ง OR จึงเป็นที่รู้จักจากส่วนแรกโดยไม่จำเป็นต้องประเมินส่วนที่สองของนิพจน์
อย่างไรก็ตามด้วย ( A() || B() )ส่วนที่สองจะได้รับการประเมินเสมอโดยไม่คำนึงถึงมูลค่าของส่วนแรก
สำหรับการเขียนโปรแกรมที่ดีที่สุดคุณควรใช้ORสิ่งที่เร็วกว่าเสมอ(ยกเว้นในกรณีที่ส่วนแรกส่งคืนfalseและส่วนที่สองจะต้องได้รับการประเมิน)
||, Bจะไม่ถูกเรียก ตัวดำเนินการทั้งสองทำเหมือนกันทุกประการยกเว้นว่าลำดับความสำคัญต่างกัน
$e = true || $x = 'foo'จะไม่กำหนด$xเนื่องจากการลัดวงจรไม่ใช่เพราะมีความสำคัญสูงกว่า