Могу ли я использовать частные методы экземпляра в качестве обратных вызовов?

В моем конкретном сценарии используется преобразование текста с использованием регулярных выражений в частном методе. Частный метод вызывает 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;

Итак, кажется, что preg_replace_callback() или механизм обратного вызова PHP знает область, в которой он был вызван.

Протестировано на 5.2.8

Ответ 2

Можно ли создать отдельный вспомогательный класс для обработки текста и создать метод обратного вызова в этом классе (он может быть открыт там)? Вы можете передать ссылку на исходный класс (объект), если вам нужен доступ к конкретным данным экземпляра.

Открытый интерфейс к вашему основному классу остается постоянным и чистым, и вы вытаскиваете определенную обработку строк из класса, который, вероятно, не принадлежит...

Ответ 3

Не можете ли вы использовать защищенные? Мне нужно знать, что отношения этих двух классов были по отношению друг к другу более ясными, но вы должны иметь возможность расширить класс и использовать новые защищенные методы, которые вы унаследовали, не делая их общедоступными.

Надеюсь, это поможет!

Приветствия