Powiedz, że mam zajęcia Core()
gdzie da mi instancję różnych klas w zależności od jakiejś inicjalizacji. Powiedz, że po jego zainicjowaniu dostaję lekcje, a potem chcę to zrobić. Tym się właśnie zajmuję:
$core = new Core();
// $core is further initiated
$api = $core->getClass(); // This returns, for instance class Library_MyClass
$class = new $api();
Czy istnieje sposób na połączenie dwóch ostatnich kroków w jeden? Na przykład mówię coś takiego $class = new $core->getClass()()
? Oczywiście to, co napisałem, jest złe, ale tego właśnie chciałem! Czy to jest możliwe?
Odpowiedzi:
1 dla odpowiedzi № 1Jeśli jest to jakaś fabryka, możesz zrobić coś takiego:
class Core
{
public function getClass()
{
return new Library_MyClass();
}
}
$core = new Core();
$class = $core->getClass();
Jednak biorąc pod uwagę nazwę klasy Core
Podejrzewam, że niektóre naruszasz Zasady SOLID tutaj.
0 dla odpowiedzi nr 2
Możesz skorzystać z korzystania z iniekcja zależności (biorąc pod uwagę niewielką aktualizację zastosowaną w przykładzie PeeHaa)
class Core
{
public function getClass($api)
{
return new $api();
}
}
$core = new Core();
$apiInstance = $core->getClass("Library_MyClass");
W ten sposób nie będziesz musiał aktualizować Core
klasa, ilekroć chcesz, aby zapewnić wystąpienie innej klasy biblioteki.