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

В моем конкретном сценарии используется преобразование текста с использованием регулярных выражений в частном методе. Частный метод вызывает preg_replace_callback, но кажется, что обратные вызовы должны быть общедоступными для объектов, поэтому я застрял, вырвавшись из частного мира и раскрывая детали реализации, когда я бы предпочел.

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

Благодарю.

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

Да, кажется, вы можете:

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

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

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

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

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

ура