Pergunta

PHP, como todos sabemos é muito vagamente digitado. A linguagem não requer que você especifique qualquer tipo de tipo para parâmetros de função ou variáveis ??de classe. Isso pode ser um poderoso recurso.

Às vezes, porém, ele pode fazer a depuração do script de uma experiência dolorosa. Por exemplo, passando um tipo de objeto em um método que espera um tipo diferente de objeto pode produzir mensagens de erro reclamando que uma variável determinada / método não existe para o objeto passado. Estas situações são principalmente aborrecimentos. problemas mais onerosos são quando você inicializar um objeto com um objeto da classe errada, e que "objeto errado" não será usado até mais tarde na execução do script. Neste caso, você acaba recebendo um erro muito mais tarde do que quando você passou o argumento original.

Em vez de reclamar que o que eu passei não tem um método específico ou variável, ou esperar até muito mais tarde na execução do script para o meu passado no objeto a ser usado, Eu seria muito melhor ter um erro mensagem, exatamente onde eu especificar um objeto do tipo errado, reclamando sobre o tipo do objeto sendo incorreta ou incompatível.

Como você lida com essas situações em seu código? Como você detectar tipos incompatíveis? Como posso introduzir algum tipo de verificação em meus scripts para que eu possa obter mais facilmente entendida mensagens de erro?

Além disso, como você pode fazer tudo isso enquanto respondendo por herança em PHP? Considere o seguinte:

<?php
class InterfaceClass
{
#...
}

class UsesInterfaceClass
{
   function SetObject(&$obj) 
   {
       // What do I put here to make sure that $obj either
       // is of type InterfaceObject or inherits from it       

   }
}
?>

Em seguida, um usuário deste implementos código da interface com a sua própria classe concreta:

<?php

class ConcreteClass extends InterfaceClass
{
}



?>

Eu quero casos ConcreteClass, e todos os futuros, objetos definidos pelo usuário desconhecidos, para também ser aceitável para setObject. Como você faria isso permitida em verificar para o tipo correto?

Foi útil?

Solução

Na verdade, para classes que você pode fornecer a indicação de tipo em PHP (5 +).

 <?php
 class UsesBaseClass
 {
      function SetObject(InterfaceObject $obj) 
      {
      }
 }
 ?>

Isso também irá funcionar correctamente com a herança como seria de esperar que ele.

Como um aparte, não coloque a palavra 'objeto' em seus nomes de classe ...

Outras dicas

como um complemento para a resposta de Eran Galperin você também pode usar o tipo insinuando aos parâmetros de força para ser matrizes -. Não apenas objetos de uma certa classe

<?php
class MyCoolClass {
   public function passMeAnArray(array $array = array()) {
      // do something with the array  
   }  
 }  
 ?>

Como você pode ver, você pode digitar indício de que o método ::passMeAnArray() espera um array, bem como fornecer um valor padrão no caso do método é chamado w / o qualquer parâmetro.

Para tipos primitivos que você poderia também usar os is_ * funções:

public function Add($a, $b)
{
  if (!is_int($a) || !is_int($b))
    throw new InvalidArgumentException();
  return $a + $b;
}

Você vê, existem várias respostas sobre indicação de tipo. Esta é a solução técnica. Mas você também deve se certificar de que todo o projeto é sensível e intuitiva. Isso fará com que os problemas de tipo e erros mais raro.

Lembre-se que mesmo estas falhas tipo será lançada em tempo de execução . Certifique-se de que você tem testes para o código.

Mesmo no caso que você descreve, seu script irá falhar, queixando-se não há nenhum método / atributo X no objeto Y para que você saiba onde vem isso.

De qualquer forma, eu acho que sempre tentar impedir cresceu programadores para passar o objeto errado para um método não é um investimento bom tempo: você pode gastá-lo em documentar e treinar em vez

.

digitação Pato e colegas cuidado é o que você precisa, os cheques não adicionais que vão fazer você aplicativo mais rígida.

Mas pode ser um ponto de vista Pythonista ...

Eran Galperin resposta 's é o método preferido para assegurar o objeto que você está usando é do tipo correto.

Também digno de nota é a InstanceOf operador - é útil para quando você quiser verificar que um objeto é um dos vários tipos.

Você pode definir a configuração ini error_reporting no seu arquivo php.ini ou usar a função error_reporting para defini-lo em tempo de execução

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top