ภาษาโปรแกรมจำนวนมากมีฟังก์ชันการรวมกัน (ส่งกลับค่าที่ไม่ใช่ค่า NULL ตัวแรกเช่น ) PHP น่าเศร้าในปี 2009 ไม่มี
อะไรจะเป็นวิธีที่ดีในการนำ PHP ไปใช้จนกว่า PHP จะได้รับฟังก์ชัน coalesce
ภาษาโปรแกรมจำนวนมากมีฟังก์ชันการรวมกัน (ส่งกลับค่าที่ไม่ใช่ค่า NULL ตัวแรกเช่น ) PHP น่าเศร้าในปี 2009 ไม่มี
อะไรจะเป็นวิธีที่ดีในการนำ PHP ไปใช้จนกว่า PHP จะได้รับฟังก์ชัน coalesce
คำตอบ:
มีตัวดำเนินการใหม่ใน php 5.3 ซึ่งทำสิ่งนี้: ?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
$input['properties']['range_low'] ?: '?'
array() ?: null ?: false
false
ผู้ปฏิบัติงานมีสติ
PHP 7 แนะนำตัวดำเนินการเชื่อมต่อกันจริง:
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
หากค่าก่อนหน้า??
นี้ไม่มีอยู่หรือเป็นnull
ค่าหลังการ??
ถ่าย
การปรับปรุงตัว?:
ดำเนินการที่กล่าวถึงคือการ??
จัดการกับตัวแปรที่ไม่ได้กำหนดโดยไม่ต้องทิ้งE_NOTICE
ไฟล์.
($_GET['doesNotExist'] ?? null) ?: 'fallback'
?:
over ??
คือมันรวมค่าว่างด้วยซึ่ง??
ไม่ได้ทำ คล้ายกับพฤติกรรมของตรรกะหรือผู้ประกอบการใน JavaScript (คือ$val || 'default'
) ผมจะพบว่า?:
จะเป็นรูปแบบการปฏิบัติมากขึ้นของการรวมตัวกันถ้าในทางปฏิบัติของเราที่เราพบตัวเองในท้ายที่สุดการจัดการทั้งที่ว่างเปล่าและnullในลักษณะเดียวกัน (คือ$val ?: 'default'
) และหากคุณต้องการบังคับให้เกิดปัญหาต่อไปและกลืนE_NOTICE
คุณสามารถโต้แย้งได้:echo @$val ?: 'default';
Hit แรกสำหรับ "php coalesce" ใน Google
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return NULL;
}
ฉันชอบตัวดำเนินการ?: น่าเสียดายที่ยังไม่ได้ใช้กับสภาพแวดล้อมการผลิตของฉัน ดังนั้นฉันจึงใช้สิ่งนี้เทียบเท่า:
function coalesce() {
return array_shift(array_filter(func_get_args()));
}
coalesce
ควรจะกลับมาเป็นคนแรกที่ไม่ใช่ nullFALSE
อาร์กิวเมนต์พบซึ่งจะรวมถึง ฟังก์ชั่นนี้จะทิ้งFALSE
แม้ว่าอาจจะไม่ใช่สิ่งที่ op มีอยู่ในใจ (อย่างน้อยก็ไม่ใช่สิ่งที่ฉันต้องการจากcoalesce
ฟังก์ชัน)
เป็นที่น่าสังเกตว่าเนื่องจาก PHP ใช้ตัวแปรที่ไม่ได้กำหนดค่าและดัชนีอาร์เรย์ฟังก์ชันการรวมตัวกันจึงมีประโยชน์อย่าง จำกัด ฉันชอบที่จะทำสิ่งนี้ได้:
$id = coalesce($_GET['id'], $_SESSION['id'], null);
แต่ในกรณีส่วนใหญ่จะทำให้ PHP ผิดพลาดกับ E_NOTICE วิธีเดียวที่ปลอดภัยในการทดสอบการมีอยู่ของตัวแปรก่อนที่จะใช้คือการใช้มันโดยตรงในค่าว่าง () หรือ isset () ตัวดำเนินการด้านท้ายที่แนะนำโดย Kevin เป็นตัวเลือกที่ดีที่สุดหากคุณทราบว่าตัวเลือกทั้งหมดในการรวมตัวกันเป็นที่ทราบกันดีว่าเริ่มต้น
$getstuff = $_GET+$_SESSION+array('id'=>null);$id=$getstuff['id'];
)
??
เพื่อให้การดำเนินการทั่วไปนี้กระชับมากขึ้น
ตรวจสอบให้แน่ใจว่าคุณระบุอย่างชัดเจนว่าคุณต้องการให้ฟังก์ชันนี้ทำงานกับบางประเภทอย่างไร PHP มีฟังก์ชันการตรวจสอบประเภทหรือฟังก์ชันที่คล้ายคลึงกันมากมายดังนั้นโปรดตรวจสอบให้แน่ใจว่าคุณทำงานอย่างไร นี่คือตัวอย่างการเปรียบเทียบ is_null () และว่าง ()
$testData = array(
'FALSE' => FALSE
,'0' => 0
,'"0"' => "0"
,'NULL' => NULL
,'array()'=> array()
,'new stdClass()' => new stdClass()
,'$undef' => $undef
);
foreach ( $testData as $key => $var )
{
echo "$key " . (( empty( $var ) ) ? 'is' : 'is not') . " empty<br>";
echo "$key " . (( is_null( $var ) ) ? 'is' : 'is not') . " null<br>";
echo '<hr>';
}
อย่างที่คุณเห็น empty () จะคืนค่าจริงสำหรับสิ่งเหล่านี้ทั้งหมด แต่ is_null () ทำเพียง 2 ตัวเท่านั้น
ฉันขยายตัวในคำตอบที่โพสต์โดยอีธานเคนต์ คำตอบนั้นจะละทิ้งอาร์กิวเมนต์ที่ไม่เป็นค่าว่างที่ประเมินว่าเป็นเท็จเนื่องจากการทำงานภายในของarray_filterซึ่งไม่ใช่สิ่งที่coalesce
ฟังก์ชันโดยทั่วไปทำ ตัวอย่างเช่น:
echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
อ๊ะ
เพื่อเอาชนะสิ่งนี้จำเป็นต้องมีอาร์กิวเมนต์ที่สองและการกำหนดฟังก์ชัน callableฟังก์ชั่นเป็นผู้รับผิดชอบในการบอกarray_filter
หรือไม่ที่จะเพิ่มค่าอาร์เรย์ปัจจุบันไปยังอาร์เรย์ผล:
// "callable"
function not_null($i){
return !is_null($i); // strictly non-null, 'isset' possibly not as much
}
function coalesce(){
// pass callable to array_filter
return array_shift(array_filter(func_get_args(), 'not_null'));
}
คงจะดีไม่น้อยถ้าคุณสามารถผ่านisset
หรือ'isset'
เป็นข้อโต้แย้งที่ 2 ไปarray_filter
ได้ แต่ไม่มีโชคเช่นนั้น
ฉันกำลังใช้สิ่งนี้อยู่ แต่ฉันสงสัยว่ามันไม่สามารถปรับปรุงได้ด้วยคุณสมบัติใหม่บางอย่างใน PHP 5
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return $args[0];
}
PHP 5.3+ พร้อมการปิด:
function coalesce()
{
return array_shift(array_filter(func_get_args(), function ($value) {
return !is_null($value);
}));
}
การสาธิต: https://eval.in/187365
??
สำหรับ PHP 7