Problem mit Gültigkeitsbereich von Funktionen innerhalb von Funktionen

worki2k1

Erfahrenes Mitglied
Hallo Leute,

heute hab ich ausnahmsweise mal ein größeres Problem. Es geht um den Gültigkeitsbereich von Funktionen innerhalb von Funktionen. Gibt es eine Möglichkeit eine Funktion, die innerhalb einer anderen Funktion deklariert wurde auch nur dort gültig zu machen und nicht außerhalb der ersten Funktion?

Das Problem ist folgendes:
Ich habe eine Klasse, in der gibt es eine Funktion, die eine weitere Funktion deklariert, die nur dort verfügbar sein soll. Beispiel:
PHP:
class A {
  function foo () {
    function bar () {
      // ...
    }

    // Die Funktion bar() soll nur innerhalb dieser foo() existieren und nicht global.
  }
}

Wenn ich nun eine erste Instanz von A erstelle, wird die funktion bar() beim aufruf von foo() initialisiert. Rufe ich nun foo() noch einmal auf oder erstelle eine neue Instanz von A und rufe dort foo() auf, geht das nicht, da bar() bereits deklariert wurde.

Gibt es dort eine Möglichkeit?
 
Kurze Frage: Warum?
Wenn Du eine Funktion hast die nur in einer einzigen Funktion genutzt werden soll, dann nutz sie doch einfach nur in dieser Funktion und in keiner anderen. Dann brauchst Du Dir nicht den Kopf zerbrechen wie Du sowas anstellen sollst.
Wenn Du verhindern willst, dass eine Funktion von ausserhalb des Objektes mittels $mein_object->meine_function() ansprechbar ist musst Du mit PHP5 und dem dort eingefuehrten Schluesselwort private arbeiten.
 
Dennis Wronka hat gesagt.:
Kurze Frage: Warum?
Wenn Du eine Funktion hast die nur in einer einzigen Funktion genutzt werden soll, dann nutz sie doch einfach nur in dieser Funktion und in keiner anderen. Dann brauchst Du Dir nicht den Kopf zerbrechen wie Du sowas anstellen sollst.
Wenn Du verhindern willst, dass eine Funktion von ausserhalb des Objektes mittels $mein_object->meine_function() ansprechbar ist musst Du mit PHP5 und dem dort eingefuehrten Schluesselwort private arbeiten.

Das ist an sich richtig. Ich erklär es nochmal genauer. Innerhalb der Funktion foo() soll man auf bar() zugreifen können. bar() stellt dabei eine Wrapper-Methode auf die Klassenmethode do() dar. Ich möchte damit verhindern, dass innerhalb der Funktion foo() mit $this->do() hantiert werden muss, sondern einfach bar() aufgerufen wird, die dann $this->do() aufruft. Das ganze soll passieren, weil Laien Code in der Funktion foo() reinschreiben können ohne, dass Sie $this benutzen müssen.
PHP:
class A {
  function do () {
    // Bearbeitet irgendwas und gibt was zurück
  }

  function foo () {
    function bar () {
      return $this->do ();
    }

    // Der Benutzer soll hier nicht mit $this->do() arbeiten, sonder mit bar(), die dann im Hintergrund $this->do() aufruft.
  }
}
 
Kurze Antwort: Kannst du vergessen. Wenn es eine Klassenfunktion ist, musst du immer mit $this arbeiten.
 
fanste hat gesagt.:
Kurze Antwort: Kannst du vergessen. Wenn es eine Klassenfunktion ist, musst du immer mit $this arbeiten.

Das vermute ich auch. Dann muss ich mir was anderes ausdenken irgendwie. Wenn ich dazu eine Lösung finden sollte, poste ich sie hier. Ich würde das Thema damit erstmal als erledigt markieren, aber wenn noch einer ne Idee hat, immer her damit.
 
Kleiner Nachtrag:

Ich habe jetzt eine Lösung gefunden. Sie ist zwar nicht mehr wirklich an OOP angelehnt, aber funktioniert in meinem Vorhaben trotzdem. Ich habe global im Script z.B. eine Variable $a festgelegt. Im Constructor der Klasse globalisiere ich diese mit global $a und weise dann $a eine Referenz auf die Klasse zu. Die Funktion bar() habe ich dann außerhalb der Klasse platziert. In dieser Funktion binde ich wieder $a mit global $a ein und da diese die Referenz auf die aktuelle Klasse hält, kann ich von dort auf $a->do() zugreifen. Die Funktion bar() kann ich aber innerhalb von foo() aufrufen.

Das ganze funktioniert bei mir aber nur weil sichergestellt ist, dass alle Klassen nacheinander initialisiert werden und auch die Funktion foo() nur einmal aufgerufen wird. Damit ist sichergestellt, dass $a immer die gerade zu bearbeitende Klasse enthält.
 
Das dürfte es auch tun:

PHP:
class A {
  function foo () {
    if (!function_exists('bar') {
        function bar () {
          // ...
        }
    }
    // Die Funktion bar() soll nur innerhalb dieser foo() existieren und nicht global.
  }
}
 
Zurück