Понимание автозагрузки и spl_autoload_register

У меня небольшой фреймворк и в своих скриптах я использую автозагрузку (я только сейчас осознал, что нужно начать избавляться от этой функции в своих скриптах)

Я сейчас пытаюсь использовать Twilio API, в их коде используется функция spl_autoload_register. После того, как логический блок, вызываемый кодом twilio в остальной части скрипта, ломается, когда я делаю новый вызов одному из моих классов

моя файловая структура такова

/classes/
    autoload.php
    DB_Connect.php

/classes/Twilio/

/sms/Twilio/Services/
    twilo.php

Скрипт, который ломается, выглядит примерно так

<?php 

include(classes/autoload.php);

if($something_is_true){
    requrie_once(sms/Twilio/Services/Twilio.php);
    //here is where the spl_autoload_register() is called
}

$connection = new DB_Connect();
//script is broken here

Что мне нужно сделать сейчас в папке Classes, чтобы все классы заработали?


person Rick Weston    schedule 24.03.2013    source источник


Ответы (1)


Вероятно, причина в том, что ваш автозагрузчик (__autoload()) полностью заменяется после вызова spl_autoload_register() :

Если в вашем коде есть функция __autoload(), то эта функция должна быть явно зарегистрирована в стеке __autoload. Это связано с тем, что spl_autoload_register() эффективно заменяет кеш движка для функции __autoload() на spl_autoload() или spl_autoload_call().

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

В настоящее время это выглядит так:

function __autoload($class) {
    // ...
}

Измените его следующим образом (при условии, что вы используете PHP 5.3):

spl_autoload_register(function ($class) {
    // ...
});

Перед добавлением PHP 5.3 это также должно работать:

spl_autoload_register('__autoload');
person TimWolla    schedule 24.03.2013
comment
+1 The reason probably is that your autoloader gets completely replaced once - это настолько важная часть, что я пропустил просмотр Руководства по PHP!! - person Ilia; 11.01.2014