Aquí está mi código:
function phpwtf(string $s) {
echo "$s\n";
}
phpwtf("Type hinting is da bomb");
Lo que resulta en este error:
Error fatal detectable: el argumento 1 pasado a phpwtf () debe ser una instancia de cadena, cadena dada
Es más que un poco Orwelliano ver que PHP reconoce y rechaza el tipo deseado al mismo tiempo. Hay cinco luces, maldita sea.
¿Cuál es el equivalente de las sugerencias de tipo para cadenas en PHP? Consideración adicional a la respuesta que explica exactamente lo que está sucediendo aquí.
php
types
type-hinting
potencias de sotavento
fuente
fuente
Respuestas:
Antes de PHP 7, las sugerencias de tipo solo se pueden usar para forzar los tipos de objetos y matrices. Los tipos escalares no son de tipo imprimible. En este caso,
string
se espera un objeto de la clase , pero le está dando un (escalar)string
. El mensaje de error puede ser divertido, pero para empezar no se supone que funcione. Dado el sistema de tipeo dinámico, esto realmente tiene algún tipo de sentido pervertido.Solo puede "escalar manualmente " tipos escalares:
fuente
Del manual de PHP :
Entonces lo tienes. El mensaje de error no es realmente útil, aunque te doy eso.
** Edición 2017 **
PHP7 introdujo más declaraciones de tipo de datos de función, y el enlace antes mencionado se ha movido a Argumentos de función: Declaraciones de tipo . Desde esa página:
La última advertencia es realmente significativa para comprender el error "Argumento debe de tipo cadena, cadena dada"; como la mayoría de los nombres de clase / interfaz están permitidos como tipo de argumento, PHP intenta localizar una "cadena" de nombre de clase, pero no puede encontrar ninguna porque es un tipo primitivo, por lo tanto falla con este incómodo error.
fuente
PHP permite "insinuar" dónde proporciona una clase para especificar un objeto. De acuerdo con el manual de PHP, "Las Sugerencias de tipo solo pueden ser del tipo objeto y matriz (desde PHP 5.1). La sugerencia de tipo tradicional con int y string no es compatible". El error es confuso debido a su elección de "cadena": coloque "myClass" en su lugar y el error se leerá de manera diferente: "El argumento 1 pasado a phpwtf () debe ser una instancia de myClass, cadena dada"
fuente
Como ya han dicho otros, la sugerencia de tipos actualmente solo funciona para tipos de objetos. Pero creo que el error particular que ha activado podría estar en preparación del próximo tipo de cadena SplString .
En teoría, se comporta como una cadena, pero como es un objeto pasaría la verificación del tipo de objeto. Desafortunadamente, aún no está en PHP 5.3, podría venir en 5.4, así que no lo he probado.
fuente
A partir de PHP 7.0 declaraciones de tipo permiten tipos escalares, por lo que estos tipos están ahora disponibles:
self
,array
,callable
,bool
,float
,int
,string
. Los primeros tres estaban disponibles en PHP 5, pero los últimos cuatro son nuevos en PHP 7. Si usa algo más (por ejemplo,integer
oboolean
), se interpretará como un nombre de clase.Consulte el manual de PHP para más información .
fuente
Tal vez no sea seguro y bonito, pero si debes:
fuente
new string(array(1,2,3))
Recibí este error al invocar una función desde un controlador Laravel a un archivo PHP.
Después de un par de horas, encontré el problema: estaba usando $ this desde una función estática.
fuente
Using $this when not in object context
es de hecho un mensaje críptico.(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:
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:
Salida:
En PHP es posible que
string
a sea astring
excepto cuando en realidad es astring
. Como con cualquier lenguaje que use conversión de tipo implícito, el contexto lo es todo.fuente
Creo que la conversión de texto en php en el bloque interior, String en PHP no es un objeto, como sé:
fuente
(string) $s
puede arrojar un error si$s
es un objeto que no se puede convertir en cadena (no tiene un__toString()
método implementado), por lo que no es tan fácil como eso