его только для входа, что какая функция accesed. Вместо вызова функции журнала в каждой функции.
Это нелегко без добавления кода к методам или с помощью отдельного инструмента для отладки и профилирования.
Обратите внимание, что предлагаемые решения с __call
не работают с существующими общедоступными методами, в конце концов, это будет усложняться, чем просто добавлять log(__METHOD__)
к каждому методу.
Что вы ищете, это в основном Aspect Oriented Programming (AOP), который не очень поддерживается в PHP. Структура Flow3 использует аннотации и отражение для динамического добавления аспектов. Их Logging Example является прекрасной иллюстрацией вашего случая использования:
namespace Example\MyPackage;
/**
* A logging aspect
*
* @Flow\Aspect
*/
class LoggingAspect {
/**
* @var \TYPO3\Flow\Log\LoggerInterface A logger implementation
*/
protected $logger;
/**
* For logging we need a logger, which we will get injected automatically by
* the Object Manager
*
* @param \TYPO3\Flow\Log\SystemLoggerInterface $logger The System Logger
* @return void
*/
public function injectSystemLogger(\TYPO3\Flow\Log\SystemLoggerInterface ⏎
$systemLogger) {
$this->logger = $systemLogger;
}
/**
* Before advice, logs all access to public methods of our package
*
* @param \TYPO3\Flow\AOP\JoinPointInterface $joinPoint: The current join point
* @return void
* @Flow\Before("method(public Example\MyPackage\.*->.*())")
*/
public function logMethodExecution(\TYPO3\Flow\AOP\JoinPointInterface $joinPoint) {
$logMessage = 'The method ' . $joinPoint->getMethodName() . ' in class ' .
$joinPoint->getClassName() . ' has been called.';
$this->logger->log($logMessage);
}
}
Важным направлением является следующим:
@Flow\Before("method(public Example\MyPackage\.*->.*())")
он говорит рамки для вызова logMethodExecution
перед любым вызовом метода в любом классе Example\MyPackage
имен.
Итак, с Flow3 вы можете это сделать. Но реализация подобного поведения самостоятельно без рамки AOP неизбежно завершится неудачей.
Не могли бы вы объяснить, что вы хотите достичь? Другими словами: почему? Я уверен, что это не обязательно –
его просто для регистрации того, какая функция была присоединена. Вместо вызова функции журнала в каждой функции. – Dino