Bazı birim testleri çalıştırıyordum ve kullanmakta olduğum anahtar ifadesiyle beklenmedik bir davranışla karşılaştım. Aşağıdaki koşulu izole ettim.Beklenmeyen PHP Anahtarı Davranışı
test('a') => 'first'
test('b') => 'first'
test('c') => 'second'
test('d') => 'third'
test('0') => 'third'
test('1') => 'third'
test('true') => 'third'
test('false') => 'third'
Bu güzel kendini apaçık haklı: Burada
function test($val)
{
switch($val)
{
case 'a':
case 'b':
return 'first';
break;
case 'c':
return 'second';
break;
default:
return 'third';
}
}
testlerin ilk yuvarlak? Tamam şimdi şunu kontrol et:
test(0) => 'first' // expected 'third'
test(1) => 'third'
test(true) => 'first' // expected 'third'
test(false) => 'third'
test(null) => 'third'
test([]) => 'third'
0 ile doğru olan garip sonuçlarda ne var? 1/true ve 0/false aynı değerleri döndürdüğünde yazıyı yazmaya çalışırım. Ama yapmıyorlar!
Değeri bir (dize) olarak değiştirirsem, anahtar istenen şekilde çalışır. alışkanlık anahtarı "iş" Ben kullanmadan amaçladığı gibi "(string)"
birisi bu neden oluyor açıklayabilir neden
test((string) 0) => 'third'
test((string) 1) => 'third'
test((string) true) => 'third'
test((string) false) => 'third'
anlamıyorum?
Anahtar/kasa gevşek bir karşılaştırma yapıldığını unutmayın. http://php.net/manual/en/types.comparisons.php#types.comparisions-loose –
Ve evet, '0', 'a', gevşek karşılaştırmada eşit iken, '1' değil. https://eval.in/412018 – Jessica
0 == 'a' .... Bu yüzden PHP olur. – GolezTrol