2016-03-21 70 views
5

是否有可能在php中做這樣的事情?我想在一個成員變量中有一個名稱空間,並且總是能夠調用該類的每個靜態方法,就像我在下面做的那樣。使用成員變量名稱空間調用PHP靜態方法

當然,我的代碼不起作用,但我只是想知道這是否可能,而且我接近解決方案,或者如果這完全沒有問題,並且必須始終使用語法:

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

Similar question for clarifications

注:我不能修改條紋類,它是重要的它保持不變的未來時,開發者必須更新條紋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); 

回答

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 
+0

感謝您的及時回答大安。有沒有辦法讓它工作而不必使用$ stripeLib,只使用$ s?我擔心這會極大地混淆其他開發者 – NaturalBornCamper

+0

@NaturalBornCamper當然,我已經編輯了我的答案。 – Daan

+0

所以基本上這就像我鏈接的其他問題,它絕對必須在一個常規變量?它不能以$ this-> member :: setApiKey(「testKey」)的形式出現? – NaturalBornCamper

0

我剛測試過它,是的,你可以在php中做到這一點。

但我認爲你在這裏違反了依賴注入原則。 正確的做法是:

class StripeLib 
{ 
    var $stripe; 

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

有趣的答案科洛,謝謝你。我不能編輯Stripe類,但是它是一個官方API,我希望它保持完好,以便將來的開發人員在我離開後更新庫,而不必理解爲什麼它會被破壞;)應該提到的是,我會現在做 – NaturalBornCamper