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