PHP tarjoaa toisinaan viihdettä enemmänkin kuin rahan edestä. Tänään koodaillessa törmäsin kummalliseen ongelmaan, jonka syyksi osoittautui vielä kummallisempi ongelma. Vastaan tuli nimittäin jokseenkin tällainen koodinpätkä:
$type = $this->classes[0];
switch ($type) {
case 'eka':
// ...
break;
case 'toka':
// ...
break;
default:
// ...
break;
}
Eli olion classes-arraysta napattiin ensimmäisen solun sisältö ja sen perusteella switchailtiin, että mitä tehdään. Jostain syystä yhden olion kanssa päädyttiin kaiken järjen mukaan aina tuohon ensimmäiseen caseen. Tutkin asiaa hieman tarkemmin ja huomasin, että kyseisessä oliossa tuo classes-array oli tyhjä ja siten $type sai arvokseen null.
Jostain syystä tuo null ei kuitenkaan käyttäytynyt niin kuin nullin pitäisi käyttäytyä. Kun kokeilin var_dumpata tuon muuttujan, paljastui että sen arvo on null ja se on tyyppiä NULL, gettype($type) antoi saman tuloksen ja is_null($type) palautti true.
Jostain tyystä tuo null käyttäytyi kuitenkin vertailuissa oudosti. Esimerkiksi ($type == 'foo') palautti true ja heti perään ($type == 'bar') palautti myös true. Samalla tavalla tuossa switchissa $type matchas aina siihen caseen, joka sattui olemaan ekana. Sama ongelma toistui, jos jätin kokonaan pois tuon $type-muuttujan alustamisen kyseisessä funktiossa.
En löytänyt asiaan mitään ratkaisua muuten kuin kiertämällä sen enkä myöskään saanut toistettua sitä toisessa paikassa, kun yritin replikoida samanlaisen luokkarakenteen. Ratkaisuksi auttoi esimerkiksi tämä:
if (is_null($type)) {
$type = null;
}
Hämmentävä bugi.