多くのプログラミング言語には、合体関数があります(最初の非NULL値を返す、例)。PHPは、残念ながら2009年には機能しません。
PHP自体が合体関数を取得するまで、PHPに実装する良い方法は何でしょうか?
多くのプログラミング言語には、合体関数があります(最初の非NULL値を返す、例)。PHPは、残念ながら2009年には機能しません。
PHP自体が合体関数を取得するまで、PHPに実装する良い方法は何でしょうか?
回答:
これを行う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の論理OR演算子の動作(つまり$val || 'default'
)と同様に、私たちの実践で最終的に空とnullの両方を同じ方法で処理する(つまり)場合、私?:
はより実用的な合体形式であることがわかります。そして、あなたはさらにとツバメ問題を強制したい場合は、あなたもこれを主張することができます:$val ?: 'default'
E_NOTICE
echo @$val ?: 'default';
グーグルで「php合体」の最初のヒット。
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
は、最初に遭遇したnull以外の引数を返すことになっていますFALSE
。この関数は破棄しFALSE
ますが、おそらくopの意図は破棄されません(少なくとも、coalesce
関数に必要なものはそうではありません)。
PHPが初期化されていない変数と配列インデックスを処理するため、あらゆる種類の合体関数の使用は制限されています。私はこれができるようになりたいです:
$id = coalesce($_GET['id'], $_SESSION['id'], null);
しかし、これにより、ほとんどの場合、PHPはE_NOTICEでエラーになります。変数を使用する前にその存在をテストする唯一の安全な方法は、empty()またはisset()で直接使用することです。合体のすべてのオプションが初期化されていることがわかっている場合は、Kevinによって提案された3項演算子が最適なオプションです。
$getstuff = $_GET+$_SESSION+array('id'=>null);$id=$getstuff['id'];
)。
??
が導入されています。
この関数が特定のタイプでどのように機能するかを正確に識別してください。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>';
}
ご覧のとおり、empty()はこれらすべてに対してtrueを返しますが、is_null()はそれらのうち2つに対してのみtrueを返します。
Ethan Kentが投稿した答えを詳しく説明します。その答えは、array_filterの内部動作のためにfalseと評価されるnull以外の引数を破棄しますが、これはcoalesce
関数が通常行うことではありません。例えば:
echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
おっとっと
これを克服するには、2番目の引数と関数定義が必要です。呼び出し可能な関数が伝える責任がある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'));
}
単ににを2番目の引数として渡すisset
か'isset'
、そのarray_filter
ような運がない場合は、すばらしいでしょう。
PHP 5.3+、クロージャー付き:
function coalesce()
{
return array_shift(array_filter(func_get_args(), function ($value) {
return !is_null($value);
}));
}
デモ:https : //eval.in/187365
??