Zugriff auf Klassenvariablen
Andreas Korthaus
- php
Hallo!
Das hatte ich zwar vor kurzem schonmal gefragt, aber die damals erlangte Lösung habe ich jetzt probiert und hat nicht funktioniert. Nochmal das Problem:
ich habe folgende Klasse, auf dessen Variablen ich aus einer anderen Klasse zugreifen wil. Wi mache ich das sinnvollerweise, möglichst ohne globale Variablen? so funktioniert es:
class Config {
var $lang = array();
function Config () {
// verfügbare Sprachen
$this->lang[] = 'de';
$this->lang[] = 'en';
}
function getCfgVar ($var) {
return $this->$var;
}
}
$config = new Config;
class Test {
function bla() {
global $config
var_dump($config->getCfgVar('lang'));
}
}
Jetzt wollte ich aber das es ohne "global" funktioniert, udn da wurde folgende Lösung gepostet:
class Config {
...
function getCfgVar ($var) {
if (!isset($this)) {
$this => new Config;
}
return $this->$var;
}
}
class Test {
function bla() {
var_dump(Config::getCfgVar('lang'));
}
}
Das funktioniert nicht, es gibt einen parse error in Zeile: "$this => new Config;"
Kann es daran liegen das ich nur PHP 4.2.3 habe?
mit Folgender Funktion funktioniert es dagegen:
function getVar ($var) {
global $__gv_config;
if (!is_object ($__gv_config)) {
$__gv_config = new Config();
}
return $__gv_config->$var;
}
}
$__gv_config = new Config();
Nur was ich mich frage - was habe ich davon? Das darf ich ja dann in jede Methode einbauen, auf die ich über Config:: zugreifen will, inzwischen finde ich eigentlich
global $config
$config->getCfgVar();
besser, da mir das irgendwie sauberer vorkommt.
Was meint Ihr dazu? Ich brache so eine oder mehrere Schnittstellen in fast jeder Klasse.
Grüße
Andreas
Hallo Andreas,
Erst mal sorry, dass ich im Modular-Thread nicht geantwortet habe, aber der war so schnell im Archiv und ich hatte wenig Zeit.
$this => new Config;
Tztztz. Wie instantiert man noch mal eine Klasse? Richtig:
$this =& new Config;
(oder $this = new Config; - da kopierst Du aber das Objekt noch mal)
Das Problem bei dieser Methode ist halt, dass jedes Mal eine neue Instanz erzeugt wird.
$__gv_config ist besser, da wird immer die eine Instanz verwendet.
Nur was ich mich frage - was habe ich davon? Das darf ich ja dann in jede Methode einbauen, auf die ich über Config:: zugreifen will, inzwischen finde ich eigentlich
global $config
$config->getCfgVar();besser, da mir das irgendwie sauberer vorkommt.
Was meint Ihr dazu? Ich brache so eine oder mehrere Schnittstellen in fast jeder Klasse.
Hmmm. Schwere Frage. IMHO ist es egal, (bis auf die erste Variante - die ist zwar sehr »elegant«, aber auch sehr langsam, da _jedes_ Mal eine neue Instanz erzeugt werden muss) auch vom Stil her. Je nachdem, was Dir am meisten zusagt von der Übersicht im Code. Ich selbst finde Config:: übersichtlicher, aber das ist sicherlich Geschmackssache.
Christian
Hallo Christian!
Tztztz. Wie instantiert man noch mal eine Klasse? Richtig:
$this =& new Config;
(oder $this = new Config; - da kopierst Du aber das Objekt noch mal)
ich habe an vielen Stellen gelesen das das Referenzieren langsamer ist als das Kopieren! Referenzieren sollte man wohl nur wenn man auch genau das will, und bei besonders viel Daten.
Das Problem bei dieser Methode ist halt, dass jedes Mal eine neue Instanz erzeugt wird.
ich erzeuge immer am Anfang _eine_ Instanz die ich dann immer verwende. Denn Config:: ist IMHO genauso einfach/eindeutig wie $config-> nur das ich das erheblich sauberer finde. Naja, mal gucken.
Hmmm. Schwere Frage. IMHO ist es egal, (bis auf die erste Variante - die ist zwar sehr »elegant«, aber auch sehr langsam, da _jedes_ Mal eine neue Instanz erzeugt werden muss) auch vom Stil her. Je nachdem, was Dir am meisten zusagt von der Übersicht im Code. Ich selbst finde Config:: übersichtlicher, aber das ist sicherlich Geschmackssache.
So langsam verstehe ich glaube ich, ich muß es erstmal probieren, wenn es nicht gefällt kenen ich ja eine Alternative!
Danke Dir!
Grüße
Andreas
Hallo Andreas,
ich habe an vielen Stellen gelesen das das Referenzieren langsamer ist als das Kopieren! Referenzieren sollte man wohl nur wenn man auch genau das will, und bei besonders viel Daten.
Wo steht das denn? Ich habe genau Gegenteiliges gehört. Ich referenziere immer wenn möglich.
ich erzeuge immer am Anfang _eine_ Instanz die ich dann immer verwende.
Bei $__gv_config: Ja. Bei $this = new Config; nein.
Christian
Hallo Andreas,
ich habe an vielen Stellen gelesen das das Referenzieren langsamer ist als das Kopieren! Referenzieren sollte man wohl nur wenn man auch genau das will, und bei besonders viel Daten.
Wo steht das denn? Ich habe genau Gegenteiliges gehört. Ich referenziere immer wenn möglich.
ich habe mich auch gewudert, habe das aber schon an einigen stellen geslesn, sogar offiziell im Manual, oder bei Pear oder sowas, leider finde ich die Stellen gerade nicht. Was ich gfunden habe:
" On the one hand, passing a variable by reference costs more in terms or performance than passing a copy, as PHP has more work to do locating the referenced value of the variable.
On the other hand, every copy of a variable we make uses up more of the memory available to PHP, so we also need to be careful here.
"
aus: http://www.phppatterns.com/index.php/article/articleview/23/1/2/
oder
"Note: There is no performance loss (since PHP 4 and up use reference counting) returning copies instead of references. On the contrary it is most often better to simply work with copies instead of references, because creating references takes some time where creating copies virtually takes no time (unless none of them is a large array or object and one of them gets changed and the other(s) one(s) subsequently, then it would be wise to use references to change them all concurrently)."
von: http://www.phphideout.com/manual.php/language.oop.newref.html
...http://www.google.de/search?q=performance+php+reference+copy
Es ist immer dasselbe:
Referenzen sind teuerer als Kopien, brauche aber weniger Memory. Je nach Daten ist mal das eine schneller, mal das andere. Die Unterschiede sind aber so marginal dass man immer nur das verwenden sollte was programmiertechnisch Sinn macht. Sich aus PErformance-Gründen für das eine oder das andere zu entscheiden ist nur in Ausnahmen der richtige Weg.
Und das ist wohl nicht nur in PHP so, in PHP seien Referenzen noch verhältnismäßig schnell, wobei das ganze mit ZE2 wieder anders ist, denn da werden Referenzen erheblich beschleunigt.
Aber wie gesagt, vernünftige Quellen kann ich leider nicht anbieten, wobei die Suchergebnisse IMHO schon eine deutliche Sprache sprechen. Ich hatte das nur mehrmals eher so nebenbei gelesen und ich weiß leider nicht mehr in welchem Zusammenhang. Habe jetzt ne ganze Zeit gesucht, aber finde nichts mehr. Schade eigentlich. Hatte auch was in einer Google-Group, da hatte jemand auch mal gemessen...
ich erzeuge immer am Anfang _eine_ Instanz die ich dann immer verwende.
Bei $__gv_config: Ja. Bei $this = new Config; nein.
und bei $config-> wird auch nur eien gebraucht - das meinte ich.
Grüße
Andreas