当前位置:  开发笔记 > 编程语言 > 正文

PHP:类方法的进入/退出回调?

如何解决《PHP:类方法的进入/退出回调?》经验,为你挑选了2个好方法。

有没有办法在不在每个方法中进行显式调用的情况下设置回调(或自动记录)方法参数,条目和出口?我基本上想要将此信息记录到我的记录器类(这是静态的),而不必为每个方法手动执行此操作.

现在我必须在每个方法中调用Logger :: logEntry()和Logger :: logExit()来完成此任务.我很乐意不必这样做:

class TestClass {
    public function tester($arg) {
        Logger::logEntry();
        Logger::info('Parameter $arg => ' . $arg);

        // Do some stuff...

        Logger::logExit();
    }
}

Owen.. 11

使用包装类.这种方法有以下好处:

无需更改基础类结构/方法签名

改变记录?只是更新这个课程

更新对象调用vs将代码插入到要记录的每个类中

.

class LogWatch {
    function __construct($class)    {
        $this->obj  =   $class;
    }

    function __call($method, $args) {
        if (in_array($method, get_class_methods($this->obj) ) ) {
            Logger::logEntry();
            Logger::info('Parameter '.implode(', ', $args) );

            call_user_func_array(array($this->obj, $method), $args);

            Logger::logExit();

        } else {
            throw new BadMethodCallException();
        }
    }
}

$test = new LogWatch(new TestClass() );
$test->tester();

// you can use instances of `LogWatch()` just like your watched class
// including passing appropriate params:
$test->tester($param1, $param2);


Kent Fredric.. 5

如果要进行函数日志记录以进行调试,可能需要查看Xdebug扩展.在运行时没有很好的方法来拦截函数调用,任何自动拦截都会增加很大的运行时开销.

使用XDebug,您可以根据需要将其打开,以及获取许多其他内容

(因此XDebug与PHPUnit一起用于单元测试和覆盖率分析.)

Xdebug的

PHPUnit的

__call的问题

__call可能看起来是一个有趣的解决方案,但这有3个问题,即

重大执行开销.你在做__call - > call_user_func_array,它实际上不会为每次执行添加一个,而是两个函数调用.

Backtraces变得难以理解:你试图调用的实际函数在__call和call_user_func_array的海洋中迷失,使得回溯非常困难,特别是如果你的回溯带有他们的arguent列表.

愚蠢的隐藏函数:你将回到PHP4风格的"隐藏"函数,方法是在它们前面添加_以阻止用户直接调用它或看到它,因为如果函数名称恰好被命名为它们的名字,那么__call不会触发,所以你已经有了一整套真正可怕的函数名称,开发人员很想在各个地方直接调用.(如果你想稍后摆脱__call,你将不得不重命名所有这些函数,以免破坏代码!)

因此,如果您正在使用PHP代码来实现这将导致严重可怕的代码,您的代码库的任何未来用户都不会想要使用它.获得可以在需要时透明添加的东西(如Xdebug)要好得多,并且可以大大节省污染代码.



1> Owen..:

使用包装类.这种方法有以下好处:

无需更改基础类结构/方法签名

改变记录?只是更新这个课程

更新对象调用vs将代码插入到要记录的每个类中

.

class LogWatch {
    function __construct($class)    {
        $this->obj  =   $class;
    }

    function __call($method, $args) {
        if (in_array($method, get_class_methods($this->obj) ) ) {
            Logger::logEntry();
            Logger::info('Parameter '.implode(', ', $args) );

            call_user_func_array(array($this->obj, $method), $args);

            Logger::logExit();

        } else {
            throw new BadMethodCallException();
        }
    }
}

$test = new LogWatch(new TestClass() );
$test->tester();

// you can use instances of `LogWatch()` just like your watched class
// including passing appropriate params:
$test->tester($param1, $param2);



2> Kent Fredric..:

如果要进行函数日志记录以进行调试,可能需要查看Xdebug扩展.在运行时没有很好的方法来拦截函数调用,任何自动拦截都会增加很大的运行时开销.

使用XDebug,您可以根据需要将其打开,以及获取许多其他内容

(因此XDebug与PHPUnit一起用于单元测试和覆盖率分析.)

Xdebug的

PHPUnit的

__call的问题

__call可能看起来是一个有趣的解决方案,但这有3个问题,即

重大执行开销.你在做__call - > call_user_func_array,它实际上不会为每次执行添加一个,而是两个函数调用.

Backtraces变得难以理解:你试图调用的实际函数在__call和call_user_func_array的海洋中迷失,使得回溯非常困难,特别是如果你的回溯带有他们的arguent列表.

愚蠢的隐藏函数:你将回到PHP4风格的"隐藏"函数,方法是在它们前面添加_以阻止用户直接调用它或看到它,因为如果函数名称恰好被命名为它们的名字,那么__call不会触发,所以你已经有了一整套真正可怕的函数名称,开发人员很想在各个地方直接调用.(如果你想稍后摆脱__call,你将不得不重命名所有这些函数,以免破坏代码!)

因此,如果您正在使用PHP代码来实现这将导致严重可怕的代码,您的代码库的任何未来用户都不会想要使用它.获得可以在需要时透明添加的东西(如Xdebug)要好得多,并且可以大大节省污染代码.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有