Mika Tähtinen

PHP - WTF

maanantaina 23. helmikuuta 2009 klo 18.31

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.

Kommentit

Ei kommentteja.

Jätä uusi kommentti

Mikäli tämä kirjoitus herätti ajatuksia tai oli jollain tavalla hyödyllinen tai mielenkiintoinen niin arvostaisin suuresti, jos jättäisit kommentin! :)

Syötä nimesi!

Virheellinen osoite!

Kirjoita kommentti!

Virhe! Tarkista sanat.

Syötä yllänäkyvät sanat kenttään - tällä varmistetaan, että olet ihka oikea ihminen etkä joku salakavala spammiviestejä lähettävä automaatio. Mikäli et saa sanoista selvää, klikkaa kentän oikealla puolella olevaa päivitysnappia ja saat uudet sanat ihmeteltäviksi.