【问题标题】:PHP: Logging or tracking when an inherited class calls a parent functionPHP:当继承的类调用父函数时记录或跟踪
【发布时间】:2018-11-17 18:42:31
【问题描述】:

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

是否有代码可以在 PHP 中自动执行此操作?这是一个例子。

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

class User extends OldUser {

}

-----

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

然后在某处的日志中我注意到: “{timestamp} 函数 getFullName() 被调用”

显然我可以手动添加这些日志,但如果 PHP 有现有的方法可以做到这一点,我很乐意默认使用该方法。

或者,如果有更好的方法可以做到这一点,我愿意接受建议。

谢谢!

【问题讨论】:

  • 有一些 IDE 可以让您查看函数的调用层次结构。我认为 Sublime Text 3 至少有一个插件。或者在项目文件夹中搜索方法名称。以这种方式查找未使用的方法可能很乏味但可行。至于你所说的过时是什么意思,我不确定你要去哪里,也不知道这个类继承将如何提供帮助。此外,大量记录(读/写)会影响应用程序的性能,所以要小心。
  • 这个想法是代码已经发生了很大的变化(甚至在我开始工作之前),函数已被弃用并且不再使用。我们正在寻找一种方法来慢慢清除这些函数,以便我们可以清理代码,安全地删除它们。
  • 我可以根据经验告诉您,此过程是手动的且耗时的。您可以花费大量时间来检测您的代码或使用代码分析工具,但您会走得更远,只需要一个接一个地去寻找并修复您需要的东西。即使在我管理的代码库中,这在几个版本的过程中也更快。最大的帮助是一个好的测试框架。

标签: php class inheritance yii


【解决方案1】:

如果您的代码对于静态代码分析工具来说太神奇了,您可能应该为您的应用编写一些集成/功能测试并查看代码覆盖率 - 未覆盖的方法可能是无效代码(或者您需要更多测试)。在此之后,您不仅会有更清晰的代码,而且还有有用的测试,所以一石二鸟。 :)

【讨论】:

    【解决方案2】:

    无需手动添加调用即可实现此目的的一种可能方法是使用一个继承您要跟踪/记录的类的类:

    这些线周围的东西应该可以做到:

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

    【讨论】:

    • 这个版本完全符合我的期望。谢谢!
    • 太好了,很高兴能帮上忙!
    【解决方案3】:

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

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

    debug_backtrace() 将允许您在代码中跟踪调用函数的位置

    【讨论】:

    • 嗯。这与我正在尝试做的类似。这个想法是我会有类似 public function getFullName() { self::log(FUNCTION . "accessed in UserOld");返回 "{$this->firstName} {$this->lastName}";然后,在日志中看到之后,将 getFullName() 复制到 User 中,从而防止它被再次调用。如果这可以使用现有的 PHP 功能自动完成,我宁愿这样做,然后将日志行写入 120 多个函数。
    猜你喜欢
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2023-03-27
    • 2022-09-27
    相关资源
    最近更新 更多