Могу ли я использовать частные методы экземпляра в качестве обратных вызовов?
В моем конкретном сценарии используется преобразование текста с использованием регулярных выражений в частном методе. Частный метод вызывает 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
Не можете ли вы использовать защищенные? Мне нужно знать, что отношения этих двух классов были по отношению друг к другу более ясными, но вы должны иметь возможность расширить класс и использовать новые защищенные методы, которые вы унаследовали, не делая их общедоступными.
Надеюсь, это поможет!
Приветствия