php变量修饰器,php相当于python修饰器?

下面是我用PHP从Python模仿装饰器的方法。

function call_decorator ($decorator, $function, $args, $kwargs) {

// Call the decorator and pass the function to it

$decorator($function, $args, $kwargs);

}

function testing ($args, $kwargs) {

echo PHP_EOL . 'test 1234' . PHP_EOL;

}

function wrap_testing ($func, $args, $kwargs) {

// Before call on passed function

echo 'Before testing';

// Call the passed function

$func($args, $kwargs);

// After call on passed function

echo 'After testing';

}

// Run test

call_decorator('wrap_testing', 'testing');

输出:

Before testing

testing 1234

After testing

使用此实现,您还可以对匿名函数执行类似的操作:

// Run new test

call_decorator('wrap_testing', function($args, $kwargs) {

echo PHP_EOL . 'Hello!' . PHP_EOL;

});

输出:

Before testing

Hello!

After testing

最后,如果你愿意的话,你甚至可以这样做。

// Run test

call_decorator(function ($func, $args, $kwargs) {

echo 'Hello ';

$func($args, $kwargs);

}, function($args, $kwargs) {

echo 'World!';

});

输出:

Hello World!

有了上面的构造,如果需要的话,可以将变量传递给内部函数或包装器。下面是一个匿名内部函数的实现:

$test_val = 'I am accessible!';

call_decorator('wrap_testing', function($args, $kwargs){

echo $args[0];

}, array($test_val));

如果没有匿名函数,它的工作原理将完全相同:

function test ($args, $kwargs) {

echo $kwargs['test'];

}

$test_var = 'Hello again!';

call_decorator('wrap_testing', 'test', array(), array('test' => $test_var));

最后,如果需要修改包装器或包装器中的变量,只需通过引用传递变量。

无参考:

$test_var = 'testing this';

call_decorator(function($func, $args, $kwargs) {

$func($args, $kwargs);

}, function($args, $kwargs) {

$args[0] = 'I changed!';

}, array($test_var));

输出:

testing this

参考文献:

$test_var = 'testing this';

call_decorator(function($func, $args, $kwargs) {

$func($args, $kwargs);

}, function($args, $kwargs) {

$args[0] = 'I changed!';

// Reference the variable here

}, array(&$test_var));

输出:

I changed!

这就是我现在所拥有的,它在很多情况下非常有用,如果你想的话,你甚至可以把它们包装多次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值