Расширение классов при использовании автозагрузки

Я использую 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 = "[email protected]";
        $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;) я хочу просмотреть каталоги, в которых он просматривается, чтобы устранить неполадки.

Спасибо


person user1032531    schedule 06.06.2014    source источник
comment
Возможно, вам следует рассмотреть возможность использования согласованного соглашения об именах классов. Это самая странная смесь, которую я видел!   -  person Seer    schedule 06.06.2014
comment
@Провидец. Пожалуйста, объясните, почему это странно.   -  person user1032531    schedule 06.06.2014
comment
Просто кажется, что это смесь стилей, верблюжий регистр, символы подчеркивания и некоторые вещи с заглавной буквы. Я знаю, что это частично ошибка PHPMailers, но я бы назвал это чем-то вроде TempPhpMailer или что-то в этом роде. Просто, чтобы это было последовательно. :)   -  person Seer    schedule 06.06.2014


Ответы (2)


Это не удается, потому что стандартный сценарий PHPMailerAutoload.php предполагает, что загружаемые им классы находятся в той же папке, что и он сам.

Переопределение __autoload не является хорошей идеей (если вы не используете очень старый PHP, где у вас нет выбора), так как это будет иметь тенденцию ломать вещи, которые зависят от того, что было - правильный способ добавить свой собственный автозагрузчик классов - это написать Автозагрузчик SPL и добавьте его в стек автозагрузчика. В любом случае это то, что делает автозагрузчик PHPMailer, поэтому вы можете последовать этому примеру.

В этом случае я бы порекомендовал вам скопировать стандартный автозагрузчик и изменить его так, чтобы он указывал на папку вашего собственного класса, что более или менее соответствует тому, что предложил @user1032531.

person Synchro    schedule 13.06.2014

Я не знаю, почему замена function __autoload($class){...} на this работает, но работает. Я был бы признателен за любое объяснение, которое кто-либо мог бы предоставить.

spl_autoload_register(function ($class) {
    $class=strtolower($class);
    if(file_exists('/var/www/classes/'.$class.'.php'))
        {require_once '/var/www/classes'.DS.$class.'.php';}
});
person user1032531    schedule 06.06.2014