В моем конкретном сценарии используется преобразование текста с использованием регулярных выражений в частном методе. Частный метод вызывает preg_replace_callback, но кажется, что обратные вызовы должны быть общедоступными для объектов, поэтому я застрял, вырвавшись из частного мира и раскрывая детали реализации, когда я бы предпочел.
Итак, в двух словах: могу ли я использовать метод экземпляра в качестве обратного вызова без потери инкапсуляции?
Благодарю.
Да, кажется, вы можете:
<?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
Можете ли вы создать отдельный вспомогательный класс для обработки текста и создать метод обратного вызова в этом классе (он может быть открыт там)? Вы можете передать ссылку на исходный класс (объект), если вам нужен доступ к данным конкретного экземпляра.
Открытый интерфейс к вашему основному классу остается последовательным и чистым, и вы вытаскиваете определенную обработку строк из класса, который, вероятно, не принадлежит …
Не можете ли вы использовать защищенные? Мне нужно знать, что отношения этих двух классов были по отношению друг к другу более понятными, но вы должны иметь возможность расширить класс и использовать новые защищенные методы, которые вы унаследовали, не делая их общедоступными.
Надеюсь это поможет!
ура