是否可以使用私有实例方法作为回调?

2022-08-30 23:28:22

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

那么,简而言之:我能否在不丢失封装的情况下使用实例方法作为回调?

谢谢。


答案 1

是的,您似乎可以:

<?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;

因此,似乎,或者PHP的回调机制,知道它被调用的范围。preg_replace_callback()

测试于 5.2.8


答案 2

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

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


推荐