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

StackOverflow https://stackoverflow.com/questions/1028035

  •  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?Мне нужно было бы знать, каковы были взаимоотношения этих двух классов друг с другом, чтобы было более понятно, но вы должны иметь возможность расширять класс и использовать новые защищенные методы, которые вы унаследовали, не делая их общедоступными.

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

Ваше здоровье

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top