Есть ли способ автоматически регистрировать начало и конец определения функции в PHP? - PullRequest
1 голос
/ 19 июля 2011

Мне нужен способ регистрировать начало и конец вызова функции без явного вызова метода в объекте журнала.

Я знаю, что мы можем использовать xdebug для отслеживания потока, но у меня есть требование, когда я должен сделать вызов функции записываемым в файл журнала без (с кодом) вызова $logObj->info('Function call');.

Например:

<?php

class something
{
    public function test()
    {
        echo "Test.";
    }
}

$some = new something();
$some->test();

?>

Теперь я хочу увидеть следующие записи в моем out.log:

2010-08-03T09:06:15+02:00 ERR (1): Entering something::test()
...
...
2010-08-03T09:06:15+02:00 ERR (1): Leaving something::test()

Ответы [ 3 ]

3 голосов
/ 19 июля 2011

Вы можете создать класс-оболочку для вашего объекта.

Например:

class LoggingSomethingWrapper {
  protected $something;
  protected $logger;
  function __construct($something, $logger) {
    $this->something = $something;
    $this->logger = $logger;
  }
  public function test() {
    $this->logger->logBefore(__FUNCTION__);
    $result = $this->something->test();
    $this->logger->logAfter(__FUNCTION__);
    return $result;
  }
}
1 голос
/ 19 июля 2011

Вам нужен AOP (http://en.wikipedia.org/wiki/Aspect-oriented_programming)

Но PHP изначально не поддерживает AOP (есть некоторые расширения для него, но я не знаю, насколько они хороши)

Как упоминалось в troelskn, вы должны создать класс-оболочку ( не проверено ):

class LogWrapper
{
    protected $object;

    protected $logger;

    public function __construct($object, $logger)
    {
        $this->object = $object;
        $this->logger = $logger;
    }

    public function __call($name, $arguments) 
    {
        //log
        $returnValue = call_user_func_array(array($this->object, $name), $arguments);
        //log

        return $returnValue;
    }
}
0 голосов
/ 19 июля 2011

Вы можете реализовать функции в объекте с именем func_xxx.И выполните магический метод call () с аргументом xxx, начните запись в журнал, вызовите $ this-> func $ xxx () и завершите запись

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...