Padrões estritos: a declaração de childClass :: customMethod () deve ser compatível com a de parentClass :: customMethod ()
Quais são as possíveis causas desse erro no PHP? Onde posso encontrar informações sobre o que significa ser compatível ?
php
methods
standards-compliance
waiwai933
fonte
fonte
function customMethod( ... )
:) para cada função, poderíamos contar a você o problema específicouse Closure;
dica de tipo, mas eu não tinha adicionado ao topo da minha classe (já que a dica de tipo eraClosure
). Então ... certifique-se de verificar se está faltando dependências como essa.Respostas:
childClass::customMethod()
tem argumentos diferentes ou um nível de acesso diferente (público / privado / protegido) do queparentClass::customMethod()
.fonte
parentClass::customMethod($thing = false)
echildClass::customMethod($thing)
acionaria o erro, porque o método da criança não definiu um valor padrão para o primeiro argumento.&
) nos argumentos também pode desencadear esse erro.Esta mensagem significa que existem certas chamadas de método possíveis que podem falhar em tempo de execução. Suponha que você tenha
O compilador apenas verifica a chamada $ a-> foo () em relação aos requisitos de A :: foo () que não requer parâmetros. $ a pode, entretanto, ser um objeto da classe B que requer um parâmetro e, portanto, a chamada falhará em tempo de execução.
No entanto, isso nunca pode falhar e não aciona o erro
Portanto, nenhum método pode ter mais parâmetros necessários do que seu método pai.
A mesma mensagem também é gerada quando as dicas de tipo não correspondem, mas neste caso o PHP é ainda mais restritivo. Isso dá um erro:
assim como isso:
Isso parece mais restritivo do que precisa ser e suponho que seja devido aos internos.
As diferenças de visibilidade causam um erro diferente, mas pelo mesmo motivo básico. Nenhum método pode ser menos visível do que seu método pai.
fonte
se quiser manter o formulário OOP sem desativar nenhum erro, você também pode:
fonte
func_get_args()
, ou seja, emB
,public function foo($a = null, $b = null, $c = null)
como isso não quebrar o contrato prometido porA
.Apenas para expandir esse erro no contexto de uma interface, se você digitar hinting seus parâmetros de função assim:
interface A
Classe B
Se você esqueceu de incluir a
use
instrução em sua classe de implementação (Classe B), você também receberá esse erro, embora os parâmetros do método sejam idênticos.fonte
Enfrentei esse problema ao tentar estender uma classe existente do GitHub. Vou tentar me explicar, primeiro escrevendo a aula como pensei que deveria ser e depois a aula como está agora.
O que eu pensei
O que eu finalmente fiz
Portanto, parece que esse erro também surge quando você está usando um método que retorna uma classe com namespace e tenta retornar a mesma classe, mas com outro namespace. Felizmente eu encontrei essa solução, mas não entendo totalmente o benefício desse recurso no php 7.2, para mim é normal reescrever métodos de classe existentes conforme necessário, incluindo a redefinição de parâmetros de entrada e / ou até mesmo o comportamento do método.
Uma desvantagem da abordagem anterior é que os IDEs não podiam reconhecer os novos métodos implementados em \ mycompany \ CutreApi \ ClassOfVendor (). Então, por enquanto, irei com essa implementação.
Atualmente concluído
Então, em vez de tentar usar o método "qualquer coisa", escrevi um novo chamado "getWhatever". Na verdade, os dois estão fazendo o mesmo, apenas retornando uma classe, mas com namespaces diferentes, conforme descrevi antes.
Espero que isso possa ajudar alguém.
fonte