PHP: регистрация или отслеживание, когда унаследованный класс вызывает родительскую функцию - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь отследить устаревшие или неиспользуемые функции внутри класса объекта.У меня была одна идея - создать новый класс, который наследует этот исходный класс, и затем «отслеживать», когда вызываются функции этого родителя.При обнаружении я перенесу родительскую функцию в дочернюю, пока в конечном итоге не появятся только необходимые / необходимые функции.

Существует ли код, который делает это автоматически в PHP?Вот пример.

class OldUser {
    function getFullName() {
        return "{$this->firstName} {$this->lastName}";
    }
}

class User extends OldUser {

}

-----

$user = new User;
echo $user->getFulLName();

Затем в журнале где-то я замечаю: "{timestamp} функция getFullName () с именем"

Очевидно, я мог бы добавить эти журналы вручную, ноесли у PHP есть способ сделать это, я бы с удовольствием применил эту методологию по умолчанию.

В качестве альтернативы, если есть лучший способ сделать это, я открыт для предложений.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

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

0 голосов
/ 07 июня 2018

Один из возможных способов добиться этого без добавления вызовов вручную - это использовать класс, который не не наследует класс, который вы хотите отслеживать / регистрировать:

Что-то вокруг этогостроки должны это сделать:

class User{
    private $old_user;

    // use the same signature of your class constuctor here
    public function __construct($arg1, $arg2, ...)
    {
        $this->old_user = new OldUser($arg1, $arg2, ...);
    }

    public function __call($name, $arguments)
    {
        log(sprintf("%s: function %S() called", date('Y-m-d H:i:s'), $name));
        call_user_func_array([$this->old_user,$name], $arguments);
    }
}
0 голосов
/ 07 июня 2018

Все, что вам нужно сделать, это реализовать все открытые методы OldUser, и эти вызовы инициируют ведение журнала и затем вызывают родительскую функцию.Например:

class User extends OldUser {
    protected function log($method, $backtrace) {
        // ...
    }
    public function getFullName() {
        $this->log(__METHOD__, debug_backtrace());
        return parent::getFullName();
    }
}

debug_backtrace() позволит вам отследить , где в коде, в котором была вызвана функция.

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