Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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!!
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!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).
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!!
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
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
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 ?
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;
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+
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', '>=')) {
} else {
/**
* Fall back to traditional autoload for old PHP versions
* @param string $classname The name of the class to load
*/