Hallo Forum,
ich nutze ein USER_INT-Object, welches eine Methode einer Klasse aufruft. Ein weiteres USER_INT-Object auf der gleichen Seite ruft eine andere Methode derselben Klasse auf.
Leider werden 2 Instanzen der Klasse von Typo3 verwendet.
Ich möchte aber nur eine Instanz nutzen, damit die beiden Methoden über die Klassenvariablen "kommunizieren" können.
Hat jemand ein Idee dazu?
So binde ich die beiden Methodenaufrufe ins Template ein:
includeLibs.dummy = fileadmin/classes/myclass.php
lib.dummy1 = USER_INT
lib.dummy1 {
userFunc = user_object->method_one
}
lib.dummy2 = USER_INT
lib.dummy2 {
userFunc = user_object->method_two
}
}
Wenn du PHP5 verwendest, dann deklarier die Variablen als static. Erst dann sind es auch wirkliche Klassenvariablen. Ohne die static-Deklaration hast du "nur" Instanzvariablen. 😉
Hallo digedag,
digedag schrieb
Wenn du PHP5 verwendest, dann deklarier die Variablen als static. Erst dann sind es auch wirkliche Klassenvariablen. Ohne die static-Deklaration hast du "nur" Instanzvariablen. 😉
Ok, danke für die Info. In meiner Frage war tatsächlich ein Fehler versteckt. Die Methoden sollen nicht über Klassenvariablen kommunizieren, sondern über Instanzvariablen der Klasse. Außerdem hat die Klasse einen Konstruktor, der einige größere Aufgaben durchführt. Daher sollte dieser nach Möglichkeit nicht mehrfach aufgerufen werden, wie dies momentan geschieht.
Insgesamt führe ich 6-7 Methodenaufrufe über USER_INT-Objekte pro Seite durch. Das führt im moment zu ner Menge Overhead, den ich mit ein Klasseninstanz nicht hätte.
Du wirst Typo3 kaum daran hindern können, die Instanz zweimal zu erzeugen.
Aber wenn du Klassenvariablen, anstatt Instanzvariablen verwendest, dann kann dir das egal sein. Mache die Initialisierung lazy:
class Task {
static init = false;
public function Task() {
if(!self::$init) {
self::makeInit();
self::$init = true;
}
}
}
Bei PHP4 hast du natürlich IMHO verloren...
Danke Dir digedag,
das war die Idee, die mir fehlte.
Leider hostet dieser Kunde nicht direkt bei mir, sonst hätte ich PHP5. Beim derzeitigen Hoster ist dies leider nicht der Fall. :-( Aber vielleicht kann ich ja noch was bewegen.
Gruß,
Peter
warum fragst Du nicht einfach ab, ob die Klasse geladen ist?
t3lib_extMgm::isLoaded(classname)
Mmh, also laut Dokumentation prüft diese Funktion nicht, ob eine Klasse geladen wurde, sondern die Extension... Oder hat sich da was geändert?
Davon abgesehen würde ihm das auch nicht weiterhelfen, da er ja trotzdem noch eine Referenz auf die geladene Instanz benötigt! Diese enthält ja dann die gewünschten Daten.
die Methode prüft, ob eine Instanz der Klasse geladen ist. Ist dem so, kann man sie nutzen, ansonsten muss man eine neue Instanz bilden.
Ich warte erst mal ab, ob der Provider PHP5 updatet, bevor ich nen Workaround angehe. Ab der nächste Typo3-Version (laut Roadmap Januar 2008-) ist PHP5 ja eh Pflicht.
wieso? Das hat nichts mit php5 zu tun.
steffenk schrieb
die Methode prüft, ob eine Instanz der Klasse geladen ist. Ist dem so, kann man sie nutzen, ansonsten muss man eine neue Instanz bilden.
Hallo Steffen,
also das interessiert mich jetzt! Die Methode hat folgenden Code:
function isLoaded($key,$exitOnError=0) {
global $TYPO3_LOADED_EXT;
if ($exitOnError && !isset($TYPO3_LOADED_EXT[$key])) die('Fatal Error: Extension "'.$key.'" was not loaded.');
return isset($TYPO3_LOADED_EXT[$key]);
}
Da wird eindeutig der Extensionkey erwartet und kein Klassenname.
Außerdem wird ein boolean als Ergebnis geliefert. Womit erhälst du innerhalb TYPO3 Zugriff auf instanziierte Objekte? Verwendet TYPO3 intern einen Objektpool? Davon hab ich noch nix gesehen oder gelesen?? :o
ja, Du hast völlig recht, hab das verwechselt. Ich prüfe das sonst mit is_object, aber dann muss die Instanz global sein, sry für das Missverständnis.
Alles klar, dann bin ich beruhigt! 😉
Hätte ja sein können, daß es da wirklich was von T3 gibt.