我正在为我一直在研究的微框架构建一个插件接口,并试图解决一个概念问题。我决定制作的第一个“插件”是 Stripe 集成,本质上是采用 Stripe 的 PHP 库并将其包装为插件。我有一种工厂模式,它允许检索插件实例,例如:
$stripe = Iceberg::getPlugin('Stripe');
如果可以实例化一个类就足够简单了,但是对于 Stripe 库,所有类都是static。在他们的例子中,他们建议做一个include()
主 Stripe 文件,然后你可以像这样使用它:
Stripe::setApiKey('xyz');
我的断开连接是如何使我的getPlugin()
方法与只公开静态接口的类一起工作。我显然无法实例化该类并期望它正常工作,但同时,我希望此方法能够工作,而不管实例或静态对象如何。
我的一个想法是在我的 Stripe Plugin 类中实现一个__call()
方法,然后尝试将这些调用静态传递给 Stripe 库,例如:
在控制器中使用插件
$stripe = Iceberg::getPlugin('Stripe');
$stripe->setApiKey('xyz');
在插件中
public function __call( $name, $arguments )
{
Stripe::$name($arguments);
}
我不确定这样的事情是否会起作用,即使会,如果那是最好的方法。
TLDR:我如何创建一个可以与对象上下文和静态上下文中的类交互的对象?