2012-08-23 12 views
5

Ich habe eine Frage in Bezug auf „dynamische“ Klasse Initialisierungsfeldes, lassen Sie mich erklären, was ich meine:

$class = 'User'; 
$user = new $class(); 

//...is the same as doing 
$user = new User(); 

So ... das ist nicht das Problem, aber ich bin einige Probleme, tut das gleiche, während eine statische Variable von einer Klasse aufrufen, zum Beispiel:

$class = 'User'; 
print $class::$name; 

, das die folgenden Fehler gibt aus:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in

Natürlich habe ich getestet print User::$name; und das funktioniert. Also Klasse funktioniert.

Warum ist das und gibt es einen Weg um es herum?

Follow-up-Frage:
Auch ist es gute Gründe, nicht um diese „dynamische“ Art und Weise zu verwenden, Klassen zu schaffen?

+0

Sie nicht dynamische und statische Anrufe mischen, das ist, warum es nicht möglich ist, Benutzer zu nennen :: $$ stützen und auch Ihre $ Klasse :: $ name –

+0

http://stackoverflow.com/questions/3679717/unexpected-t -paamayim-nekudotayim-on-ein-Computer-but-not-another-mit-php-5 –

+1

möglich duplizieren von [Zugriff auf eine statische Variable von $ var :: $ Verweis] (http://stackoverflow.com/questions/ 675.676/access-a-static-Variable-by-varreference) –

Antwort

1

Wenn Sie nicht über PHP-Version 5.3 und höher, und Sie wollen keine Reflektion verwenden (was meiner Meinung nach ein Overkill ist - es sei denn, Sie möchten auf mehrere statische Eigenschaften zugreifen), können Sie die Getterfunktion definieren und über call_user_func() aufrufen:

class A { 
    public static $var = "Hello"; 
    public static function getVar() { 
     return self::$var; 
    } 
} 
$className = "A"; 
echo call_user_func(array($className, 'getVar')); 
+0

Nun, das ist sicherlich eine Arbeit um das Problem ... Danke! – jamietelin

+0

Noch einfacherer Workaround scheint zu sein; '$ vars = get_class_vars ($ className);' – jamietelin

2

Dieser Code funktioniert gut auf PHP 5.4.3:

<?php 

class A { 
    public static $var = "Hello"; 
} 

print(A::$var); 

$className = "A"; 
print($className::$var); 

?> 
+2

Funktioniert auch in 5.3.2 –

+2

Dies ist der Code, den das OP hat. Vermutlich (obwohl er nicht angegeben hat) muss er eine frühere Version von PHP verwenden. –

+1

Nun, dann weiß ich, dass es meine PHP-Version ist, dass das Problem ist. :) Vielen Dank! – jamietelin

2

Dies ist die Antwort der Frage, die ich in den Kommentaren verknüpft:

You can use reflection to do this. Create a ReflectionClass object given the classname, and then use the getStaticPropertyValue method to get the static variable value.

class Demo 
{ 
    public static $foo = 42; 
} 

$class = new ReflectionClass('Demo'); 
$value=$class->getStaticPropertyValue('foo'); 
var_dump($value); 
+0

mit Reflexion scheint overkill Lösung, es sei denn Sie beabsichtigen, es auf eine große Anzahl von Eigenschaften der statischen Klassen zu verwenden, aber ja, mit Reflektion erhalten Sie das erforderliche Ergebnis –

+1

Auch klingt es durch die Fehlermeldung, dass OP eine Version von verwendet PHP vor welcher Version (5.3.etwas), die richtige Unterstützung für statische Klassen und statische Klassenvariablen hat und als solche die beste Option sein könnte. –

+0

Was sind die wirklichen Unterschiede, wenn ich nur die "echte" Klasse erstelle und dann meine Variable erhalte? Wie: $ user = new $ class(); print $ user-> name; '? Gibt es einen Leistungsgewinn durch die Verwendung von Reflection? – jamietelin

Verwandte Themen