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

16

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

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

Благодарю.

Ваш Ответ

3   ответа
22

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

Вау, это потрясающе круто, если они приняли во внимание сферу. Я приму, как только попробую. Allain Lalonde
Подтверждено 5.2.9
особенность или ошибка? работает с 5.3rc2 / win32.
-1

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

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

ура

1

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

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

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

Похожие вопросы