(спочатку опублікував leepowers у своєму запитанні)
Повідомлення про помилку є заплутаним з однієї великої причини:
Імена примітивних типів не зберігаються в PHP
Нижче наведено всі дійсні декларації класу:
class string { }
class int { }
class float { }
class double { }
Моя помилка полягала в тому, що повідомлення про помилку стосувалося виключно строкового примітивного типу - слово "екземпляр" повинно було зробити мені паузу. Приклад для подальшої ілюстрації:
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')]);
Вихід:
$ s1 - примітивний рядок? так - рядковий екземпляр? немає
$ s2 - примітивний рядок? ні - рядковий екземпляр? так
У PHP можливо, щоб a string
був, за string
винятком випадків, коли це насправді a string
. Як і для будь-якої мови, яка використовує неявне перетворення типів, контекст - це все.