使用自动加载时扩展类

时间:2014-06-06 14:53:42

标签: php oop phpmailer autoloader

我正在使用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;)之前,我希望查看它正在查找的目录,以便我可以排除故障。

谢谢

2 个答案:

答案 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';}
});