1
resposta

Passar Objeto como NULL - Aula 3

Quando faço as chamadas das opções de Resposta no Chain of Responsibility, tem uma que deve passar como parametro NULL.

$respostaPorcento = new RespostaEmPorcento(NULL);

onde eu passo NULL ele deve ser uma classe do tipo interface chamada Resposta que segue a estrutura conforme os exercícios. Porém ele faz uma validação caso o tipo de interface Resposta seja null, ele não faz nada. Como faço para passar NULL nesse caso. Mensagem de erro que estou recebendo: Catchable fatal error: Argument 1 passed to RespostaEmPorcento::__construct() must implement interface IResposta, null given, called in /var/www/html/alura/design-patterns-php-um/conta/RequisicaoPorTipoFormato.php on line 5 and defined in /var/www/html/alura/design-patterns-php-um/conta/RespostaEmPorcento.php on line 5 Segue os códigos:

<?php
  class RequisicaoPorTipoFormato{
    public function requisicaoPorTipoFormato(Requisicao $requisicao, Conta $conta){
      $respostaPorcento = new RespostaEmPorcento(NULL);
      $respostaXML = new RespostaEmXml($respostaPorcento);
      $respostaCSV = new RespostaEmCSV($respostaXML);

      $respostaCSV->responde($requisicao, $conta);
    }
  }
 ?>
<?php
class RespostaEmPorcento implements IResposta {
  private $outraReposta;
  function __construct(IResposta $outraResposta) {
    $this->outraResposta = $outraResposta;
  }
  public function RespostaEmPorcento() {
    $this->outraResposta = null; // nao recebi a proxima!
  }
  public function responde(Requisicao $requisicao, Conta $conta) {
    if($requisicao->getFormato() == Formato::PORCENTO) {
      echo $conta->getTitular() . '%' . $conta->getSaldo();
    } else if(!is_null($outraResposta)){
      $outraResposta->responde($requisicao, $conta);
    } else {
      // não existe próxima na corrente, e ninguém atendeu a requisição!
      // poderíamos não ter feito nada aqui, caso não fosse necessário!
      throw new Exception("Formato de resposta não encontrado");
    }
  }
}
<?php
  interface IResposta{
    public function responde(Requisicao $requisicao, Conta $conta);
    //public function setProximo(Resposta $resposta);
  }
 ?>
1 resposta

Oi Osvaldir, tudo bom?

Você tem duas formas de fazer isso.

Nas versões antes da 7.1 do php, você pode receber um parametro default:

public function seuMetodo(TipoDoParametro seuParametro = null);

Assim, se você não passar nada, ele aceita o null.

Na versão 7.1 surgiu o operador para permissão de null:

public function seuMetodo(?TipoDoParametro seuParametro);

Abraço!