Это должно ответить на тот вопрос, и затем некоторых.
вторая строка, if (obj.GetType() == typeof(ClassA)) {}
, быстрее для тех, которые не хотят читать статью.
Вы можете использовать debug_backtrace ().
http://us3.php.net/manual/en/function.debug-backtrace.php
Итак, в вашем журнале функция , вы сможете получить имя файла и номер строки, из которой была вызвана функция журнала.
Я использую этот подход в своих классах ведения журнала, и он значительно сократил объем кода, необходимый для получения значимых данных журнала. Еще одно преимущество - удобочитаемость. Магические константы, как правило, становятся довольно уродливыми при смешивании со строками.
Вот быстрый пример:
function log($msg)
{
$bt = debug_backtrace();
$caller = array_shift($bt);
// echo $caller['file'];
// echo $caller['line'];
// do your logging stuff here.
}
debug_backtrace () можно использовать для обратной трассировки через стек вызовов. Однако это может быть медленным, поэтому будьте осторожны, если вы много ведете журнал.
Если вы используете PHP 5.3, вы можете воспользоваться преимуществом позднего статического связывания и иметь базу class метода log ()
, и ваши дочерние классы могут вызывать его, но по-прежнему поддерживать статические ссылки на __ FILE __
и __ LINE __
.
Последним вариантом будет просто передайте __ FILE __
и __ LINE __
в качестве параметров при вызове функции log ()
.