Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

kalua

Autoload nao carrega classe existente, isso é possível?!?

Recommended Posts

Olá a todos

 

Eu estou utilizando o recurso __autoload para carregar as minha classes automaticamente, mas embora exista algumas classes, e por mais que elas estejam com suas nomeclaturas do jeito e tal e tal, o bendito do __autoload nao quer carregar-las de jeito nenhum, confesso que estou perdendo a paciência, mas se alguém tiver alguma luz ai pra dar, eu ficaria bem mais aliviado, desde já agradeço a helps!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

De uma olhada no post abaixo.

 

http://forum.imasters.com.br/topic/537233-problema-com-autoload-simples/?p=2145510

 

 

Ou adapte fazendo algumas alterações.

<?php

/**
 * My SPL autoloader.
 * @param string $classname The name of the class to load
 */
function MyAutoload($classname)
{
    //Can't use __DIR__ as it's only in PHP 5.3+
    $filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php';
    if (is_readable($filename)) {
        require $filename;
    }
}

if (version_compare(PHP_VERSION, '5.1.2', '>=')) {
    //SPL autoloading was introduced in PHP 5.1.2
    if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
        spl_autoload_register('MyAutoload', true, true);
    } else {
        spl_autoload_register('MyAutoload');
    }
} else {
    /**
     * Fall back to traditional autoload for old PHP versions
     * @param string $classname The name of the class to load
     */
    function __autoload($classname)
    {
        MyAutoload($classname);
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

isso funciona que é uma beleza!

 

toma !

 

<?php


function __autoload($ClassName) {
    if (file_exists(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'modules/class' . DIRECTORY_SEPARATOR . $ClassName . '.class.php')) {
        require_once (dirname(__DIR__) . DIRECTORY_SEPARATOR . 'modules/class' . DIRECTORY_SEPARATOR . $ClassName . '.class.php');
    } else {
        die('Erro ao incluir a classe <strong>' . $ClassName.'.class.php </strong>');
    }
}
Obs: leia o código e altere os diretórios!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Composer

 

Não perca tempo com autoload deixa o trabalho duro para um gerenciador de pacotes!

 

E foque no que realmente importa na sua app (as regras de negocio).

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que eu não consigo entender é a lógica do porque não está incluindo esta classe, por mais que ela exista o erro que aparece é Class 'EmailModel' not found e isso é bem estranho e esta tirando minha paz, se alguem por favor tiver alguma explicação de onde eu estou errando, por favor nao deixe de compartilhar, eu gostaria de entender o conceito do porque nao está funcionando, e se é por falta de detalhes então ai vai mais detalhes:

 

Eu tenho uma função __autoload em um arquivo config.php em um diretório acima das minhas classes, ou seja, eu tenho diretório classes contendo todas as minhas classes, inclusive a classe em questão.

 

O autoload está assim:

function __autoload($class) {
    if (file_exists(dirname(__DIR__) . DS . 'app' . DS . 'classes' . DS . $class . '.php')) :
        require_once dirname(__DIR__) . DS . 'app' . DS . 'classes' . DS . $class . '.php';
    else :
        die('Erro ao incluir classe <strong>' . $class . '</strong>');
    endif;
}

E a minha classe EmailModel.php está definida assim:

<?php

class EmailModel extends Model {
    //put your code here
    ...

Desde já agradeço a atenção de todos, livrem-me desta aflição :cry:, é muito chato acontencer um problema e vc nao saber o pq deste problema!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma coisa que sempre faço quando algo não funciona é verificar o que esta sendo retornado, tente dar um echo nessa parte :

dirname(__DIR__) . DS . 'app' . DS . 'classes' . DS . $class . '.php'  

e veja o que esta retornando para voce

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara por encrivel que pareça, está dando o caminho da classe certinho, mas php está considerando como se o nome do arquivo não fosse o mesmo nome da classe, o que não é verdade, o arquivo é chamado EmailModel.php e a classe chama-se EmailModel.


E mesmo assim se o caminho estivesse errado, ele deveria cair no die(), mas nem isso acontece!!!


Mas obrigado pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posta o arquivo você esta chamando a classe EmailModel

 

Na caso da extends model, voce esta incluindo a classe model do arquivo ?

 

Esta usando bootstrap para fazer as chamadas do arquivos ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera consegui resolver misteriosamente!! Falo misteriosamente pq nao o pq disso q eu fiz, é o seguinte:

 

Eu tinha uma classe MailHandler sendo instanciada antes de EmailModel, o que acontecia era que toda classe que o PHP tentava executar depois dessa MailHandler não era reconhecida como classe. O que eu fiz foi fazer toda a operação com banco de dados antes do envio de email, a deu certo, as classes que dependem este processo foram incluidas e executadas certinho, agora nao me perguntem o pq isso aconteceu, eu ainda nao conheço alguma regra que fale algo sobre isto, mas enfim consegui resolver, estou 70% satisfeito, e 30% insatisfeito por não saber o porque isso aconteceu!!! Mas vlw ai força galera.


Ficou assim depois de resolvido:

if ($_SERVER['REQUEST_METHOD'] == 'POST') :
            foreach ($_POST as $key => $value) :
                $_POST[$key] = htmlspecialchars($value);
            endforeach;

            extract($_POST);

            if ($_SESSION['token'] == $token) :
                //Inserindo no banco de dados.
                $model = $this->model('email');
                $model->setEmail($email);
                if (!$model->emailExists()) :
                    $model->setNome($nome);
                    if (!$model->insert()) :
                        $this->set('alert', array('type' => 'alert', 'message' => 'Ocorreu algum erro na inserção no banco de dados!'));
                    endif;
                endif;
                
                //Enviando o email com a requisição.
                $mail = new MailerHandler('rbr26.dizinc.com', 465, 'contato@igrejasdc.com.br', '1020304050');
                $mail->setToName('kaluanbentes@gmail.com', 'Igreja SDC');
                $mail->setNome($nome);
                $mail->setEmail($email);
                $mail->setAssunto('Quero receber o CD da Família');
                $mail->setMenssagem(
                    '<p><b>Nome:</b> ' . $nome . '</p>' . '<p><b>Email:</b> ' . $email . '</p>' . '<p><b>Telefone:</b> ' . $telefone . '</p>' . '<p><b>Celular:</b> ' . $celular . '</p>' . '<p><b>Endereço:</b> ' . $endereco . '</p>' . '<p><b>Cidade:</b> ' . $cidade . '</p>' . '<p><b>Estado:</b> ' . $estado . '</p>' . '<p><b>CEP:</b> ' . $cep . '</p>'
                );
                
                if ($mail->sendEmail()) :
                    $_SESSION['token'] = hash('sha512', rand(100, 1000));
                    $this->set('alert', array('type' => 'success', 'message' => 'A sua requisição foi enviada com sucesso!'));
                else :
                    $this->set('alert', array('type' => 'alert', 'message' => $mail->getError()));
                endif;
            else :
                $this->set('alert', array('type' => 'alert', 'message' => 'Token invalido! <a href="index.php">Recarregue a página</a>'));
            endif;
        endif;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.