Aqui está o meu código:
function phpwtf(string $s) {
echo "$s\n";
}
phpwtf("Type hinting is da bomb");
O que resulta neste erro:
Erro fatal capturável: o argumento 1 passado para phpwtf () deve ser uma instância de string, string fornecida
É mais do que um pouco orwelliano ver o PHP reconhecer e rejeitar o tipo desejado na mesma respiração. Existem cinco luzes, caramba.
Qual é o equivalente ao tipo de dica para strings no PHP? Consideração de bônus à resposta que explica exatamente o que está acontecendo aqui.
php
types
type-hinting
leepowers
fonte
fonte
Respostas:
Antes do PHP 7, as dicas de tipo só podem ser usadas para forçar os tipos de objetos e matrizes. Tipos escalares não podem ser digitados. Nesse caso,
string
é esperado um objeto da classe , mas você está atribuindo um (escalar)string
. A mensagem de erro pode ser engraçada, mas não deve funcionar para começar. Dado o sistema de digitação dinâmico, isso realmente faz algum tipo de sentido pervertido.Você pode apenas "digitar dica" manualmente tipos escalares:
fonte
No manual do PHP :
Então você tem. A mensagem de erro não é realmente útil, mas eu lhe dou isso.
** Edição 2017 **
O PHP7 introduziu mais declarações de tipo de dados de função, e o link mencionado acima foi movido para Argumentos de função: declarações de tipo . A partir dessa página:
O último aviso é realmente significativo para entender o erro "O argumento deve ser do tipo string, string fornecida"; Como na maioria dos casos, somente nomes de classe / interface são permitidos como tipo de argumento, o PHP tenta localizar o nome de uma classe "string", mas não consegue encontrar nenhum porque é um tipo primitivo, portanto falha com esse erro estranho.
fonte
O PHP permite "dicas" onde você fornece uma classe para especificar um objeto. De acordo com o manual do PHP, "As dicas de tipo podem ser apenas do tipo objeto e matriz (desde o PHP 5.1). Dicas de tipo tradicional com int e string não são suportadas." O erro é confuso devido à sua escolha de "string" - coloque "myClass" em seu lugar e o erro será diferente: "O argumento 1 passado para phpwtf () deve ser uma instância de myClass, com a string fornecida"
fonte
Como outros já disseram, a dica de tipo atualmente funciona apenas para tipos de objetos. Mas acho que o erro específico que você acionou pode estar na preparação do próximo tipo de string SplString .
Em teoria, ele se comporta como uma string, mas como é um objeto passaria na verificação do tipo de objeto. Infelizmente ainda não está no PHP 5.3, pode vir na 5.4, portanto não testei isso.
fonte
A partir do PHP 7,0 declarações de tipo permitir tipos escalares, de forma que estes tipos estão agora disponíveis:
self
,array
,callable
,bool
,float
,int
,string
. Os três primeiros estavam disponíveis no PHP 5, mas os quatro últimos são novos no PHP 7. Se você usar qualquer outra coisa (por exemplo,integer
ouboolean
) que será interpretada como um nome de classe.Veja o manual do PHP para mais informações .
fonte
Talvez não seja seguro e bonito, mas se você precisar:
fonte
new string(array(1,2,3))
Eu recebi esse erro ao invocar uma função de um Laravel Controller para um arquivo PHP.
Depois de algumas horas, encontrei o problema: estava usando $ this de dentro de uma função estática.
fonte
Using $this when not in object context
é de fato uma mensagem enigmática.(originalmente publicado por leepowers em sua pergunta)
A mensagem de erro é confusa por um grande motivo:
Nomes de tipos primitivos não são reservados no PHP
A seguir estão todas as declarações de classe válidas:
Meu erro foi pensar que a mensagem de erro se referia apenas ao tipo primitivo de string - a palavra "instância" deveria ter me dado uma pausa. Um exemplo para ilustrar mais:
Resultado:
No PHP, é possível que
string
a seja astring
exceto quando na verdade é astring
. Como em qualquer linguagem que usa conversão implícita de tipos, o contexto é tudo.fonte
Eu acho que typecasting no php no bloco interno, String no PHP não é um objeto como eu sei:
fonte
(string) $s
pode lançar um erro se$s
é um objeto que não pode ser convertido em string (não tem__toString()
método implementado), por isso não é tão fácil como isso