17

我的特定场景涉及在私有方法中使用正则表达式进行一些文本转换。私有方法调用 preg_replace_callback,但似乎回调需要在对象上公开,所以我被困在脱离私有世界并公开实现细节时,我宁愿不这样做。

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

谢谢。

4

3 回答 3

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 上测试

于 2009-06-22T16:30:42.723 回答
1

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

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

于 2009-06-22T16:13:29.317 回答
-1

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

希望这可以帮助!

干杯

于 2009-06-22T16:15:19.613 回答