Zum Inhalt springen

USER/USER_INT bitte nur eine Instanz

Erstellt am 25. September 2007 · 12 Antworten · letzte Antwort am 27. September 2007

Tags: Frage

smilecloud ·

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
}

}
digedag ·

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. 😉

smilecloud ·

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.

digedag ·

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...

smilecloud ·

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

digedag ·

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.

steffenk ·

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.

smilecloud ·

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.

digedag ·
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

steffenk ·

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.