我可以使用私有实例方法作为回调吗?

时间:2009-06-22 16:05:56

标签: php callback encapsulation

我的特定场景涉及使用私有方法中的正则表达式进行一些文本转换。私有方法调用preg_replace_callback,但看起来回调需要在对象上公开,所以当我不愿意时,我就会突破私有世界并暴露实现细节。

因此,简而言之:我可以使用实例方法作为回调而不会丢失封装吗?

感谢。

3 个答案:

答案 0 :(得分:23)

是的,似乎你可以:

<?php

//this works
class a {
   private function replaceCallback($m) { return 'replaced'; }

   public function test() {
        $str = " test test ";
        $result = preg_replace_callback('/test/', array($this, 'replaceCallback'), $str);
        echo $result;
   } 
}

$a = new a();
$a->test();


//this doesn't work
$result = preg_replace_callback('/test/', array(new a(), 'replaceCallback'), ' test test ');    
echo $result;

所以似乎preg_replace_callback()或PHP的回调机制都知道它被调用的范围。

在5.2.8上测试

答案 1 :(得分:1)

你能为文本处理创建一个单独的助手类,并在该类中创建回调方法(它可以在那里公开)吗?如果需要访问特定的实例数据,可以传入对原始类(对象)的引用。

你的主类的公共接口保持一致和干净,你可以从一个它可能不属于的类中提取特定的字符串处理......

答案 2 :(得分:-1)

你能不使用受保护的?我需要知道这两个类之间的关系是什么,以便更清楚,但是你应该能够扩展类并使用你继承的新的受保护方法而不公开它们。

希望这有帮助!

干杯