Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Alterando para receber pelo construtor

Bom dia. Fiz a alteração para receber o parâmetro pelo construtor, entretanto, na hora de executar o projeto recebo o seguinte erro: Argument 1 passed to XML::__construct() must implement interface IResposta, integer given, called in C:\wamp64\www\dp\aula3.3\Serialize.php on line 13 and defined in C:\wamp64\www\dp\aula3.3\XML.php on line 11

Segue minha interface, minha classe "Serialize" (que utilizei para definir a corrente), minha classe XML e a index.

<?php
interface IResposta
{
    public function responde(Requisicao $req, Conta $conta);
    //public function setProximo(IResposta $resposta);
}
<?php

require_once ("XML.php");
require_once ("CSV.php");
require_once ("Porcento.php");
require_once ("Invalido.php");

class Serialize
{

    public function responde(Requisicao $req, Conta $conta)
    {
        $chain1 = new XML(2);
        $chain2 = new CSV(3);
        $chain3 = new Porcento(4);
        $chain4 = new Invalido(1);

        /*$chain1->setProximo($chain2);
        $chain2->setProximo($chain3);
        $chain3->setProximo($chain4);*/

        return $chain1->responde($req, $conta);
    }
}
<?php
class XML implements IResposta
{
    private $proximo;

/*    public function setProximo(IResposta $resposta)
    {
        $this->proximo = $resposta;
    }*/

    function __construct(IResposta $resposta)
    {
        $this->proximo = $resposta;
    }

    public function responde(Requisicao $req, Conta $conta)
    {
        if($req->getFormato() == Formato::$XML)
        {
            return "<conta><titular>" .$conta->getTitular(). "</titular><saldo>" .$conta->getSaldo(). "</saldo></titular>";
        }
        else
        {
            return $this->proximo->responde($req, $conta);
        }
    }
}
<?php
function autoLoad($class)
{
    include_once $class.".php";
}

spl_autoload_register("autoLoad");

$conta = new Conta("Samuel", 1000);

$requisicao = new Requisicao(1);

$serialize = new Serialize();

echo $serialize->responde($requisicao, $conta);
2 respostas
solução!

Opa , sue problema é bem simples no seu construc você esta esperando a instancia de IResposta porem quando você da new na class você esta passando um inteiro :)

function __construct(IResposta $resposta)
    {
        $this->proximo = $resposta;
    }

 $chain1 = new XML(2);
        $chain2 = new CSV(3);

o correto seria dessa forma como um decorator

 $chain1 = new XML(new CSV());

Deu certo, vlw. Desculpa a demora em responder.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software