Могу ли я использовать частные методы экземпляра в качестве обратных вызовов? - PullRequest
17 голосов
/ 22 июня 2009

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

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

Спасибо.

Ответы [ 3 ]

23 голосов
/ 22 июня 2009

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

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

1 голос
/ 22 июня 2009

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

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

0 голосов
/ 22 июня 2009

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

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

Приветствия

...