tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
14
ZUGRIFFE
418
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von einfach nur crack
    einfach nur crack einfach nur crack ist gerade online mag Cookies & Kekse
    tutorials.de Premium-User
    Registriert seit
    May 2007
    Ort
    Dresden (Sachsen)
    Beiträge
    1.499
    Hallo,

    ich bin gerade wieder dabei mir eine Klasse zu basteln, welche man dann in etwa so aufrufen kann:
    Code PHP:
    1
    2
    
    $class = new Class();
    $class->func_1()->func_2()->func_3() ... ->func_n();
    Das habe ich bisher so gelöst, dass diese Klasse auf einer untergeordneten Klasse arbeitet.

    Wo liegt mein Problem?
    Mein Problem liegt darin, dass man nicht nur die Methoden so aufrufen soll ($a->func1()->func2()->func3()) sondern auch mal so ($a->func1()->func2()). Es gibt also Methoden, die man an andere noch extra anhängen kann, aber nicht muss. Die Schwierigkeit ist jetzt, dass ich einzelnen Daten intern zwischen speichere und dann in der letzten Methode in dieser Reihe ausführen will. Die Frage ist nur, ob es eine Möglichkeit gibt, dass man erkennt, ob eine Methode die Letzte in einer Reihe ist. Was auch gehen würde, wäre wenn man vor dem Aufrufen einer solchen Methoden-Reihe die Daten zurücksetzt - Frage ist nur wie.

    Ich hoffe, ich konnte das verständlich erklären. Ansonsten noch mal nachfragen und schon jetzt Danke an alle, die mir helfen wollen/können.
    Geändert von einfach nur crack (08.05.09 um 19:07 Uhr)
     
    Ich mag:
    • positive Bewertungen meiner Beiträge
    • ein Danke für meine hilfreichen Beiträge

    Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX

    ... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.

  2. #2
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.127
    Hallo,

    ich denke, hier hilft dir die magische Methode __call() weiter.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  3. #3
    Avatar von einfach nur crack
    einfach nur crack einfach nur crack ist gerade online mag Cookies & Kekse
    tutorials.de Premium-User
    Registriert seit
    May 2007
    Ort
    Dresden (Sachsen)
    Beiträge
    1.499
    So. Ich habe mir mal ein kleines Beispiel dafür programmiert, ähnlich dem Beispiel im PHP Handbuch.
    Code PHP:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    <?php
    class test
     {
      function test1()
       {
        echo 'Ich bin die Methode test1()'."\n";
       }
      
      function test2()
       {
        echo 'Ich bin die Methode test2()'."\n";
       }
      
      function __call($name, $args)
       {
        echo 'Methodenname: '.$name."\n";
       }
      
     }
     
    $test = new test;
    $test->test1();
    $test->test2();
    ?>

    Jetzt müsste mir ja ausgegeben werden..
    Code :
    1
    2
    3
    4
    
    Ich bin die Methode test1()
    Methodenname: test1
    Ich bin die Methode test2()
    Methodenname: test2
    ..aber leider wird nur folgendes ausgegeben:
    Code :
    1
    2
    
    Ich bin die Methode test1()
    Ich bin die Methode test2()

    Ich benutzte die PHP Version 5.2.5 - liegt es jetzt daran, dass ich eine zu niedrige PHP Version habe oder das ich diese Methode falsch anwende? Eine Suche bei Google ergab keine eindeutige PHP Version ab welcher die Methode __call() verfügbar ist.

    // EDIT: Ich habe jetzt mit Hilfe von dieser Seite erfahren, dass diese Methode dafür da ist, dass falls eine unbekannte Methode aufgerufen wird diese als Ersatz aufgerufen wird, somit ist mein Beispiel oben verständlicher Weise Blödsinn.
    Geändert von einfach nur crack (11.05.09 um 00:13 Uhr)
     
    Ich mag:
    • positive Bewertungen meiner Beiträge
    • ein Danke für meine hilfreichen Beiträge

    Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX

    ... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.

  4. #4
    Avatar von einfach nur crack
    einfach nur crack einfach nur crack ist gerade online mag Cookies & Kekse
    tutorials.de Premium-User
    Registriert seit
    May 2007
    Ort
    Dresden (Sachsen)
    Beiträge
    1.499
    An saftmeister: ich habe jetzt noch mal überlegt und bin jetzt soweit gekommen, dass ich überhaupt nicht verstehe auf welche Art und Weise mir die Methode __call() helfen soll. Könntest du mir deinen Gedankengang noch mal schildern? Wäre ganz nett.
     
    Ich mag:
    • positive Bewertungen meiner Beiträge
    • ein Danke für meine hilfreichen Beiträge

    Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX

    ... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.

  5. #5
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.127
    Hallo,

    ich denke, ich habe deinen Ausgangspost falsch verstanden:

    Es gibt also Methoden, die man an andere noch extra anhängen kann, aber nicht muss.
    Ich bin davon ausgegangen, das du meintest, die Methoden müssen nicht unbedingt implementiert werden. Genau dann, wenn eine Methode in einer Klasse _nicht_ unbedingt definiert sein muss, kann man __call() verwenden. Da du es anscheinend anders gemeint hast, ist mein Vorschlag natürlich obsolet. __call() reagiert auf einen Methoden-Aufruf einer Klasse, die die aufgerufene Methode _nicht_ implementiert.

    Was du bräuchtest, wäre eine Art Objekt-Proxy. Ich habe sowas noch nicht gemacht, da ich es nicht benötigt habe. Vielleicht kannst du jedoch mit diesem Stichwort irgendwas finden.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  6. #6
    Avatar von einfach nur crack
    einfach nur crack einfach nur crack ist gerade online mag Cookies & Kekse
    tutorials.de Premium-User
    Registriert seit
    May 2007
    Ort
    Dresden (Sachsen)
    Beiträge
    1.499
    Danke, dass klingt schon viel versprechend. Melde mich wieder, wenn ich was gefunden habe (oder immer noch nicht weiter weiß).
     
    Ich mag:
    • positive Bewertungen meiner Beiträge
    • ein Danke für meine hilfreichen Beiträge

    Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX

    ... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.

  7. #7
    DeluXe DeluXe ist offline Funkjoker
    Registriert seit
    Jul 2004
    Ort
    Offenburg
    Beiträge
    847
    Leider habe ich gerade nicht die Zeit mich selbst damit zu befassen, aber die Datenbank-Klasse von TYPOlight nutzt diese Art der Methodenaufrufe.
    (Weiss ich auch nur, da ich ein Modul dafür entwickel.)

    Kannst ja mal schauen wie das dort gemacht ist.

    Würde mich nämlich auch interessieren, wie das abläuft.
     
    mfg

    DeluXe

  8. #8
    Avatar von einfach nur crack
    einfach nur crack einfach nur crack ist gerade online mag Cookies & Kekse
    tutorials.de Premium-User
    Registriert seit
    May 2007
    Ort
    Dresden (Sachsen)
    Beiträge
    1.499
    an DeluXe: Ich habe mir die Datenbank Klasse mal angesehen und muss sagen, dass das schon langsam in die Richtung geht, die ich suche. Aber eben noch nicht ganz. Ich zeige euch mal, wie das in TYPOlight gelöst wurde:
    Code PHP:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    function __get($func)
     {
      switch($func)
       {
        case 'func1':
         return $this->func1();
         break;
       
         case 'value':
          return $this->value;
          break;
        
         default:
          return $this;
          break;
       }
     }

    Das hat aber als Nachteil, dass dann nur am Ende der Kette eine Funktion stehen kann. Die Frage wäre nun, wie man dass auch für Funktionen erreicht, also genauer gesagt, wie man eine geregelte Verkettung erstellen kann.
     
    Ich mag:
    • positive Bewertungen meiner Beiträge
    • ein Danke für meine hilfreichen Beiträge

    Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX

    ... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.

  9. #9
    DeluXe DeluXe ist offline Funkjoker
    Registriert seit
    Jul 2004
    Ort
    Offenburg
    Beiträge
    847
    Entweder verstehe ich dich falsch oder du liegst falsch.

    Weil in TL kann man z. B. mit diesem Befehl eine Query ausführen:
    PHP-Code:
    $db->prepare'SELECT * FROM foo WHERE bar = %d' )->execute$int ); 
    Und das sind ja zwei Funktionen hintereinander, nicht nur eine am Ende.
     
    mfg

    DeluXe

  10. #10
    Avatar von einfach nur crack
    einfach nur crack einfach nur crack ist gerade online mag Cookies & Kekse
    tutorials.de Premium-User
    Registriert seit
    May 2007
    Ort
    Dresden (Sachsen)
    Beiträge
    1.499
    Mh, dass stimmt natürlich. Ich habe jedenfalls gestern Abend nur die obenstehende Lösung gefunden. Dann werde ich wohl weitersuchen müssen. Du könntest mir aber helfen in dem du mir sagst auf welche PHP-Datei du dich beziehst, da es in TYPOlight mehrere Datenbank-Klassen gibt.

    // EDIT: Ich habe es jetzt nicht gefunden, aber dafür habe ich jetzt noch mal selber intensiv nachgedacht und bin zu folgender Lösung gekommen, welche auch funktioniert und die von saftmeister genannte Funktion __call() verwendet:
    Code PHP:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    function __call($name, $args)
     {    
      switch($name)
       {
        case 'func2':
         return $this->sub_func2($args);
        
        case 'func3':
         return $this->sub_func3($args);
        
        case 'func4':
         return $this->sub_func4($args);
        
        default:
         trigger_error('Call to undefined method '.__CLASS__.'::'.$name.'()', E_USER_ERROR);
         return NULL;
       }
     }
    Die Idee die dahinter steckt ist die, dass man so nur bestimmte Funktionen, welche als private gekennzeichnet werden, aufrufen kann. Um sie zu kennzeichnen habe ich hier einfach die Markierung sub_ verwendet. Man kann also jetzt in der Funktion __call() auch noch nachschauen, ob diese Funktion an dieser Stelle überhaupt gültig ist und man sie so aufrufen darf. Ansonsten wird eben NULL ausgegeben und damit es ein wenig wie echt wirkt auch noch die Standard-Fehlermeldung mit trigger_error().

    Würde mal gerne wissen, was ihr von der Idee haltet. Verbesserungsvorschläge sind erwünscht!
    Geändert von einfach nur crack (12.05.09 um 15:18 Uhr) Grund: Möglicher Lösungsansatz gefunden
     
    Ich mag:
    • positive Bewertungen meiner Beiträge
    • ein Danke für meine hilfreichen Beiträge

    Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX

    ... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.

  11. #11
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.127
    Hallo,

    du kannst dir den switch sparen, wenn du die Methode method_exists() verwendest:

    PHP-Code:
    public function __call($func$args)
    {
      if(
    method_exists($this$func))
      {
        return 
    call_user_func(array($this$func));
      }
      else
      {
         throw new 
    Exception("Method $func does not exists!");
      }

    Ohne Garantie, das da Fehler drin ist; hab das auf dem Kopf gemacht . Funktionieren dürfte es allerdings so oder so ähnlich.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  12. #12
    Avatar von einfach nur crack
    einfach nur crack einfach nur crack ist gerade online mag Cookies & Kekse
    tutorials.de Premium-User
    Registriert seit
    May 2007
    Ort
    Dresden (Sachsen)
    Beiträge
    1.499
    Der Gedanke hinter der SWITCH-Anweisung war, dass man für jede Methode, welche aufgerufen wird, speziell Ausführungen schreiben kann.
     
    Ich mag:
    • positive Bewertungen meiner Beiträge
    • ein Danke für meine hilfreichen Beiträge

    Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX

    ... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.

  13. #13
    DeluXe DeluXe ist offline Funkjoker
    Registriert seit
    Jul 2004
    Ort
    Offenburg
    Beiträge
    847
    Um nochmal auf TYPOlight zurück zu kommen.

    (Ich hoffe ich bekomm alles noch aus dem Kopf richtig zusammen. )

    Es gibt einen Ordner system/libraries, in welchem eine Database.php liegt. Diese enthält ein paar abstrakte Klassen.
    Je nach dem, welche Datenbank man verwendet, wird dann aus dem Ordner system/Drivers die Datei DB_MYSQL.php, DB_MSSQL.php, etc. geladen.
    Das sollte eigentlich schon alles sein, zumindest kann ich mich an keine weiteren Klassen erinnern, die mit der Datenbank-Klasse in Zusammenhang gestanden haben könnten.

    Allerdings habe ich absolut nichts darüber gefunden, wodurch diese Function-Chain (Keine Ahnung wie das wirklich heisst.) ermöglicht wird, da auch so gut wie keine magische Funktionen verwendet werden.

    *edit*
    Achso, um auf deinen letzten Post einzugehen.
    Ich persönlich finde die Idee mit dem Switch vollkommen am eigentlichen Thema vorbei.

    Ob ich $foo->bar() aufrufe und dann in einem Switch lande und dieser komisches Zeug macht, oder ob ich tatsächlich die Methode bar() definiere, die im Endeffekt genau das selbe macht wie der Switch, macht in meinen Augen keinerlei unterschied - ausser das letztere Variante übersichtlicher ist.
    Geändert von DeluXe (23.05.09 um 14:47 Uhr)
     
    mfg

    DeluXe

  14. #14
    Registriert seit
    Feb 2002
    Ort
    Österreich | Vorarlberg
    Beiträge
    613
    Bzgl. deines ersten Postings in diesem Thread. Das gewünsche Verhalten lässt sich da ganz einfach mit Fluent Interfaces umsetzten. Infos diesbzgl. findest du hier:

    http://en.wikipedia.org/wiki/Fluent_interface

    mit freundlichen Grüßen
    Samuel Weber
     

  15. #15
    DeluXe DeluXe ist offline Funkjoker
    Registriert seit
    Jul 2004
    Ort
    Offenburg
    Beiträge
    847
    Ein return $this; ist alles?

    Das ist ja langweilig..

    Danke Dir für die Info.
     
    mfg

    DeluXe

Ähnliche Themen

  1. Dateien automatisch löschen
    Von bl5000 im Forum PHP
    Antworten: 21
    Letzter Beitrag: 12.11.10, 18:20
  2. Automatisch löschen mit PS 3?
    Von Alex363 im Forum Photoshop
    Antworten: 4
    Letzter Beitrag: 17.02.09, 15:55
  3. Automatisch löschen
    Von PsychoGiga im Forum PHP
    Antworten: 20
    Letzter Beitrag: 02.11.04, 22:24
  4. Datensatz automatisch löschen
    Von andyK im Forum PHP
    Antworten: 13
    Letzter Beitrag: 27.08.04, 20:41
  5. session automatisch löschen
    Von oaki im Forum PHP
    Antworten: 4
    Letzter Beitrag: 23.07.04, 16:31