在运行时暴露私有/受保护方法的不良做法

时间:2015-04-26 21:04:18

标签: php reflection callable

好吧我不知道这是不好的设计,但我觉得做以下事情有点不好:

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 个答案:

答案 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你的代码;)