Php 如何分配闭包';s通过引用将值返回给变量,即使闭包通过值返回?

Php 如何分配闭包';s通过引用将值返回给变量,即使闭包通过值返回?,php,closures,return-by-reference,e-notices,Php,Closures,Return By Reference,E Notices,我有一个方法,它获取一个可调用的参数。调用callable时使用一些参数,这些参数可以通过值或引用获得,它可以通过值或引用返回值,也可以不返回值。在返回值的情况下,方法必须按原样从闭包返回值。如果该值是通过引用返回的,则该方法必须通过引用返回该值,反之亦然 问题是无法确定该值是否通过引用返回。是,可以检测闭包是否返回任何值;但是,当我尝试获取由value返回的闭包返回值的引用时,我将得到以下通知: PHP注意:在。。。在线xxx 同样,该方法按原样(即动态)返回闭包的返回值。这就是我努力实现的

我有一个方法,它获取一个可调用的参数。调用callable时使用一些参数,这些参数可以通过值或引用获得,它可以通过值或引用返回值,也可以不返回值。在返回值的情况下,方法必须按原样从闭包返回值。如果该值是通过引用返回的,则该方法必须通过引用返回该值,反之亦然

问题是无法确定该值是否通过引用返回。是,可以检测闭包是否返回任何值;但是,当我尝试获取由value返回的闭包返回值的引用时,我将得到以下通知:

PHP注意:在。。。在线xxx
同样,该方法按原样(即动态)返回闭包的返回值。这就是我努力实现的目标:

类示例
{
受保护的$数据=15;
//请注意这一点,通过引用返回
受保护函数和doOnData(可调用$function)
{
返回$function($this->data);
}
公共函数增量():void
{
//没有通知,因为闭包被定义为通过引用返回
$data=&$this->doOnData(函数&(&$data){
返回$data;
});
$data++;
}
公共函数get()
{
//请注意,为什么要将闭包定义为按值返回?
//定义通过引用返回的闭包修复了这个问题
//暂时(即定义为:函数和($data))
返回$this->doOnData(函数($data){
返回$data;
});
}
公共函数printData()
{
echo$this->data;
}
}
$example=新示例();
$example->increment();
$example->printData();//印刷品:16
$data=$example->get();//注意!
echo$data;//印刷品:16
正如您在示例中看到的,只有当您将按值返回的闭包传递给
示例::doonda()
时,才会生成通知,并且您无法获取其返回值引用。在这种情况下,将生成上述通知(是否应该生成?我不知道!)

一个解决方案可能是使用(at-sign)操作符,这是非常糟糕的(请参阅:and)。将闭包的引用保存到变量,然后返回变量不会改变任何东西(AFAIK)。此外,如代码注释中所述,在
示例::get()
中的闭包之前添加一个符号(&)并不是解决此问题的方法,并且会产生一些副作用(例如,每个闭包都必须定义为通过引用返回以防止出现通知,太糟糕了,用户不知道这一点)。所以,请不要建议这些事情


有什么办法可以阻止这个通知吗?我做错什么了吗?一般来说,我可以确定该值是通过值还是通过引用返回的(即类似于
is_reference()
)?还有其他解决方案吗?

我不得不说,这可能是我第一次看到函数通过引用返回。你能告诉我们这样做有什么好处吗?你为什么要使用参考资料呢?@Dharman我认为这并不罕见。关于这一点,已经有人提出了一些问题,比如or。是的,在大多数常见的情况下,它看起来几乎是无用的,但有时它有助于大大减少代码。描述用例有点困难,因为它们是特定于问题的。然而,它允许我们更动态地做事。它有时(并非总是)为代码提供了灵活性。在那篇文章中的答案是:“应该很少使用,而且只有在你仔细考虑过任何备选方案的情况下才使用。”你考虑过所有备选方案了吗?“我总是非常怀疑pass by ref的任何使用,它只有很少的合法用例。@达曼不确定所有的替代方案,但对于我正在研究的,是的,可能这是唯一的解决方案。”。顺便说一句,感谢您的关注和不同的期待!我必须说,这可能是我第一次看到函数通过引用返回。你能告诉我们这样做有什么好处吗?你为什么要使用参考资料呢?@Dharman我认为这并不罕见。关于这一点,已经有人提出了一些问题,比如or。是的,在大多数常见的情况下,它看起来几乎是无用的,但有时它有助于大大减少代码。描述用例有点困难,因为它们是特定于问题的。然而,它允许我们更动态地做事。它有时(并非总是)为代码提供了灵活性。在那篇文章中的答案是:“应该很少使用,而且只有在你仔细考虑过任何备选方案的情况下才使用。”你考虑过所有备选方案了吗?“我总是非常怀疑pass by ref的任何使用,它只有很少的合法用例。@达曼不确定所有的替代方案,但对于我正在研究的,是的,可能这是唯一的解决方案。”。顺便说一句,感谢您的关注和不同的期待!