(pierwotnie opublikowane przez leepowers w swoim pytaniu)
Komunikat o błędzie jest mylący z jednego ważnego powodu:
Nazwy typów pierwotnych nie są zastrzeżone w PHP
Poniżej przedstawiono wszystkie prawidłowe deklaracje klas:
class string { }
class int { }
class float { }
class double { }
Mój błąd polegał na tym, że komunikat o błędzie dotyczył wyłącznie pierwotnego typu łańcucha - słowo „instancja” powinno mnie zatrzymać. Przykład ilustrujący dalej:
class string { }
$n = 1234;
$s1 = (string)$n;
$s2 = new string();
$a = array('no', 'yes');
printf("\$s1 - primitive string? %s - string instance? %s\n",
$a[is_string($s1)], $a[is_a($s1, 'string')]);
printf("\$s2 - primitive string? %s - string instance? %s\n",
$a[is_string($s2)], $a[is_a($s2, 'string')]);
Wynik:
$ s1 - prymitywny ciąg? tak - instancja ciągu? Nie
$ s2 - prymitywny ciąg? instancja typu no-string? tak
W PHP jest możliwe, string
że jest string
wyjątkiem, chyba że tak naprawdę jest string
. Podobnie jak w przypadku każdego języka korzystającego z niejawnej konwersji typu, kontekst jest wszystkim.