2011-01-25 1 views
0

Atm У меня есть простой автозагрузчик, который просто преобразует символы подчеркивания в передние косые черты и палки на .php в конце. Естественно, это требует, чтобы вы добавили свой «app dir» в путь include.Каков наилучший способ определения функции автозагрузчика в PHP, который может показать, какая строка вызвала его, когда он не может найти класс?

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

Что является самым простым способом узнать, в какой строке, в которой файл заставил автозагрузчик попытаться загрузить отсутствующий класс?

ответ

3

Добавить что-то вроде этого:

if (!file_exists($class.'.php')) { 
    echo '<pre>'; 
    debug_print_backtrace(); 
    echo '</pre>'; 
} 

или сделать его более подробным:

if (!file_exists($class.'.php')) { 
    // PSEUDO CODE! 
    echo '<pre>'; 
    $debug = debug_backtrace(); 
    echo 'Line: '.$debug['line']; 
    echo '</pre>'; 
} 
+0

Да, но это потребует от меня повторить все пути в путях include и проверить, существует ли файл в каждом из них. Я надеялся, что будет немного немного подробный и ручной способ. – Sam

+0

Скажите что? Поместите вышеуказанный код в свою функцию __autoload() и запустите код нарушения. Он выплюнет заднюю часть. Разве это не то, что вы хотели? Другой вариант - установить xdebug, который автоматически печатает обратную линию для каждой ошибки. – user210179

+0

То, что я имел в виду, было бы не нужно делать что-то вроде foreach (split (":", get_include_path()) как $ include_path {// проверять файл_экзисты} – Sam

0

Вот как я в конечном итоге делает это, слегка модифицирована:

function classNameToPath($className) { 
    // Add your code which converts a class name to a relative path and returns it 
    // For example Databases_Connection => Databases/Connection.php 
} 

function __autoload($className) { 
    $classFile = classNameToPath($className); 
    $allIncludePaths = preg_split("/:/", get_include_path()); 
    foreach($allIncludePaths as $includePath) { 
    if (file_exists("${includePath}/${classFile}")) { 
     require_once($classFile); 
     return; 
    } 
    } 
    throw new Exception("Class not found {$clasSName}"); 
} 

Это позволяет чтобы обернуть вашу «основную» функцию в блок try, где вы можете поймать эти исключения и получить stackTrace из исключения и эхо-сигнал внутри элементов <pre>, например. Должен любить, что вам нужно все это процитировать самостоятельно на PHP;) Ну, даже если вы не поймаете класс, не найденные исключения PHP все равно поймает их и автоматически отобразит stacktrace, только не в пределах <pre>, так что это будет большой беспорядок на одной строке, если вы видите его в своем браузере.