3
respostas

Se precisar fazer validações do tipo (class_exists('Diretor')) como ficaria?

Teria que colocar o namespace todo dentro da função class_exists ? class_exists('classes/funcionario/Diretor') ??

3 respostas

Ewerton, boa tarde!

Caso você entre na documentação do PHP (https://www.php.net/manual/pt_BR/function.class-exists.php) verá que essa função em especifica usa a o autoload como segundo parâmetro, isso pois ele verifica a existência da classe através dele.

Ao usar o class exists, nós passamos o namespace da classe justamente, para o autoload encontra-lá

Aqui vai um exemplo:

echo class_exists('Controller\Refrigerator');

Espero ter ajudado e bons estudos!

Eu fiz meu autoload de um jeito um pouco diferente, talvez não seguindo o PSR-4 mas funcionou como o jeito convencional exceto quando se tem duas classes com o mesmo nome, ainda nao implementei algo para tratar caso isso ocorra. Ai no meu caso o autoload ficou assim :

/**
 * Função para fazer o auto load das Classes
 * @var $folders - Nome das pastas onde se encontram as Classes ('Testes'.DIRECTORY_SEPARATOR.'Testando' (Se for pasta com subpasta))
 * 
 */
spl_autoload_register(function ($nomeClasse){

    $folders = array
    (
        //'Testes'.DIRECTORY_SEPARATOR.'Testando' (Se for pasta com subpasta)
        'Dao',
        'Models',        
        'Controllers',
        'Libs',
        'Services'
    );

    if (file_exists($nomeClasse.".php") === true) {
        require_once($nomeClasse.".php");
    }else{
        foreach ($folders as $folder) {
            if(file_exists("Classes" .DIRECTORY_SEPARATOR . $folder . DIRECTORY_SEPARATOR . $nomeClasse.".php") === true){
                require_once("Classes" .DIRECTORY_SEPARATOR . $folder . DIRECTORY_SEPARATOR . $nomeClasse.".php");
            }
        }
    }
});

E quando eu uso o class_exists eu uso assim

if(class_exists(ucfirst($tokens[1]))){

No caso tokens[1] é o que vier escrito na URL depois da primeira Barra /

mas se eu usasse o autoload com namespace teria que colocar dessa maneira abaixo ?

if(class_exists('CaminhoPasta/'.ucfirst($tokens[1]))){

Ewerton, boa tarde!

O caminho da pasta estaria no seu arquivo autoload você só precisaria passar o namespace da classe no parâmetro