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

Não está encontrando a classe na execução

fiz um teste.php para testar se tudo estava funcionando e acontece o seguinte erro:

Fatal error: Uncaught Error: Class 'Alura\Banco\Modelo\Conta\ContaPoupanca' not found in C:\Users\Julio Varella\Documents\PHP\OO-PHP\src\teste.php:8 Stack trace:

#0 {main} thrown in C:\Users\Julio Varella\Documents\PHP\OO-PHP\src\teste.php on line 8

Esse é meu teste.php:

<?php

use Alura\Banco\Modelo\Conta\{Conta, ContaPoupanca, Titular};
use Alura\Banco\Modelo\{Endereco};

require_once 'autoload.php';

$conta = new ContaPoupanca(
    new Titular(
        '411.059.294-41',
        'Julio Varella',
        new Endereco(
            'Ourinhos',
            'Vila S',
            'NL',
            'casa 11'
        )
    )
);

$conta->depositar(1000);
$conta->saca(200);

echo $conta->getSaldo();

essa é minha classe ContaPoupanca:

<?php

namespace Alura\Banco\Modelo\Conta;

class ContaPoupanca extends Conta
{
    public function percentualTarifa(): float
    {
        return 0.03;
    }
}

Essa é minha classe Conta:

<?php

namespace Alura\Banco\Modelo\Conta;

abstract class Conta

{
    protected Titular $titular;
    protected float $saldo;
    protected static $numeroDeContas = 0;

    public function __construct(Titular $titular)
    {
        $this->titular = $titular;
        $this->saldo = 0;
        self::$numeroDeContas++;
    }

    public function saca(float $valorASacar): void
    {
        $tarifaSaque = $valorASacar * $this->percentualTarifa();
        $valorSaque = $valorASacar + $tarifaSaque;
        if ($valorSaque > $this->saldo) {
            echo "Saldo indisponível";
            return;
        }

        $this->saldo -= $valorSaque;
    }

    public function depositar($valorADepositar): void
    {
        if($valorADepositar <= 0) {
            echo "Deposite um valor positivo.";
            return;
        }
        $this->saldo += $valorADepositar;
    }

    public function transferir($valorATransferir, Conta $contaDestino): void
    {
        if ($valorATransferir > $this->saldo){
            echo "Saldo insuficiente.";
            return;
        }

        $this->saca($valorATransferir);
        $contaDestino->depositar($valorATransferir);
    }

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

    abstract public function percentualTarifa(): float;
}

e assim está a organização das pastas: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

4 respostas

Olá, Júlio, Tudo bom?

O erro no código é devido a sua class ContaPoupanca não ser encontrada no momento em que instancia o objeto usando new ContaPoupanca. Normalmente, essa responsabilidade fica no arquivo autoload.php, mais especificamente na função spl_autoload_register. Poderia compartilhá-lo?

Abraços

Opa, Felipe, beleza? Aqui está:

<?php

spl_autoload_register(function (string $nomeCompletoDaClasse){
    $caminhoArquivo = str_replace('Alura\\Banco', 'src', $nomeCompletoDaClasse);
    $caminhoArquivo = str_replace('\\', DIRECTORY_SEPARATOR, $caminhoArquivo);
    $caminhoArquivo .= '.php';

    if(file_exists($caminhoArquivo)) {
        require_once $caminhoArquivo;
    }
});

a execução chega até o if, mas file_exists retorna false, e na verificação do if, $caminhoArquivo = src\Modelo\Conta\ContaPoupanca.php

solução!

Encontrei o erro: os arquivos autoload.php e teste.php estavam dentro de src, e não na mesma pasta como deveria ser.

Bom dia, Júlio,

Entendi. Bom, seus arquivos autoload.php e teste.php estão dentro da pasta src e as classes encontram-se na pasta Modelo e subpastas, correto?

Assim, o seu código está buscando uma pasta src dentro de src que não existe, por isso retorna false.

Troque a primeira linha da função, assim:

<?php

spl_autoload_register(function (string $nomeCompletoDaClasse){
    $caminhoArquivo = str_replace('Alura\\Banco\\', '', $nomeCompletoDaClasse);
    $caminhoArquivo = str_replace('\\', DIRECTORY_SEPARATOR, $caminhoArquivo);
    $caminhoArquivo .= '.php';

    if(file_exists($caminhoArquivo)) {
        require_once $caminhoArquivo;
    }
});

Veja se funciona. Basicamente, estamos removendo o início do namespace e reaproveitando o restante para navegar nas pastas.

Dica: quando um arquivo realiza um require e o arquivo requerido também, o caminho será em relação ao primeiro. Para evitarmos essas confusões, usamos a constante __DIR__ que retorna o diretório do arquivo que contém aquele script.