tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
1832
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Karl Förster
    Karl Förster Karl Förster ist offline Mitglied Platin
    Registriert seit
    Feb 2001
    Ort
    München
    Beiträge
    646
    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-Code:
    class {
      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?
     
    MfG

    Karl Förster
    Entwicklung / Development
    Appia, Inc.


    appia.com

  2. #2
    Avatar von Dennis Wronka
    Dennis Wronka Dennis Wronka ist offline Soulcollector
    Registriert seit
    Apr 2002
    Ort
    Hong Kong
    Beiträge
    12.296
    Blog-Einträge
    231
    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.
     
    PHP Class Collection - PHP-Klassen fuer PHP 5 (und Teilweise auch fuer PHP 4)
    Updates: Catcher 1.1, FTPConnection 1.2, MultiSQL 1.1, RSS2 1.1, SMTPConnection 1.4
    __________________
    EasyLFS - Hintergrundinformationen, Installationsanleitung, Softwareliste und Download
    EasyLFS Projektthread - Informationen, Status und Diskussion zu meiner Linux-Distribution
    __________________
    Ich bin die Schildkroete, mein Sohn. Ich habe das Universum erschaffen, aber bitte mach mir daraus keinen Vorwurf; ich hatte Bauchschmerzen.
    __________________
    Zitat Zitat von Friedrich Nietzsche
    Man muss noch Chaos in sich haben, um einen tanzenden Stern gebaeren zu koennen.

  3. #3
    Avatar von Karl Förster
    Karl Förster Karl Förster ist offline Mitglied Platin
    Registriert seit
    Feb 2001
    Ort
    München
    Beiträge
    646
    Zitat Zitat von Dennis Wronka
    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-Code:
    class {
      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.
      
    }

     
    MfG

    Karl Förster
    Entwicklung / Development
    Appia, Inc.


    appia.com

  4. #4
    Registriert seit
    Mar 2005
    Ort
    Bühl/Baden
    Beiträge
    2.330
    Kurze Antwort: Kannst du vergessen. Wenn es eine Klassenfunktion ist, musst du immer mit $this arbeiten.
     
    Gruß fanste

    Benutze bitte immer die passende Highlight-Tags.(z.B: für PHP [php] [/php] Allgemein: [highlight=SCRIPTSPRACHE]Code[/highlight] )

    Problem gelöst? Dann markiere das Thema bitte als erledigt!
    Beachte bitte die Netiquette. Insbesondere Punkt 15.

  5. #5
    Avatar von Karl Förster
    Karl Förster Karl Förster ist offline Mitglied Platin
    Registriert seit
    Feb 2001
    Ort
    München
    Beiträge
    646
    Zitat Zitat von fanste
    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.
     
    MfG

    Karl Förster
    Entwicklung / Development
    Appia, Inc.


    appia.com

  6. #6
    Avatar von Karl Förster
    Karl Förster Karl Förster ist offline Mitglied Platin
    Registriert seit
    Feb 2001
    Ort
    München
    Beiträge
    646
    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.
     
    MfG

    Karl Förster
    Entwicklung / Development
    Appia, Inc.


    appia.com

  7. #7
    Registriert seit
    Mar 2005
    Ort
    Bühl/Baden
    Beiträge
    2.330
    Könntest du das mal mit einem Codebeispiel zeigen? Ich komm da jetz grad nicht mit
     
    Gruß fanste

    Benutze bitte immer die passende Highlight-Tags.(z.B: für PHP [php] [/php] Allgemein: [highlight=SCRIPTSPRACHE]Code[/highlight] )

    Problem gelöst? Dann markiere das Thema bitte als erledigt!
    Beachte bitte die Netiquette. Insbesondere Punkt 15.

  8. #8
    Pendergast Pendergast ist offline Mitglied Gold
    Registriert seit
    Apr 2004
    Beiträge
    183
    Das dürfte es auch tun:

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

     

Ähnliche Themen

  1. Struct innerhalb einer Funktionen
    Von Bismark im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 23.06.08, 21:12
  2. Antworten: 2
    Letzter Beitrag: 04.09.07, 07:19
  3. Antworten: 9
    Letzter Beitrag: 10.05.05, 22:03
  4. Problem mit Funktionen
    Von sub im Forum Borland CBuilder und VCL
    Antworten: 4
    Letzter Beitrag: 11.06.04, 00:43
  5. Antworten: 1
    Letzter Beitrag: 06.10.03, 15:40