Çoğu programlama dilinin birleştirme işlevi vardır ( örneğin , ilk NULL olmayan değeri döndürür ). Ne yazık ki 2009'da PHP bunu yapmıyor.
PHP'nin kendisi bir birleştirme işlevi alana kadar PHP'de bir tane uygulamanın iyi bir yolu ne olabilir?
Çoğu programlama dilinin birleştirme işlevi vardır ( örneğin , ilk NULL olmayan değeri döndürür ). Ne yazık ki 2009'da PHP bunu yapmıyor.
PHP'nin kendisi bir birleştirme işlevi alana kadar PHP'de bir tane uygulamanın iyi bir yolu ne olabilir?
Yanıtlar:
Php 5.3'te bunu yapan yeni bir operatör var: ?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
$input['properties']['range_low'] ?: '?'
array() ?: null ?: false
döndürür , döndürür false
. Operatör gerçekten aklı başında.
PHP 7 gerçek bir birleştirme işleci tanıttı :
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
Önündeki değer ??
yoksa veya null
alındıktan sonraki değer ??
ise.
Bahsedilen ?:
operatöre göre iyileştirme , ??
tanımsız değişkenleri de E_NOTICE
.
($_GET['doesNotExist'] ?? null) ?: 'fallback'
?:
üzerinde ??
, ancak kuyunun olarak boş değerler coalesces olmasıdır ??
yapmaz. JavaScript (yani mantıksal VEYA operatörün davranışına benzer $val || 'default'
), ben bulacağını ?:
daha pratik şekli olarak kaynaştırma sonuçta kendimizi hem taşıma bulmak bizim pratikte ise boş ve boş aynı şekilde (yani içinde $val ?: 'default'
). Ve konuyu daha da zorlamak ve yutmak E_NOTICE
istiyorsanız, bunu bile tartışabilirsiniz:echo @$val ?: 'default';
Google'da "php coalesce" için ilk hit.
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return NULL;
}
Gerçekten beğendim mi?: Operatörü. Ne yazık ki, henüz üretim ortamımda uygulanmadı. Bu yüzden bunun eşdeğerini kullanıyorum:
function coalesce() {
return array_shift(array_filter(func_get_args()));
}
coalesce
ilk boş olmayan argümanı döndürmesi gerekiyor FALSE
. FALSE
Yine de bu fonksiyon , muhtemelen operasyonun aklında olanı (en azından bir coalesce
fonksiyondan istediğim şeyi değil) atacaktır .
Unutulmamalıdır ki, PHP'nin büyük olmayan değişkenleri ve dizi indekslerini ele alması nedeniyle, her türlü birleştirme işlevinin sınırlı kullanımı vardır. Bunu yapabilmeyi çok isterim:
$id = coalesce($_GET['id'], $_SESSION['id'], null);
Ancak bu çoğu durumda PHP'nin E_NOTICE ile hata yapmasına neden olur. Kullanmadan önce bir değişkenin varlığını test etmenin tek güvenli yolu, onu doğrudan boş () veya isset () içinde kullanmaktır. Birleştirmenizdeki tüm seçeneklerin başlatıldığını biliyorsanız, Kevin tarafından önerilen üçlü operatör en iyi seçenektir.
$getstuff = $_GET+$_SESSION+array('id'=>null);$id=$getstuff['id'];
).
??
sunar.
Bu işlevin belirli türlerle tam olarak nasıl çalışmasını istediğinizi belirlediğinizden emin olun. PHP'nin çok çeşitli tür denetimi veya benzer işlevleri vardır, bu nedenle bunların nasıl çalıştığını bildiğinizden emin olun. Bu, is_null () ve empty () arasındaki örnek bir karşılaştırmadır.
$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>';
}
Gördüğünüz gibi empty () bunların tümü için true döndürür, ancak is_null () bunu yalnızca 2 tanesi için yapar.
Ethan Kent tarafından gönderilen cevabı genişletiyorum . Bu yanıt, bir işlevin tipik olarak yaptığı şey olmayan dizi_filtresinin iç işleyişi nedeniyle yanlış olarak değerlendirilen boş olmayan argümanları atacaktır coalesce
. Örneğin:
echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
Hata
Bunun üstesinden gelmek için ikinci bir argüman ve fonksiyon tanımı gereklidir. Çağrılabilir işlevi anlatarak sorumludur array_filter
sonuç dizisine güncel dizi değer katmak için olsun veya olmasın:
// "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'));
}
Basitçe geçebilirseniz isset
veya 'isset'
2. argüman olarak geçerseniz iyi olurdu array_filter
, ama böyle bir şans yok.
PHP 5.3+, kapanışlarla:
function coalesce()
{
return array_shift(array_filter(func_get_args(), function ($value) {
return !is_null($value);
}));
}
Demo: https://eval.in/187365
??