Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Fala rapaziada.
Sabem como faço pra dizer pro autoload qual classe ele deve carregar e qual não deve? Eu sei que utilizando o use a gente consegue definir, porém estou com um problema, pq eu to usando o PHPMailer e o autoload ta querendo carregar automaticamente a classe Exception não sei pq.
Veja como está o código:
minha classe email onde instancio new PHPMailer():
namespace classes;
require_once("autoload/autoload.php");
use mailer\PHPMailer; // painel/mailer/PHPMailer.php
class email {
private $mail;
public function __construct(){
$this->mail = new PHPMailer();
}
}
Só que agora vem o problema, dentro do arquivo PHPMailer.php existem 2 classes:
class PHPMailer{
[code...]
}
class phpmailerException extends Exception {
[code...]
}
O meu autoload, onde eu uso pra chamar o PHPMailer, ta querendo carregar também a classe Exception que phpmailerException está extendendo, não faço ideia do pq LOL
Alguém sabe?
Erro:
PHP Fatal error: Class 'mailer\Exception' not found in
Desde já agradeço rapaziada, abração e fiquem com Deus.
Grande @EdCesar , rapaiz, eu consegui resolver colocando um contrabarra no Exception, ficou dessa forma:
class PHPMailer{
[code...]
}
class phpmailerException extends \Exception {
[code...]
}
Resolveu o problema fazendo dessa forma. Eu havia separado as 2 classes em arquivos diferentes e mesmo assim o autoload tava querendo carregar a Exception e tava dando "class not found", tive que usar a contrabarra no Exception.
Aproveitando, o contrabarra nas classes e na hora de instanciar uma classe diz pro autoload não carregar ela?
Valeuuu Edcesar.
@BrunoBit, que bom que resolveu!
Quando você utiliza \ esta dizendo para "carregar do inicio", nesse caso, como o PHP já tem uma classe que se chama Exception, esta pedindo para carregar a classe Exception do PHP, e não a sua ou do PHPMailer, caso existisse. No caso, ele estava procurando a classe Exception, dentro do namespace mailer
um outro exemplo é quando utilizamos \PDO
Show de bola Edcesar, consegui compreender, eu estava mesmo com esse problema do PDO, também consegui resolver usando o contrabarra.
Você sabe se existe mais alguma maneira de falar pro autoload qual classe ele não deve carregar?
@BrunoBit, não precisa. O autoload é inteligente o suficiente para apenas carregar as classes quando elas precisarem ser instanciadas!
Não era o tema, mas há duas semanas, fiz um vídeo sobre Xdebug que mostra como isso acontece na pratica e ao vivo. Se tiver interesse da uma olhada no vídeo abaixo, adiante para 6:20, que é a parte que te interessa.
Assisti o vídeo aqui, bacana pra caramba, inclusive eu não conhecia o xdebug.
Então é justamente isso a minha duvida, pq o autoload ele é inteligente e consegue captar as classes que devem ser instanciadas de forma automática, só que vamos supor que eu tenha um código cheio de classes nativas:
<?php
require_once("autoload/autoload.php");
use classes\produtos;
use classes\categorias;
use classes\connect;
$p = new product;
$c = new category;
$con = new connect;
$stmt = $con->runQuery("SELECT * FROM tbl_product");
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC); // <<<<<<<<<< PDO aqui
?>
Exemplo que fiz aqui rapidinho, perceba que ali no final tem PDO::FETCH_ASSOC, quando uso o autoload, o autoload quer carregar esse PDO também como se fosse classe, aí no caso tenho que ir ali colocar o contrabarra pra dizer pro autoload não carregar esse PDO como se fosse uma classe minha.
E a minha duvida é justamente essa, é necessário sempre usar o contrabarra pra dizer pro autoload não carregar essas classes nativas do PHP? Pq vamos supor que eu tenha um new DateTime, ou várias outras classes nativas do PHP no mesmo arquivo sendo usados, nesse caso eu tenho que jogar contra barra em todas elas? Pq se eu não colocar contrabarra vai dar erro, pq o autoload vai tentar carregar classes/PDO.php por exemplo, ou classes/DateTime.php , ou carregar qualquer outra classe nativa que ele encontrar e vai tentar buscar lá na minha pasta classes, consequentemente dando erro, pq não tenho arquivos PDO.php ou DateTime.php e etc.@BrunoBit, exatamente! Inclusive, usar \ é uma boa prática!
Valeuu edCesar, vou ficar mais tranquilo na hora de usar agora, pq eu não tinha achado nenhum conteúdo explicando essas contrabarras nas classes nativas.
@BrunoBit, beleza!
Não sei a lib foi modificada, ou se é uma versão antiga, pois na versão atual não tem essas duas classes no mesmo arquivo. Todavia, use a versão atualizada disponível em:
https://github.com/PHPMailer/PHPMailer