分配匿名函数时PHP对象关闭错误

时间:2015-05-28 12:14:39

标签: php

我收到以下错误:

  

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> &nbsp";
        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错误。

请帮助,我做错了什么或者不做什么?我想了解回调和闭包

1 个答案:

答案 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'之后。