(первоначально опубликовано 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 возможно string
быть a, string
за исключением случаев, когда это на самом деле string
. Как и в любом языке, который использует неявное преобразование типов, контекст - это все.