Переопределение функции (override)

29 янв. 2014 г., 22:47:40
Просмотры: 26.1K
Голосов: 3

Какой лучший способ изменить ранее объявленную функцию на новую?

например, уже объявлено:

function smth(){
echo 'aaa'; // выводит aaa
}

и я хочу, чтобы выводилось не aaa, а bbb

function smth(){
echo 'bbb'; // выводит bbb
}

но когда я вставляю новую функцию (внутри functions.php), я получаю сообщение об ошибке

(Fatal error: Cannot redeclare **smth()** (previously declared in ... )



ОБНОВЛЕНИЕ - Я нашел решение:

https://stackoverflow.com/a/8125517/2165415

0
Все ответы на вопрос 3
0

В PHP нельзя переобъявлять функции. Вам потребуется использовать другой подход, например, фильтры или что-то подобное.

29 янв. 2014 г. 23:07:00
0

PHP не позволяет переопределять функции. Если вы написали оригинальную функцию, существует множество способов сделать её более гибкой.

Условные проверки переданных аргументов и хуки-фильтры — первое, что приходит на ум.

ПРИМЕР 1:

function smth( $out = 'a' ){
  if ( $out === 'a' ) {
    echo 'aaa';
  } else {
    echo 'bbb';
  }
}

После этого первый вызов:

smth();

и второй раз:

smth('b');

ПРИМЕР 2

function smth(){
  echo apply_filters('my_smth_filter', 'aaa');
}

После этого первый вызов:

smth();

и второй раз:

add_filter('my_smth_filter', function() {
  return 'bbb';
});
smth();

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

30 янв. 2014 г. 01:15:44
0

Я бы рекомендовал использовать объектно-ориентированный подход, например:

class SomeClass
{
  public function aa()
  {
     echo 'aa';
  }
}

class SomeOtherClass extends SomeClass
{
   public function aa()
   {
      return 'bb';
   }
}

$a = new SomeClass();
$a->aa(); // выводит aa
$b = new SomeOtherClass();
$b->aa(); // выводит bb
30 янв. 2014 г. 11:43:07