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

Dúvidas sobre o Curso de PHP SOLID 5 aula

Tudo funciona corretamente mais não consigo exibir as informações no index.php da esse erro

Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR) in C:\xampp\htdocs\php\orientacao-a-objetos-avancada-e-principios-solid-php\Aula-5\index.php on line 15

Códigos do curso 05 Herança e Composição

ContaComum.php

class ContaComum {

    private $manipulador;

    public function __construct() {
        $this->manipulador = new ManipuladorDeSaldo();
    }

    public function sacar($valor) {
        // regra de negocio
        $this->manipulador->saca($valor);
    }

    public function deposita($valor) {
        $this->manipulador->deposita($valor);
    }

    public function getSaldo() {
        return $this->manipulador->getSaldo();
    }

    public function rende() {
        $this->manipulador->rende(1.1);
    }
}

ContaEstudante.php

class ContaEstudante {

    private $manipulador;
    private $milhas;

    public function __construct() {
        $this->manipulador = new ManipuladorDeSaldo();
    }

    public function desposita($valor) {
        $this->manipulador->desposita($valor);
        $this->milhas += $valor;
    }

    public function getMilhas() { 
        return $this->milhas;
    }

}

ManipuladorDeSaldo.php

class ManipuladorDeSaldo {

    private $saldo;

    public function __construct() {
        $this->saldo = 0;
    }

    public function sacar($valor) {
        if($valor > 0 && $valor <= $this->saldo) {
            $this->saldo -=$valor;
        }else {
            throw new Exception("Valor inválido para o saque");
        }
    }

    public function deposita($valor) {
        $this->saldo += $valor;
    }

    public function getSaldo() {
        return $this->saldo;
    }

    public function rende($taxa) {
        $this->saldo *= $taxa;
    }
}

ProcessadorDeInvestimentos.php

class ProcessadorDeInvestimentos {

    public function processa() {

        $contas = $this->contasDoBanco();
        foreach($contas as $conta) {
            $conta->rende();
        }
    }

    private function contasDoBanco() {
        $contas = array();
        $contas[] = $this->contaComumCom(100);
        $contas[] = $this->contaEstudanteCom(200);
        $contas[] = $this->contaComumCom(300);
        return $contas;
    }

    private function contaComumCom($valor) {
        $conta = new ContaComun();
        $conta->desposita($valor);
        return $conta;
    }

    private function contaEstudanteCom($valor){
        $conta = new ContaEstudante();
        $conta->desposita($valor);
        return $conta;
    }
}

Index.php

function carregaClass($classe) {
    require $classe.".php";
}

spl_autoload_register("carregaClass");

$contas = array();
$contas[] = new ContaComum(550);
$contas[] = new ContaEstudante(150);

$manipulador = new ManipuladorDeSaldo();

$manipulador = manipulador->getSaldo($contas);

echo $contas;

Aguardo resposta

4 respostas

Olá Cezar,

Está faltando o $ no index.php linha 15

O correto é assim:

$manipulador = $manipulador->getSaldo($contas);

Olá boa tarde mesmo corrigido a linha 15 continua com o erro. Retorna um Array ao invés do getSaldo que coloquei ai o 550 e 150 retorna Notice: Array to string conversion in C:\xampp\htdocs\php\orientacao-a-objetos-avancada-e-principios-solid-php\Aula-5\index.php on line 17 Array

Aguardo resposta.

solução!

Esse já é um problema diferente, você está tentando escrever um array como texto.

Para ver o valor de cada conta você tem que acessar cada uma dentro do array:

// Primeira conta
echo $contas[0]->getSaldo();

// Segunda conta
echo $contas[1]->getSaldo();

No código também está sendo utilizando o ManipuladorDeSaldo diretamente, mas não precisa fazer isso, quando uma conta é criada já é definido um ManipuladorDeSaldo para ela, e o manipulador é utilizado apenas internamente pela conta. Então você pode remover as linhas abaixo:

$manipulador = new ManipuladorDeSaldo();
$manipulador = manipulador->getSaldo($contas);

Outro detalhe é na criação das contas:

$contas[] = new ContaComum(550);
$contas[] = new ContaEstudante(150);

Está sendo passado o valor 550 para uma e 150 para a outra, mas esses valores não são recebidos nem utilizados no construtor da conta, então as duas contas estão sendo criadas com o saldo 0.

Para mudar isso você pode mudar o construtor para definir o saldo na criação, ou fazer um depósito após a criação da conta:

// Opção 1
// Construtor que recebe e inicializa o saldo
// Essa alteração deve ser feita em ContaComum e ContaEstudante
public function __construct($saldo = 0)
{
    $this->manipulador = new ManipuladorDeSaldo();
    $this->manipulador->deposita($saldo);
}

// Opção 2
// Ou então você apenas deposita o valor inicial após criar as contas
$contas[] = new ContaComum();
$contas[] = new ContaEstudante();
$contas[0]->deposita(550);
$contas[1]->deposita(150);

Lembrando também que em ContaEstudante, deposita está escrito desposita duas vezes, e ainda nessa classe está faltando o método getSaldo.

Obrigado problema resolvido

Abs