Каков наилучший способ определить функцию автозагрузчика в PHP, которая может показать, какая строка вызвала его вызов, когда он не может найти класс? - PullRequest
0 голосов
/ 25 января 2011

Atm У меня есть простой автозагрузчик, который просто конвертирует подчеркивания в косые черты и вставляет .php в конце.Естественно, для этого необходимо добавить «каталог приложения» в путь включения.

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

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

Ответы [ 2 ]

3 голосов
/ 25 января 2011

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

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

или сделайте это более подробно:

<code>if (!file_exists($class.'.php')) {
  // PSEUDO CODE!
  echo '<pre>';
  $debug = debug_backtrace();
  echo 'Line: '.$debug['line'];
  echo '
'; }
0 голосов
/ 27 января 2011

Вот как я это сделал, немного изменив:

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 все равно будет ловить их и автоматически отображать трассировку стека, только не в <pre>, так что это будетбольшой беспорядок в одной строке, если вы видите его в своем браузере.

...