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

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

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

Благодарю.

Ответы на вопрос(3)

Решение Вопроса

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

 22 июн. 2009 г., 19:13
особенность или ошибка? работает с 5.3rc2 / win32.
 Allain Lalonde22 июн. 2009 г., 19:55
Вау, это потрясающе круто, если они приняли во внимание сферу. Я приму, как только попробую.
 22 июн. 2009 г., 20:03
Подтверждено 5.2.9

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

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

ура

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

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

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

Ваш ответ на вопрос