Ка называется такая парадигма/паттерн (описание внутри)?

class SomeClass {
  __call($functionName, $arguments)
  {
    return call_user_func([ self, $functionName . '_' ], $arguments);
  }
  
  __callStatic($functionName, $arguments)
  {
    return call_user_func([ self, $functionName . '_' ], $arguments);
  }
  private function someFunction_(){
    if(empty($this))
    {
      echo 'статичный контекст';
    }
    else
    {
      echo 'объектный контекст';
    }
  }
}
$obj = new SomeClass;
$obj->someFunction();  // 'объектный контекст';
SomeClass::someFunction(); // 'статичный контекст'


Суть в том, что функции доступны и в объектном и в статичном контексте по одному имени/ключу.
Это происходит потому, что функции "someFunction" не существует. И поэтому, вызывается магический метода __call() или __callStatic() в зависимости от контекста. Далее к названию функции добавляется "_" и функция вызывается по имени.

Вот собственно меня и интересует, как называется это прием.
  • Вопрос задан
  • 2496 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
По-моему, этот паттерн называется "костыль".
К тому же, от E_STRICT "non-static method SomeClass::someFunction_() should not be called statically" вы никуда не делись.

class SomeClass {
  public function someFunction(){
    if(empty($this))
    {
      echo 'статичный контекст';
    }
    else
    {
      echo 'объектный контекст';
    }
  }
}
$obj = new SomeClass;
$obj->someFunction();  // 'объектный контекст';
SomeClass::someFunction(); // 'статичный контекст'

Результат тот же самый.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Lerg
@Lerg
Defold, Corona, Lua, GameDev
В общем случае это полиморфизм.
Ответ написан
@kazin8
Сложно даже сказать, как этот прием назвать...
По сути, это перехват вызова метода и определение контекста этого самого вызова
Не думаю, что для подобных вещей есть смысл придумывать название. В общем случае - это просто часть какого-либо паттерна (м. б. fluent interface). Попробуйте пролистать статью и почитать комменты вот здесь : habrahabr.ru/post/175935
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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