好吧我不知道这是不好的设计,但我觉得做以下事情有点不好:
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
}
}
有什么好的建议或其他想法如何解决这个问题?
答案 0 :(得分:0)
以下是对我要表达的内容的更清晰的解释。在下面的例子中,您看到我意识到公开公开doSomething函数没有任何危险,所以我改变它的范围而不是创建一个聪明的中间函数。
class One {
protected function doSomething( )
{
return 'hi';
}
}
class Two extends One {
public function doSomething( )
{
return parent::doSomething();
}
}
$Class = new Two();
echo $Class->doSomething();
少即是多,所以KISS你的代码;)