ฉันจำได้ว่าอ่านย้อนหลังเกี่ยวกับตัวดำเนินการเชิงตรรกะในกรณีของการ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 27
BTW, 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
เนื่องจากการลัดวงจรไม่ใช่เพราะมีความสำคัญสูงกว่า