在类中调用本地方法时需要'this'吗?

时间:2012-03-14 11:58:13

标签: php class callback

当我从我的班级调用本地方法时,如下例所示,我是否必须将$this->放在它之前?

示例:

class test{
    public function hello(){
        $this->testing(); // This is what I am using
        testing(); // Does this work?
    }
    private function testing(){
        echo 'hello';
    }
}

我问的原因是因为我正在使用带有预定义PHP函数的array_map函数,现在我将使用我定义的函数。这就是我的意思:

class test{
    public function hello(){
        array_map('nl2br',$array); // Using predefined PHP function
        array_map('mynl2br',$array); // My custom function defined within this class
    }
    private function mynl2br(){
        echo 'hello';
    }
}

4 个答案:

答案 0 :(得分:7)

是的,这是必需的。 testing()引用该名称的全局函数,如果该函数不存在,将导致错误。

但是,您可以使用$this变量进行“回调”。从the PHP manual可以看出,您需要创建一个数组,其中第一个元素是对象,第二个元素是方法名称。所以在这里你可以这样做:

array_map(array($this, 'mynl2br'), $array);

答案 1 :(得分:5)

自己测试:P

结果是testing();没有被触发但$this->testing();没有被触发。 testing();仅指类外的函数。

<?php
class test{
    public function hello(){
        $this->testing(); // This is what I am using
        testing(); // Does this work?
    }
    private function testing(){
        echo 'hello';
    }
}

function testing() {
    echo 'hi';
}

$test = new test();
$test->hello(); // Output: hellohi
?>

请参阅@lonesomeday's answer了解问题的可能解决方案。

答案 2 :(得分:1)

为了使用类'方法作为回调,您需要传递包含对象实例和方法名的数组,而不是方法名:

array_map(array($this, 'mynl2br'), $array);

而不是

array_map('nl2br', $array);

答案 3 :(得分:1)

或者您可以使用闭包:

array_map(function($el) { ...; return $result; }, $array);