2013-02-02 17 views
5

muszę używać nazwy klasy jako stały dla Dostęp do tej klasy własności statyczne, czyliZastosowanie stałej jak nazwa klasy

class a { 

    public static $name = "Jon"; 

} 

define("CLASSNAME", "a"); 

echo CLASSNAME::$name; 

to zwraca błąd, że klasa CLASSNAME nie istnieje. Istnieje rozwiązanie? absolutny bałagan

+1

Dobre pytanie. Hmm. – Prash

+0

Być może, jeśli określisz, co naprawdę chcesz zrobić, może istnieć kilka lepszych alternatywnych sposobów. Może to być problem [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

Odpowiedz

4

Jest to możliwe z refleksji:

class a { 

    public static $name = "Jon"; 

} 

define("CLASSNAME", "a"); 

$obj = new ReflectionClass(CLASSNAME); 
echo $obj->getStaticPropertyValue("name"); 

Jeśli jest to dobry wybór projektu to inna kwestia ...

+0

tak, działa. – ripa

0

szukałem w ten problem, ponieważ klasa opiera się na pewnym kontekście, który należy podać. Więc zrobiłem funkcję w mojej klasie, która będzie zwracać klasę można wymagać tak:

/** 
* Instantiate a class by class name in variable 
* 
* @param string $className The name of the class 
* @return mixed The instantiated class 
*/ 
protected function getClass($className) 
{ 
    return new $className; 
} 

Dlatego można nazwać za pomocą $class = new $this->getClass(static::CLASSNAME); gdy określona stałą w aktualnej klasy, która przechowuje nazwę klasy ty chcesz utworzyć instancję. W twoim przypadku możesz go używać bez "static::" lub dowolnej zmiennej, której chcesz użyć. Nie zapomnij zaimplementować obsługi błędów.

Powiązane problemy