如何仅使那些在接口中声明的公共方法可用?

时间:2019-02-16 10:51:29

标签: php inheritance interface visibility

例如,在Java中,由于该语言的静态性质,因此开箱即用。但是在PHP中,从架构的角度来看,这尤其有用,可以确保代码的安全和整洁。

例如,我们有以下代码:

interface DocumentProcessorInterface

   public function process();

}

class GameSaveProcessorImpl implements DocumentProcessorInterface {

    public function process() {
        // do something useful
    }

    public function methodToSetSomethingFromFriendClass() {
       // setting private fields, some postponed initialization/resetting, etc
    }

}

然后,从某个类(我们称其为“朋友类”,因为它与GameSaveProcessorImpl类并排放置并对其进行补充),我们称为方法methodToSetSomethingFromFriendClass。由于使用PHP Duck进行键入,因此此类调用此方法的功能也可用于任何外来客户端代码,但此方法不适用于此类用法。外来(外部)客户代码必须仅使用DocumentProcessorInterface方法(这是我们完全使用接口的原因之一)。

想到了一些解决方案。

1)保持原样,但重命名接口中未包含的公共方法,因此对于那些外来客户端代码实现者而言,它可以作为警告,例如,将methodToSetSomethingFromFriendClass重命名为internalUseOnly_methodToSetSomethingFromFriendClass。降低偶尔使用的风险,但不禁止在技术上调用方法。

2)使用适配器(装饰器)图案。传递给没有methodToSetSomethingFromFriendClass方法的仅装饰外部代码的实例。它确实解决了不需要的方法访问问题,但使我们代码的其他部分非常复杂。似乎没有整体利润。

3)尚未对此想法进行任何验证:利用以下事实。基类可以声明受保护的方法,因此我们控制的所有朋友类都可以 从该基础类扩展而来,将我们的methodToSetSomethingFromFriendClass方法标记为受保护,可以有效地免受外部代码的攻击,但可以从“朋友”类中调用。从技术上讲,这可以提供保护,但是需要朋友类从通用基类继承,这种缺陷是众所周知的。

您知道什么更好的吗? 赞赏本文的链接并分享了该主题研究的经验。

0 个答案:

没有答案