3
respostas

No caso de uma transferência, como eu faria pra passar o cpf da segunda conta?

Estou querendo passar o CPF da segunda conta em vez da variável, como faço? Nessa função eu consegui debitar de uma e adicionar na outra conta mas não consegui pensar em como utilizar o cpf. Poderia me ajudar?

 public function transferir($cpf, float $valor)
    {
        if($valor > 0 && $this->saldo >= $valor){
            $this->saldo -= $valor;
            $cpf->saldo += $valor;
            echo 'Transferência realizada com sucesso!'. $this->saldo."<br>";
            echo 'Saldo da segunda conta:'.$cpf->saldo;
        }else{
            echo 'O valor informado está incorreto';
        }
    }
 <?php
       include 'src/Conta.php';

        $primeiraConta = new Conta();
        $primeiraConta -> cpfTitular = '123.456.789-10';
        $primeiraConta -> nomeTitular = 'Primeira Pessoa';
        $primeiraConta -> saldo = 1500;
        $segundaConta = new Conta();
        $segundaConta -> cpfTitular = '123.456.789-11';
        $segundaConta -> nomeTitular = 'Segunda Pessoa';
        $segundaConta -> saldo = 1500;

        //$primeiraConta ->sacar(1000);
        //$primeiraConta ->depositar(2000);
        $primeiraConta ->transferir($segundaConta, 500)

        ?>

Mensagem no final da execução: Transferência realizada com sucesso! O seu novo saldo é: 1000 Saldo da segunda conta:2000

3 respostas

Vamos por partes, Caio.

Estou querendo passar o CPF da segunda conta em vez da variável Acredito que você quis dizer "ao invés da CONTA", e não da "variável", certo?

Agora...

public function transferir($cpf, float $valor)

Qual o tipo desse parâmetro $cpf? Sem você informar, o código fica menos inteligível. $cpf pode ser qualquer coisa aí.

Supondo que $cpf seja do tipo Cpf, o tipo Cpf possui saldo? Não, né!? Só o tipo Conta. Então você precisa passar uma Conta por parâmetro.

Agora olhando seu código, embora o nome do seu parâmetro seja $cpf, você está passando uma Conta por parâmetro. Então o primeiro passo é corrigir esse nome que está bastante confuso.

Agora se por algum motivo você quiser acessar o CPF da conta de destino da transferência, basta acessar a propriedade cpf dela. :-)

Vinicius, acredito que o que ele quer é passar o cpf como parâmetro para localizar o objeto. Não sou muito experiente mas fiz um codigo aqui que deu certo. Vale ressaltar que na "vida real" tudo seria armazenado em banco de dados e isso "facilitaria" esse tipo de requisição, eu usei array apenas como objeto de estudo. Crianças: não façam isso em casa. Vamos lá:

Minha classe Conta ficou assim:

class Conta
{
    private string $nomeTitular;
    private string $cpfTitular;
    private float $saldo = 0;
    private static $listaContas = [];

    public function __construct($nomeTitular, $cpfTitular)
    {
        $this->nomeTitular = $nomeTitular;
        $this->cpfTitular = $cpfTitular;

        array_push(self::$listaContas, $this); //Aqui eu armazeno o objeto
    }

    public function depositar(float $valorADepositar)
    {
        if ($valorADepositar <= 0){
            echo "Valor menor que zero.";
            return;
        }

        $this->saldo = $valorADepositar;
    }

    public function sacar(float $valorASacar)
    {
        if ($valorASacar > $this->saldo){
            echo "Saldo insuficiente";
            return;
        }

        $this->saldo -= $valorASacar;
        return true;
    }

    public function transferir(string $cpf, float $valorATransferir)
    {
        foreach (self::$listaContas as $contaATransferir){
            if ($contaATransferir->cpfTitular == $cpf){
                if ($this->sacar($valorATransferir)){
                    $contaATransferir->depositar($valorATransferir);
                }
            }
        }
    }
}

No arquivo de execução:

       $conta1 = new Conta("ABC", "1234");
        $conta2 = new Conta("DEF", "4567");
        $conta1->depositar(1000);
        $conta1->transferir("4567", 500);

Estou engatinhando no PHP mas acredito que esse é o caminho: a resolução de problemas. Qualquer dica de alteração me diz aí que eu edito, valeu!

Solução interessante, Emerson. No mundo real isso não se aplicaria, até porque dessa forma a classe Conta além de representar uma conta, também cuidaria de sua persistência.

Mas para atingir o objetivo, que como você mesmo salientou, não se aplicaria à vida real, funciona bem sua sugestão.

Inclusive parabéns por pensar nela. Muito bom mesmo!