PHP静态方法在成员变量中使用命名空间调用

时间:2016-03-21 08:04:34

标签: php namespaces

是否可以在php中执行此类操作?我希望在成员变量中有一个名称空间,并且总是能够调用该类的每个静态方法,就像我在下面所做的那样。

当然我的代码不起作用,但我只是想知道这是否可行,并且我接近解决方案,或者如果这完全不可能并且必须始终使用语法:< / p>

\Stripe\Stripe::setApiKey(..);

Similar question for clarifications

注意:我无法修改Stripe类,重要的是当未来的开发者必须更新Stripe API时它不会受到影响

简化代码:

class StripeLib
{
    var $stripe;

    public function __construct()
    {
        // Put the namespace in a member variable
        $this->stripe = '\\'.Stripe.'\\'.Stripe;
    }
}

$s = new StripeLib();

// Call the static setApiKey method of the Stripe class in the Stripe namespace
$s->stripe::setApiKey(STRIPE_PRIVATE_KEY);

2 个答案:

答案 0 :(得分:1)

是的,这样的事情是可能的。存在可以调用的静态class方法,该方法返回类的命名空间路径。

<?php
namespace Stripe;

Class Stripe {

    public static function setApiKey($key){
        return $key;    
    }

}

class StripeLib
{
    public $stripe;

    public function __construct()
    {
        // Put the namespace in a member variable
        $this->stripe = '\\'.Stripe::class;
    }
}

$s = (new StripeLib())->stripe;

// Call the static setApiKey method of the Stripe class in the Stripe namespace
echo $s::setApiKey("testKey"); //Returns testkey

答案 1 :(得分:0)

我刚试过它,是的,你可以在php中做到这一点。

但我认为你违反了依赖注入原则。 正确的方法是:

class StripeLib
{
    var $stripe;

    // make sure Stripe implements SomeInterface
    public function __construct(SomeInterface $stripe)
    {
        // Stripe/Stripe instance
        $this->stripe = $stripe;
    }
}