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

classe não encontrada usando namespace

Olá, estou enfrentando uma dificuldade em meu código onde eu declaro o namespace e quando eu utilizo o use ele não encontra a classe, se necessitar de outra parte do código eu disponibilizo

Teste.php

<?php

require_once 'autoload.php';

use Prj\Teste\Modelo\Cliente;
use Prj\Teste\Modelo\Funcionario;
use Prj\Teste\Modelo\Cpf;



$cliente = new Cliente('Diego Redi', new Cpf('123.456.789-10'), '147258369');
$funcionario = new Funcionario('Diego Redi', new Cpf('987.654.321-01'), 'Desenvolvedor');

var_dump($cliente);

var_dump($funcionario);

Cliente.php

<?php

namespace Prj\Teste\Modelo;

class Cliente extends Pessoa
{
    private $numeroConta;

    public function __construct(string $nome, CPF $cpf, string $numeroConta)
    {
        parent::__construct($nome, $cpf);
        $this->numeroConta = $numeroConta;
    }

    public function getNumeroConta(): string
    {
        return $this->numeroConta;
    }

    public function setNome(string $nome): void
    {
        $this->validaNome($nome);
        $this->nome = $nome;
    }

}

autoload.php

<?php

spl_autoload_register(function (string $nomeCompletoDaClasse)
{
    $caminhoArquivo = str_replace('prj\\teste', 'src', $nomeCompletoDaClasse);
    $caminhoArquivo = str_replace('\\', DIRECTORY_SEPARATOR, $caminhoArquivo);
    $caminhoArquivo .= ".php";

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

Opa diego, boa tarde !

Acredito que seja aqui :

'prj\\teste'

Tente :

'Prj\\Teste'

Opa Paulo, obrigado por responder

Mas eu corrigi esse detalhe no autoload.php e ainda não resolveu o problema

Diego, bom dia !

Consegue postar o codigo no git, para podermos dar uma olhada ?

Opa, é claro Paulo. Aqui está o link para o projeto no GitHub

Projeto

Diego,

Executei seu código exatamente como está e rodou normalmente !

Qual erro está acontecendo quando você executa?

topico_143893> php src/teste.php                                        object(Prj\Teste\Modelo\Cliente)#2 (3) {
  ["numeroConta":"Prj\Teste\Modelo\Cliente":private]=>
  string(9) "147258369"
  ["nome":protected]=>
  string(10) "Diego Redi"
  ["cpf":protected]=>
  object(Prj\Teste\Modelo\Cpf)#3 (1) {
    ["numero":"Prj\Teste\Modelo\Cpf":private]=>
    string(14) "123.456.789-10"
  }
}
object(Prj\Teste\Modelo\Funcionario)#4 (3) {
  ["cargo":"Prj\Teste\Modelo\Funcionario":private]=>
  string(13) "Desenvolvedor"
  ["nome":protected]=>
  string(10) "Diego Redi"
  ["cpf":protected]=>
  object(Prj\Teste\Modelo\Cpf)#5 (1) {
    ["numero":"Prj\Teste\Modelo\Cpf":private]=>
    string(14) "987.654.321-01"
  }
}

Podes perceber que o namespace é o mesmo : Prj\Teste

Ele me apresenta esse erro Paulo.

Fatal error: Uncaught Error: Class "Prj\Teste\Modelo\Cliente" not found in C:\Users\User\Desktop\php\src\teste.php:11
Stack trace:
#0 {main}
  thrown in C:\Users\User\Desktop\php\src\teste.php on line 11

Diego!

Você está executando o código na "pasta" errada.

Por partes :

Ele diz : Class "Prj\Teste\Modelo\Cliente" not found in C:\Users\User\Desktop\php\src\teste.php

Classe cliente não encontrada em ....teste.php

Stack trace:
#0 {main}
  thrown in C:\Users\User\Desktop\php\src\teste.php on line 11

Este é o passo onde a exceção está sendo lançada.

Desta forma você está dentro do arquivo teste.php tentando executar o autoload que está fora do arquivo a partir do arquivo final.

No caso da sua estrutura de pasta :

C:\Users\User\Desktop\php\src\teste.php

Você tem que executar o código a partir de php, dois diretórios acima.

cd \Users\User\Desktop\php 

Ou apartir do diretório teste.php :

cd ../../

Adicionalmente, caso o php esteja instalado nesta pasta php recomendo retirar colocando o php nas variáveis de ambiente do windows, conforme demonstrado nas aulas. Caso seja apenas um diretório "php" para os trabalhos em php recomendo retirar da área de trabalho.

A área de trabalho abre em memoria no momento da inicialização, ou seja quanto mais coisas na área de trabalho mais lento o PC. Além de ser o mais difícil de recuperar em caso de perdas no disco.

Comenta aí se resolveu. :P

Olá Paulo, eu tentei fazer oque você me explicou e mesmo assim não deu certo... Eu acredito que o erro está na nomeação do namespace que eu fiz. porém não sei oque é

solução!

Diego, não acredito ser o namespace. Eu não alterei nada no código e rodou normalmente.

Na hora de executar o código você tem de estar na pasta PHP e executar o comando,abaixo?

php src/teste.php

Se não me engano o mestre executou o arquivo teste.php no php storm diretamente pelo interpretador do php storm.

Mas pela command line é diferente.

Se não conseguir posta no GIST um print da sua tela ao executar o comando, para eu conseguir ver.

Como última forma pode, tentar gravar a tela postar em um repositório (google drive,one drive,etc) e encaminhar o link.

Eu estava rodando pelo command line mesmo Paulo, mas rodando na pasta anterior igual você mandou ai o programa rodou mesmo. Muito Obrigado pela ajuda