isset – nieistniejąca tablica w stringu

Dodany: 16 lipca, 2011 | Kategoria: PHP

Ostatnio przy okazji szukania pewnego błędu w kodzie byłego pracownika w pracy natknęliśmy się na ciekawą rzecz. Mianowicie w pewnej pętli foreach definiowana była zmienna tekstowa, a kawałek dalej sprawdzane było czy jest zdefiniowany w tej zmiennej pewien klucz tablicy – jeśli nie, przeskakujemy do kolejnej iteracji. W pierwszej chwili oczywistym wydało się, że skoro zmienna jest stringiem, a sprawdzamy czy istnieje klucz tablicy, to isset zwróci false i tak naprawdę pętla zawsze skacze do kolejnej iteracji.
Otóż nie. Ponieważ string jest tablicą zawierającą kolejne znaki tekstu, okazało się, że użycie klucza nieliczbowego rzutowane jest na 0, zatem funkcja isset nie sprawdza, czy istnieje klucz, ale czy istnieje pierwszy znak w owym stringu. Zatem:

1
2
3
4
5
6
7
8
$var = 'foobar';

var_dump( $var );
var_dump( isset($var) );
var_dump( $var['test'] );
var_dump( isset($var['test']) );
var_dump( isset($var[0]['test']) );
var_dump( empty($var['test']) );

drukuje

1
2
3
4
5
6
string(6) "foobar"
bool(true)
string(1) "f"
bool(true)
bool(false)
bool(false)

Ach to typowanie dynamiczne w PHP :)

Tagi: , , 1 Komentarz »