-
06-07-2019 - |
質問
多くのプログラミング言語には合体関数があります(最初のNULL以外の値例)。残念ながら2009年のPHPはサポートしていません。
PHP自体が合体関数を取得するまで、PHPで実装するにはどうすればよいでしょうか?
解決
PHP 5.3には、これを行う新しい演算子?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
他のヒント
PHP 7では、実際の合体演算子:
echo PHP 7では、実際の合体演算子:
<*>
??
の前の値が存在しない場合、または null
の場合、 ??
の後の値が取得されます。
前述の?:
演算子の改善点は、 ??
は、 E_NOTICE
をスローせずに未定義の変数も処理することです。
>GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
??
の前の値が存在しない場合、または null
の場合、 ??
の後の値が取得されます。
前述の?:
演算子の改善点は、 ??
は、 E_NOTICE
をスローせずに未定義の変数も処理することです。
「php合体」の最初のヒット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()));
}
PHPの初期化されていない変数と配列インデックスの処理により、あらゆる種類の合体関数の使用が制限されていることに注意してください。これができるようになりたいです:
$id = coalesce( PHPの初期化されていない変数と配列インデックスの処理により、あらゆる種類の合体関数の使用が制限されていることに注意してください。これができるようになりたいです:
<*>
しかし、これにより、ほとんどの場合、PHPはE_NOTICEでエラーになります。変数を使用する前にその存在をテストする唯一の安全な方法は、empty()またはisset()で直接使用することです。合体のすべてのオプションが初期化されていることがわかっている場合、Kevinによって提案された三項演算子が最適なオプションです。
GET['id'], PHPの初期化されていない変数と配列インデックスの処理により、あらゆる種類の合体関数の使用が制限されていることに注意してください。これができるようになりたいです:
<*>
しかし、これにより、ほとんどの場合、PHPはE_NOTICEでエラーになります。変数を使用する前にその存在をテストする唯一の安全な方法は、empty()またはisset()で直接使用することです。合体のすべてのオプションが初期化されていることがわかっている場合、Kevinによって提案された三項演算子が最適なオプションです。
SESSION['id'], null);
しかし、これにより、ほとんどの場合、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>';
}
ご覧のとおり、empty()はこれらすべてに対してtrueを返しますが、is_null()はそのうちの2つに対してのみtrueを返します。
Ethan Kent が投稿した回答を拡大しています。その答えは、の内部動作によりfalseと評価されるnull以外の引数を破棄します。 array_filter 。これは、 coalesce
関数が通常行うことではありません。例:
echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
エラー
これを克服するには、2番目の引数と関数定義が必要です。 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'
を array_filter
の2番目の引数として単純に渡すことができれば便利ですが、そのような運はありません。
現在これを使用していますが、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);
}));
}