Получить номер строки кода, активной в данный момент

Ямерт

The Old One
Получить номер строки кода, активной в данный момент

Вот такая проблема.
Решил для детализации логов использовать дополнительную информацию об ошибке - в каком классе, на какой строке она произошла.

сделал так:
PHP:
class BaseClass
{
...
  function getLocationInfo()
  {
	$info = "(file '" . __FILE__ . "', line " . __LINE__ . ", class '" . __CLASS__ . "')";
	return $info;
  }
}


class MyClass extends BaseClass
{
...
$this->log_engine->logError("error at " . $this->getLocationInfo());
}
Однако этот приём не проходит, поскольку выводится именно информация о строке в методе родительского класса!
Неужели единственный выход - это печатать номер строки и пр. в методе каждого дочернего класса?

Как можно решить эту проблему?
 

tony2001

TeaM PHPClub
>Неужели единственный выход - это печатать номер строки и пр. в методе каждого дочернего класса?
да.
при вызове метода указывать строку и файл.
PHP:
$obj->method($agrs,__FILE__,__LINE__);
__FILE__ & __LINE__ - это константы, которые подставляются в процессе парсинга самого файла.
 

Фанат

oncle terrible
Команда форума
можно еще попробовать функцию debug_backtrace, если РНР не ископаемой версии.
 

Ямерт

The Old One
можно еще попробовать функцию debug_backtrace, если РНР не ископаемой версии.
Спасибо, это был хороший совет!
P.S. Метод выглядит так:
PHP:
function getLocationInfo()
{
	$output_before = ob_get_contents();
	if ($output_before === FALSE) 
		ob_start();
	else
		ob_clean();
	print_r(debug_backtrace());
	$info = ob_get_contents();
	ob_end_clean();
	if ($output_before!== FALSE)
		echo $output_before;
	
	return $info;
}
 

tony2001

TeaM PHPClub
я бы рекомендовал Xdebug.org, там чуть побольше функциональность.
 

Ямерт

The Old One
2tony2001 - спасибо! Правда, для меня это пока несколько чересчур навороченно :)
2Фанат - где?
 

Фанат

oncle terrible
Команда форума
вот эта функция?!
С кучей буфферинга и прочее?
Для его она?
что она делает?
то же самое что и
function getLocationInfo() {
return debug_backtrace();
}
?
 

Ямерт

The Old One
Мне нужен текст - а это, имхо, самый быстрый способ получить его.
Лучше получить массив, пробежать по нему (учитывая то что будет потенциально большое количество вложенных массивов в элементе args), и сложить из всех элементов текст? :)

что она делает?
то же самое что и
function getLocationInfo() {
return debug_backtrace();
}
неправда.
 

Фанат

oncle terrible
Команда форума
самый быстрый для кого?
Для программиста, который не умеет написать рекурсивную функцию (которая по объему получится не больше этого произведения) или для скрипта, который должен буферить вывод?
 

Ямерт

The Old One
Для программиста, разумеется.
Функцию-таки пришлось написать - чтобы при обычном уровне отслеживания ошибок в лог не попадали args - иначе шибко уж большие записи получаются...
 
Сверху