我正在使用PHPMailer,并希望扩展该类,以便我可以预先设置一些值。我有自动加载设置,所以我不需要在唤起它之前要求文件。我不希望实际设置位于/var/www/classes/myPHPMailer.php
,因为我有两台配置不同的服务器,因此请将设置放在Git忽略的另一个文件中。所以,它看起来像下面这样。
主文件
<?php
function __autoload($class)
{
if(file_exists('/var/www/classes/'.strtolower($class).'.php'))
{require_once '/var/www/classes/'.strtolower($class).'.php';}
}
$mailer=new myPHPMailer(true);
//...
$mailer->send();
?>
文件名:/var/www/classes/myPHPMailer.php
<?php
require_once ('/var/www/private/email.php');
class myPHPMailer extends myPHPMailer_temp {}
?>
文件名:/var/www/private/email.php
<?php
require_once ('/var/www/other_classes/PHPMailer/PHPMailerAutoload.php');
class myPHPMailer_temp extends PHPMailer {
public function __construct($allow_exceptions=false){
$this->isSMTP();
$this->SMTPDebug = 0;
$this->Host = "smtp.gmail.com";
$this->Port = 587;
$this->SMTPSecure = "tls";
$this->SMTPAuth = true;
$this->Username = "Username@gmail.com";
$this->Password = "Password";
}
}
?>
我一直在Fatal error: Class 'SMTP' not found in /var/www/other_classes/PHPMailer/PHPMailer/class.phpmailer.php on line 1173
如果我require_once /var/www/private/email.php;
并直接唤起myPHPMailer_temp
,我就不会收到错误。
使用自动加载器时如何扩展此类?另外,如何查看PHP将搜索哪些目录?在第1173行($this->smtp = new SMTP;
)之前,我希望查看它正在查找的目录,以便我可以排除故障。
谢谢
答案 0 :(得分:1)
它失败了,因为股票PHPMailerAutoload.php
脚本假定它加载的类与它自己在同一个文件夹中。
重新定义__autoload
并不是一个好主意(除非您使用的是非常老的PHP,否则您别无选择)因为它会破坏依赖于它的东西 - 正确添加自己的类自动加载器的方法是编写SPL Autoloader并将其添加到自动加载器堆栈。这就是PHPMailer的自动加载器所做的事情,所以你可以效仿这个例子。
在这种情况下,我建议您复制自动加载器并将其更改为指向您自己的类文件夹,这或多或少是@ user1032531所建议的。
答案 1 :(得分:0)
我不知道为什么用这个替换function __autoload($class){...}
有效,但确实如此。我很感激任何人都可以提供的任何解释。
spl_autoload_register(function ($class) {
$class=strtolower($class);
if(file_exists('/var/www/classes/'.$class.'.php'))
{require_once '/var/www/classes'.DS.$class.'.php';}
});