php - 如何仅使接口中声明的那些公共方法可用?
问题描述
例如,在 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 的鸭子类型,这种调用此方法的能力也可用于任何外来客户端代码,但此方法不适用于此类用途。外来(外部)客户端代码必须只使用DocumentProcessorInterface
方法(这是我们使用接口的原因之一)。
想到了一些解决方案。
1)保持原样,但重命名不在接口中的公共方法,因此它对那些外来客户端代码实现者起到警告作用,例如,重命名methodToSetSomethingFromFriendClass
为internalUseOnly_methodToSetSomethingFromFriendClass
. 降低偶尔使用的风险,但在技术上不禁止调用方法。
2)使用适配器(装饰器)模式。传递给没有methodToSetSomethingFromFriendClass
方法的仅装饰实例的外部代码。它确实解决了不需要的方法访问的问题,但使我们代码的其他部分变得非常复杂。似乎没有整体利润。
3)尚未真正检查此想法的可行性:利用以下事实。基类可以声明受保护的方法,因此我们控制的所有朋友类都可以从该基类扩展,保持我们的方法methodToSetSomethingFromFriendClass
标记为受保护,有效地保护免受外部代码的影响,但可以从“朋友”类调用。从技术上讲,这允许保护,但需要朋友类从公共基类继承,这样的缺点是众所周知的。
你知道什么更好的吗?感谢文章的链接以及分享有关该主题研究的经验。
解决方案
推荐阅读
- kdb - 计算 kdb 中一个实例中的所有表
- python - Cannot call static content correctly
- arrays - 将矩阵中的每个元素乘以向量中的每个元素
- visual-studio - 抛出异常时执行不会停止
- html - 如何在引导程序 4 中的某些跨度周围获得紧密的边界?
- css - Gulp isn't compiling the scss code into css
- sql - Teradata 动态插入 - 循环?
- c++ - Defining methods outside of a class's scope via function pointers
- c# - Is there a DataGridView that supports VirtualMode and hierarchical data?
- ios - Swift 4 Firebase 云消息传递仅适用于单个设备