mik*_*ikl 130 php optimization null-coalescing-operator
许多编程语言都有一个coalesce函数(返回第一个非NULL值,例如).遗憾的是,PHP在2009年没有.
在PHP本身获得合并函数之前,用PHP实现一个好方法是什么?
Kev*_*vin 191
php 5.3中有一个新的运算符,它执行此操作: ?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
Run Code Online (Sandbox Code Playgroud)
资料来源:http://www.php.net/ChangeLog-5.php#5.3.0
flo*_*ori 65
PHP 7引入了一个真正的合并运算符:
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
Run Code Online (Sandbox Code Playgroud)
如果之前的值??
不存在或者是之后null
的值??
.
对提到的?:
运算符的改进是,??
它还处理未定义的变量而不抛出E_NOTICE
.
Wil*_*ver 29
在谷歌上首次出现"php coalesce".
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
http://drupial.com/content/php-coalesce
小智 18
我真的很喜欢?:运算符.不幸的是,它还没有在我的生产环境中实现.所以我使用相当于这个:
function coalesce() {
return array_shift(array_filter(func_get_args()));
}
Run Code Online (Sandbox Code Playgroud)
值得注意的是,由于PHP处理未经初始化的变量和数组索引,任何类型的合并函数的用途都是有限的.我希望能够做到这一点:
$id = coalesce($_GET['id'], $_SESSION['id'], null);
Run Code Online (Sandbox Code Playgroud)
但在大多数情况下,这会导致PHP出现E_NOTICE错误.在使用变量之前测试变量存在的唯一安全方法是直接在empty()或isset()中使用它.如果您知道合并中的所有选项都已初始化,那么Kevin建议的三元运算符是最佳选择.
确保您确切地确定了此功能如何与某些类型一起使用.PHP具有各种类型检查或类似功能,因此请确保您了解它们的工作原理.这是is_null()和empty()的示例比较
$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>';
}
Run Code Online (Sandbox Code Playgroud)
如您所见,empty()为所有这些返回true,但is_null()仅对其中2个执行此操作.