Хорошо, я не знаю, если это плохой дизайн, но я чувствую себя немного плохо из-за следующих действий:
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
}
}
Любые хорошие предложения или другие идеи, как обойти это?
Вот более четкое объяснение того, что я пытаюсь сформулировать. В приведенном ниже примере вы видите, что я понимаю, что нет никакой опасности публично раскрывать функцию doSomething, поэтому я изменяю ее область действия вместо создания умной посреднической функции.
class One {
protected function doSomething( )
{
return 'hi';
}
}class Two extends One {
public function doSomething( )
{
return parent::doSomething();
}
}$Class = new Two();
echo $Class->doSomething();
Меньше значит больше, поэтому ПОЦЕЛУЙ свой код;)
Других решений пока нет …