Xpoint
   [напомнить пароль]

Как определить номер текущей выполняемого кода?

Метки: [без меток]
2008-05-05 11:13:57 [обр] Pro PHP[досье]

Следует найти функцию, которая позволит указать место текущего положения в скрипте. Например, идет вызов метода M1, и мне нужно узнать, откуда (с какого файла, с какой строки в этом файле) был произведен вызов.

При этом есть еще одна зацепка. Класс, в котором вызываем метод, является родительским по отношению к вызывающему классу (выполняется extend). Таким образом, родительский класс не знает, какой класс его реализует. А задача в том, чтобы это узнать :-)

Жду ваших предложений или наводящих вопросов по этой теме.

спустя 10 минут [обр] Михаил Кюршин aka ya-ya(69/414)[досье]

Всё, что есть, это тут http://ru2.php.net/manual/en/language.constants.predefined.php
если вам нужно знать в методе, кем и откуда он был вызван, передавайте эти значения как параметры:

<?php
class Entity {
    function __construct($caller, $line) {
        print 'caller: '.$caller." on ".$line;
    }
}
class User extends Entity {
    function __construct() {
        parent::__construct(__METHOD__, __LINE__);
    }   
}
$user = new User();    
?>

но это как-то не очень изящно, по-моему.

спустя 11 минут [обр] Pro PHP[досье]

Михаил Кюршин aka ya-ya[досье] да, это не изящный вариант. Но уже что-то созревать начинает.

Как раз вызывающий не знает, что его местоположение будет зафиксировано. Ну например, вы вызываете метод addError('File not exist'). Так вот этот метод должен определить, кто же его вызвал и из какого места, и добавить сообщение об ошибке в виде: 'File not exist. File: test.php. Line: 147'.

Думаю, задача будет интересна не только для меня, но и каждому из опытных программистов. Как говорится пиша для мозгов" :-)

спустя 38 минут [обр] Алексей Шоков(6/9)[досье]
спустя 1 час 8 минут [обр] Pro PHP[досье]

Активно ринулся изучать, как эту функцию применить к своей задаче. Но как я понимаю, она берет полный список всех включений, вплоть до текущего вызова. Это не совсем хорошо, так как каждый раз прийдется напрягать скрипт чтобы создать такой огромный массив с большой степенью вложенности.

Спасибо за эту функцию. Если знаете о более "легковесной" функции, которая не весь отладочный массив выдает, а только последний вызов (верхушку стека из этого массива) - будет здорово. Только прошу не шутить, подсовывая самописную функцию где отрезаете полный массив до нужного нам элемента :-)

спустя 18 минут [обр] Pro PHP[досье]
Вот я написал код, который говорит о том, кто вызвал метод. Если вы найдете лучший вариант реализации - я с удовольствием его рассмотрю. Возможно, что следует поработать со указателями и ссылками, чтобы оптимизировать затраты памяти. Хотя, я не нашел чего здесь оптимизировать.
<?php

class C1
{
   protected function F1()
   {
      $arrParentInfo = debug_backtrace();
      echo 'File: ' . $arrParentInfo[0]['file'] . ', ';
      echo 'line: ' . $arrParentInfo[0]['line'];
   }
}
class C2 extends C1
{
   public function C2()
   {
      $this->F1();
   }
}
class C3
{
   public function C3()
   {
      $obj3 = new C2();
   }
}

$obj4 = new C3();

?>
спустя 6 часов [обр] Ворон(0/3)[досье]
сообщение промодерировано

Бросай прерывание и лови его.

try{
   throw new Exception("Ошибка: невозможно обработать запрос");
}catch(Exception $e){
echo $e->line;
}

http://ua.php.net/Exception

спустя 22 часа [обр] Pro PHP[досье]

Ворон[досье] исключения не прокатят, так как мы находимся внутри модуля системы, и модуль может продолжить работу, просто вызвав метод $this->_addError( 'Файла такого-то нет.' ). Поэтому использование исключений здесь не подойдет. Я как раз и справлялся исключениями когда задавал этот вопрос.

В О П Р О С 2: обработка исключений SQL запроса.
Суть вопроса: а вот еще интересная идея. Когда я работал в команде, мне предлагали сделать функционал ядра так, чтобы при возникновении ошибки во время выполнения SQL запроса (мы использовали библиотеку Zend_Db) весь запрос с подставленными значениями (плейсхолдерами) возвращался вместе с исключением, и затем это сообщение я мог спокойно записать в файл протокола. Ктото может подсказать по этому вопросу что-то полезное?

спустя 7 часов [обр] Василий Свиридов(53/175)[досье]
Pro PHP[досье]в MS SQL есть возможность кидать exception'ы из хранимых процедур, которые ловятся в коннекторе. Мы переписывали старый фреймворк для MySQL, и там пришлось просто следовать соглашению, что каждая процедура имеет последний параметер как out integer unsigned ?_errorCode и в коннекторе кидали Exception если код не равен нулю. Проще возможно уже и не сделаешь.
Правда у нас в коде вообще нет нигде прямых запросов, только вызовы процедур. (Что, в принципе, ИМХО, более верно).
спустя 12 часов [обр] Pro PHP[досье]

Василий Свиридов[досье] процедуры процедурами, это хорошо. Но в конце-концов выполняется SQL запрос, котрый становится строкой (непосредственно перед выполнением запроса). Так вот, если у вас в одном из методов будет ошибка, то отловить ее будет гораздо легче, если вы увидите полный SQL запрос, который отправляется на выполнение.

Спасибо что поделились своим методом отлавливания ошибок SQL!

спустя 1 день 8 часов [обр] Василий Свиридов(53/175)[досье]
Да, но в случае процедур ошибки обычно проявляются только один раз. Если запрос рабочий - максимум глюков будет из-за неправильных кавычек и эскейпа, а в случае вызова процедур параметры типизированы и эскейпинг не требуется, коннектор сам разруливает такие вещи.
Powered by POEM™ Engine Copyright © 2002-2005