Плохая практика выставлять закрытые / защищенные методы во время выполнения

Хорошо, я не знаю, если это плохой дизайн, но я чувствую себя немного плохо из-за следующих действий:

abstract class A
{
abstract public function getCallable();
}

class B extends A
{
public function getCallable()
{
return array($this, 'doSomething');
}

protected function doSomething($param1, $param2, $param3)
{
// Do stuff here
}
}

Причина по которой B::doSomething защищен в том, что я не люблю выставлять этот метод, потому что он должен вызываться только из другого места в коде, где я делаю call_user_func() для возвращаемого значения B::getCallable,

Вы должны быть свободны, чтобы организовать себя в подклассах A, Не подвергая ничему снаружи. Таким образом, «API» не изменится на представление вне подклассов A,

Таким образом, вы не должны быть в состоянии сделать что-то вроде:

$b = new B();
$b->doSomething($param1, $param2, $param3);

единственный способ получить B::doSomething выполнено должно быть закончено:

$b = new B();
call_user_func($b->getCallable());

Поэтому я думаю о том, как мне этого добиться. Один из способов, о котором я мог подумать, это создать ReflectionMethod объект из B::getCallable()возвращаем значение и устанавливаем его доступным, если метод не является общедоступным.

Мне не нравится это решение, оно будет работать нормально, но не так элегантно:

class B extends A
{
public function getCallable()
{
return function($param1, $param2, $param3)
{
$this->doSomething($param1, $param2, $param3);
};
}

protected function doSomething($param1, $param2, $param3)
{
// Do stuff here
}
}

Любые хорошие предложения или другие идеи, как обойти это?

1

Решение

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

class One {
protected function doSomething( )
{
return 'hi';
}
}class Two extends One {
public function doSomething( )
{
return parent::doSomething();
}
}$Class = new Two();
echo $Class->doSomething();

Меньше значит больше, поэтому ПОЦЕЛУЙ свой код;)

0

Другие решения

Других решений пока нет …