(publicado originalmente por leepowers en su pregunta)
El mensaje de error es confuso por una gran razón:
Los nombres de tipo primitivos no están reservados en PHP
Las siguientes son todas las declaraciones de clase válidas:
class string { }
class int { }
class float { }
class double { }
Mi error fue pensar que el mensaje de error se refería únicamente al tipo primitivo de cadena: la palabra 'instancia' debería haberme dado pausa. Un ejemplo para ilustrar más a fondo:
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')]);
Salida:
$ s1 - cadena primitiva? sí, ¿instancia de cadena? No
$ s2 - cadena primitiva? no - instancia de cadena? si
En PHP es posible que stringa sea a stringexcepto cuando en realidad es a string. Como con cualquier lenguaje que use conversión de tipo implícito, el contexto lo es todo.