PHP:当继承的类调用父函数时记录或跟踪

PHP:当继承的类调用父函数时记录或跟踪,php,class,inheritance,yii,Php,Class,Inheritance,Yii,我正在尝试跟踪对象类中过时或未使用的函数。我的一个想法是创建一个继承原始类的新类,然后在调用父函数时“跟踪”。当检测到时,我会将父函数迁移到子函数中,直到最终只存在必要/需要的函数 PHP中是否有自动执行此操作的代码?下面是一个例子 class OldUser { function getFullName() { return "{$this->firstName} {$this->lastName}"; } } class User extends

我正在尝试跟踪对象类中过时或未使用的函数。我的一个想法是创建一个继承原始类的新类,然后在调用父函数时“跟踪”。当检测到时,我会将父函数迁移到子函数中,直到最终只存在必要/需要的函数

PHP中是否有自动执行此操作的代码?下面是一个例子

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

class User extends OldUser {

}

-----

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

然后在日志的某个地方我注意到: “{timestamp}函数getFullName()已调用”

很明显,我可以手动添加这些日志,但是如果PHP有一种现有的方法来做这件事,我希望默认使用这种方法

或者,如果有更好的方法,我愿意接受建议


谢谢

您需要做的就是实现所有的
OldUser
公共方法,让这些调用触发日志记录,然后调用父函数。例如:

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

将允许您跟踪调用函数的代码位置。

如果您的代码对于静态代码分析工具来说太神奇,您可能应该为应用程序编写一些集成/功能测试,并查看代码覆盖率-未覆盖的方法可能是死代码(或者您需要更多测试)。在这之后,您不仅可以获得更清晰的代码,还可以进行有用的测试,因此一举两得。:)

实现这一点而不必手动添加调用的一种可能方法是使用不继承要跟踪/记录的类的类:

围绕这些线的一些东西应该可以做到这一点:

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);
    }
}

有一些IDE可以让您看到函数的调用层次结构。我认为Sublime Text 3至少有一个插件。或在项目文件夹中搜索方法名称。用这种方法寻找未使用的方法可能很乏味,但可行。至于你所说的“过时”是什么意思,我不知道你要去哪里,也不知道这个类继承会有什么帮助。此外,记录大量日志(读/写)会降低应用程序的性能,因此要小心。其想法是,代码已经发生了很大变化(甚至在我开始编写之前),以至于函数已被弃用,不再使用。我们正在寻找一种方法来慢慢删除这些函数,这样我们就可以清理代码,安全地删除它们。我可以从经验告诉你,这个过程是手动的,而且很耗时。您可以花费大量时间来检测代码或使用代码分析工具,但只需逐级查找并修复所需的内容,就可以走得更远。即使在我管理的代码库中,在几个版本的过程中,这也会更快。最大的帮助是一个好的测试框架。这和我想做的很相似。我的想法是,我会有一些类似于公共函数getFullName(){self::log(function.“在UserOld中访问”);返回“{$this->firstName}{$this->lastName}”;}然后,在日志中看到它之后,将getFullName()复制到User中,从而防止再次调用它。如果这可以通过现有的PHP功能自动完成,我宁愿这样做,然后将日志行转换成120多个函数。非常感谢。太好了,我很乐意帮忙!