我收到以下错误:
Closure Object([this] => test1 Object()[parameter] => Array([$ handler] =>))
我不知道这意味着什么,我正在尝试使用php新功能。我的目的是调用匿名函数来动态执行命令列表,为了学习php回调和闭包我创建了3个类。
test1,test2伸出手
<?php
// test1.php
class test1
{
public function __construct() {
}
function dataTable() {
test2::table("food", function(hand $handler){
$handler->put("cookies");
});
}
}
// test2.php
class test2 extends hand
{
public function __construct() {
echo $this->info;
}
static function table($s, $b) {
echo "called from Test2, Table 1st parameter ";
echo $s ." <br><br>  ";
echo "called from Tes2, table 2nd parameter ";
print_r($b);
echo "---end";
}
}
// hand.php
class hand
{
protected $info;
public function __construct() {
print_r($this->info);
}
function put($b) {
$this->info = $b;
}
}
我想检索此处输入的结果$ handler-&gt; put(“cookies”);
从hand class和test2类中,第一个参数按预期工作但我收到了第二个参数的一个不熟悉的php错误。
请帮助,我做错了什么或者不做什么?我想了解回调和闭包
答案 0 :(得分:1)
好的,我将把我的评论扩展到答案中。
首先,您没有收到错误。它是行print_r($b);
的输出。
您已成功将匿名函数传递给test2::table()
作为第二个参数$b
。但是你还没有执行它。为此,您需要调用它。你执行一个匿名函数(没有参数),如下所示:
$b();
但是,在您的代码$b
中需要一个hand
类型的参数,否则您将收到可捕获的致命错误,并且您的代码将在此时失败。< / p>
由于test2
类从hand
扩展,我猜你打算用当前对象上下文调用匿名函数,如下所示:
$b($this);
但是这不起作用,因为test2::table()
方法是静态的。因此,它没有特定的对象上下文,这意味着$this
不可用。
以下是我认为您试图或多或少地实现的简化示例:
<?php
class Hand
{
protected $info;
function put($b)
{
$this->info = $b;
}
}
class Test2 extends Hand
{
function table($s, $b)
{
var_dump($this->info); // outputs null
$b($this); // execute the anonymous function
var_dump($this->info); // outputs 'cookies'
}
}
class Test1
{
function dataTable()
{
$test2 = new Test2();
$test2->table('food', function(Hand $handler){
$handler->put('cookies');
});
}
}
$test1 = new Test1();
$test1->dataTable();
请注意,table
方法不再是静态的。现在您可以将执行对象的上下文传递给它。由于所有代码都将值“cookies”分配给属性Hand::$info;
,我还添加了一些var_dump
调用,以在执行匿名函数之前显示属性为null
并设置为'cookies'之后。