Viele Programmiersprachen haben eine coalesce Funktion (kehrt der erste Nicht-NULL - Wert, beispielsweise ). PHP im Jahr 2009 leider nicht.
Was wäre ein guter Weg, um eine in PHP zu implementieren, bis PHP selbst eine Koaleszenzfunktion erhält?
Viele Programmiersprachen haben eine coalesce Funktion (kehrt der erste Nicht-NULL - Wert, beispielsweise ). PHP im Jahr 2009 leider nicht.
Was wäre ein guter Weg, um eine in PHP zu implementieren, bis PHP selbst eine Koaleszenzfunktion erhält?
Antworten:
Es gibt einen neuen Operator in PHP 5.3, der dies tut: ?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
$input['properties']['range_low'] ?: '?'
array() ?: null ?: false
zurück false
. Der Bediener ist in der Tat gesund.
PHP 7 führte einen echten Koaleszenzoperator ein :
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
Wenn der Wert vor dem ??
nicht existiert oder null
der Wert nach dem ??
ist.
Die Verbesserung gegenüber dem genannten ?:
Operator besteht darin, dass der ??
auch undefinierte Variablen behandelt, ohne eine zu werfen E_NOTICE
.
($_GET['doesNotExist'] ?? null) ?: 'fallback'
?:
over ??
ist jedoch, dass auch leere Werte zusammengeführt werden, was ??
nicht der Fall ist. Ähnlich wie das Verhalten des logischen ODER-Operators in JavaScript (dh $val || 'default'
) würde ?:
ich eine praktischere Form der Verschmelzung finden, wenn wir in unserer Praxis letztendlich feststellen, dass wir sowohl leer als auch null auf die gleiche Weise behandeln (dh $val ?: 'default'
). Und wenn Sie das Problem weiter forcieren und schlucken möchten E_NOTICE
, können Sie dies sogar argumentieren:echo @$val ?: 'default';
Erster Treffer für "PHP Coalesce" bei Google.
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return NULL;
}
Ich mag den ?: Operator wirklich. Leider ist es in meiner Produktionsumgebung noch nicht implementiert. Also benutze ich das Äquivalent dazu:
function coalesce() {
return array_shift(array_filter(func_get_args()));
}
coalesce
soll das erste Nicht-Null- Argument zurückgeben, auf das es stößt, einschließlich FALSE
. Diese Funktion wird jedoch verworfen FALSE
, wahrscheinlich nicht das, was op im Sinn hat (zumindest nicht das, was ich von einer coalesce
Funktion erwarten würde ).
Es ist erwähnenswert, dass aufgrund der Behandlung nicht initialisierter Variablen und Array-Indizes durch PHP jede Art von Koaleszenzfunktion von begrenztem Nutzen ist. Ich würde gerne dazu in der Lage sein:
$id = coalesce($_GET['id'], $_SESSION['id'], null);
In den meisten Fällen führt dies jedoch zu einem PHP-Fehler mit einem E_NOTICE. Der einzig sichere Weg, die Existenz einer Variablen vor ihrer Verwendung zu testen, besteht darin, sie direkt in empty () oder isset () zu verwenden. Der von Kevin vorgeschlagene ternäre Operator ist die beste Option, wenn Sie wissen, dass alle Optionen in Ihrer Koaleszenz als initialisiert bekannt sind.
$getstuff = $_GET+$_SESSION+array('id'=>null);$id=$getstuff['id'];
).
??
, um diese sehr häufige Operation präziser zu gestalten.
Stellen Sie sicher, dass Sie genau angeben, wie diese Funktion mit bestimmten Typen funktionieren soll. PHP verfügt über eine Vielzahl von Typprüfungen oder ähnlichen Funktionen. Stellen Sie daher sicher, dass Sie wissen, wie diese funktionieren. Dies ist ein Beispielvergleich von is_null () und 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>';
}
Wie Sie sehen können, gibt empty () für alle diese Werte true zurück, is_null () jedoch nur für zwei von ihnen.
Ich erweitere die Antwort von Ethan Kent . Diese Antwort verwirft Nicht-Null-Argumente, die aufgrund der inneren Funktionsweise von array_filter als falsch ausgewertet werden. Dies ist coalesce
normalerweise nicht die Funktion einer Funktion. Beispielsweise:
echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
Hoppla
Um dies zu überwinden, sind ein zweites Argument und eine Funktionsdefinition erforderlich. Die aufrufbare Funktion gibt an, array_filter
ob der aktuelle Array-Wert zum Ergebnis-Array hinzugefügt werden soll oder nicht:
// "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'));
}
Es wäre schön, wenn Sie einfach weitergeben könnten isset
oder 'isset'
als 2. Argument array_filter
, aber kein solches Glück.
PHP 5.3+, mit Verschlüssen:
function coalesce()
{
return array_shift(array_filter(func_get_args(), function ($value) {
return !is_null($value);
}));
}
Demo: https://eval.in/187365
??
für PHP 7.