如何在 php 中的被调用方法中获取调用方方法参数?
How to get caller method argument inside called method in php?
比方说,我有一个 class 这样的:
<?php
class ExampleClass {
public function callerOne($arg1, $arg2) {
return $this->calledMethod(function($arg1, $arg2) {
// do something
});
}
public function callerTwo($arg1) {
return $this->calledMethod(function($arg1) {
// do something
});
}
protected function calledMethod(Closure $closure)
{
// How to access caller's arguments, like func_get_args()
$args = get_caller_method_args();
return call_user_func_array($closure, $args);
}
}
在上面的示例中,方法 calledMethod
将传递的闭包包装在某些东西中,例如在 beginTransaction()
和 endTransaction()
之间扭曲它,但我需要访问调用方方法参数。
我知道一个可能的解决方案是在将闭包传递给 calledMethod()
时使用 use
语句,但如果我想要的是可能的,那么看起来会容易得多。
如何在被调用方法中访问调用者的参数?这可能吗?
我不确定这对你的情况是否有帮助,但你可以创建 ReflectionFunction and use ReflectionFunction::invokeArgs,它调用函数并将其参数作为数组传递。
<?php
$closure = function () {
echo 'Hello to: ' . implode(', ', func_get_args()) . PHP_EOL;
};
$reflection = new ReflectionFunction($closure);
// This will output: "Hello to: foo, bar, baz"
$reflection->invokeArgs(array('foo', 'bar', 'baz'));
比方说,我有一个 class 这样的:
<?php
class ExampleClass {
public function callerOne($arg1, $arg2) {
return $this->calledMethod(function($arg1, $arg2) {
// do something
});
}
public function callerTwo($arg1) {
return $this->calledMethod(function($arg1) {
// do something
});
}
protected function calledMethod(Closure $closure)
{
// How to access caller's arguments, like func_get_args()
$args = get_caller_method_args();
return call_user_func_array($closure, $args);
}
}
在上面的示例中,方法 calledMethod
将传递的闭包包装在某些东西中,例如在 beginTransaction()
和 endTransaction()
之间扭曲它,但我需要访问调用方方法参数。
我知道一个可能的解决方案是在将闭包传递给 calledMethod()
时使用 use
语句,但如果我想要的是可能的,那么看起来会容易得多。
如何在被调用方法中访问调用者的参数?这可能吗?
我不确定这对你的情况是否有帮助,但你可以创建 ReflectionFunction and use ReflectionFunction::invokeArgs,它调用函数并将其参数作为数组传递。
<?php
$closure = function () {
echo 'Hello to: ' . implode(', ', func_get_args()) . PHP_EOL;
};
$reflection = new ReflectionFunction($closure);
// This will output: "Hello to: foo, bar, baz"
$reflection->invokeArgs(array('foo', 'bar', 'baz'));