2016-03-21 13 views
5

czy można zrobić coś takiego w php? Chcę mieć przestrzeń nazw w zmiennej członkowskiej i po prostu zawsze móc wywoływać każdą statyczną metodę tej klasy, tak jak to robię poniżej.Wywołanie metody statycznej PHP z przestrzenią nazw w zmiennej członkowskiej

Oczywiście mój kod nie działa, ale po prostu zastanawiam się, czy to w ogóle możliwe i że jestem bliski rozwiązania, lub jeśli jest to całkowicie wykluczone i zawsze należy użyć składni:

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

Similar question for clarifications

UWAGA: nie mogę zmodyfikować klasę Stripe, ważne pozostaje nietknięty, gdy przyszłe deweloperów musi zaktualizować API paskiem

kod uproszczonej:

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); 

Odpowiedz

1

Tak, coś takiego jest możliwe. Istnieje metoda statyczna class, którą można wywołać, która zwraca ścieżkę przestrzeni nazw klasy.

<?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

Dzięki za szybką odpowiedź Daan. Czy jest jakiś sposób, żeby to działało bez użycia $ stripeLib, używaj tylko $ s? Obawiam się, że to niezmiernie zmyli innych twórców. – NaturalBornCamper

+0

@NaturalBornCamper Tak, oczywiście, zredagowałem swoją odpowiedź. – Daan

+0

Więc w zasadzie jest to podobne do innego pytania, które łączyłem, to absolutnie musi być w regularnej zmiennej? Nie może być w postaci $ this-> member :: setApiKey ("testKey")? – NaturalBornCamper

0

Właśnie to przetestowałem, tak, możesz to zrobić w php.

Ale myślę, że naruszasz zasadę Dependency Injection tutaj. Właściwy sposób to:

class StripeLib 
{ 
    var $stripe; 

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

Ciekawa odpowiedź Keloo, dzięki za to. Nie mogę edytować klasy Stripe, ale jest to oficjalne API i chciałbym zachować to w nienaruszonym stanie, kiedy przyszli deweloperzy aktualizują bibliotekę po moim odejściu, nie zastanawiając się, dlaczego to jest zepsute;) Powinienem to wspomnieć, ja Zrób to teraz – NaturalBornCamper

Powiązane problemy