mpe*_*pen 3 php reference pass-by-reference
我的方法的签名如下所示:
public function ProgramRuleFilter(&$program, $today=null) {
Run Code Online (Sandbox Code Playgroud)
当我像这样调用它时,
$programs = array_filter($programs, array($this,'ProgramRuleFilter'));
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作.该ProgramRuleFilter
方法更新$program
数组,如果成功,则返回true/false,正确过滤$programs
.
但是,现在我想向过滤器传递一个额外的参数,$today
.我怎样才能做到这一点?
我试图像这样调用它:
$programs = array_filter($programs, new CallbackArgs(array($this,'ProgramRuleFilter'),$today));
Run Code Online (Sandbox Code Playgroud)
使用这个小类作为包装器:
class CallbackArgs {
private $callback;
private $args;
function __construct() {
$args = func_get_args();
$this->callback = array_shift($args);
$this->args = $args;
}
function __invoke(&$arg) {
return call_user_func_array($this->callback, array_merge(array($arg),$this->args));
}
}
Run Code Online (Sandbox Code Playgroud)
但是这些程序没有被更新,所以在某个地方它失去了对原始对象的引用.我不知道如何解决这个问题.
Jaz*_*azz 10
第二个参数array_filter
必须是回调; 这意味着它array_filter
本身将调用您的过滤器功能.没有办法告诉array_filter
以任何其他方式调用该函数,因此您需要找到一种方法以$today
其他方式获取函数的值.
这是何时使用闭包的完美示例,它允许您将一些数据(在本例中为值$today
)绑定到函数/回调中.假设您使用的是PHP 5.3或更高版本:
// Assuming $today has already been set
$object = $this; // PHP 5.4 eliminates the need for this
$programs = array_filter( $programs, function( $x ) use ( $today, $object ){
return $object->ProgramRuleFilter( $x, $today );
});
Run Code Online (Sandbox Code Playgroud)
这定义了一个内联闭包,使用父作用域的值$today
和$object
来自父作用域的值,然后只调用ProgramRuleFilter
该$对象上的现有函数.(该有点不寻常$object = $this
得到回避的事实,否则,关闭将无法调用一个方法对你对象的实例,但在PHP 5.4,你可以替换$object
与$this
瓶盖内.)
现在,这是一种有点不太优雅的方式,因为所有这些闭包确实将ProgramRuleFilter
功能交给了函数.更好的方法是使用闭包而不是函数.所以:
// Assuming $today has already been set
$filter = function( $x ) use ( $today ){
// Cut and paste the contents of ProgramRuleFilter() here,
// and make it operate on $x and $today
};
$programs = array_filter( $programs, $filter );
Run Code Online (Sandbox Code Playgroud)
哪种变体最适合您将取决于应用程序其余部分的实现.祝好运!
归档时间: |
|
查看次数: |
2148 次 |
最近记录: |