Anhängen von Code in eine Methode

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Anhängen von Code in eine Methode

    Hat PHP irgend eine Möglichkeit bei einer vorhandenen Methode einer Klasse code zu inizieren?

    Ich habe eine Klasse Foo, die definiert eine Methode bar, welche den Zustand dieser Klasse ändert. Ich habe nun aber keine Möglichkeit durch Vererbung von Foo die methode bar zu überschreiben.

    Hat PHP irgend einen Handler der am Anfang und am Ende von Methoden aufgerufen wird? So ein onMethodEnter und Exit listener?
    SQL Injection kitteh is...

  • #2
    welche den Zustand dieser Klasse ändert
    Kannst du mal genauer erläutern? Anhand von einem Codebeispiel?

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Ich versuchs
      PHP-Code:
      class Foo
      {
        protected 
      $irgendwas;
        public function 
      bar()
        {
           
      $this->irgendwas 'was anderes';
        }
      }; 
      bar ändert den Zustand der Instanz der Klasse und ich würd gerne quasi noch Code inizieren ohne es an dieser Stelle zu tun.

      Quasi später im Code so was wie ein "afterBar" Hook, der nachträglich noch was ändert (so was wie die __get magic method nur für existierende Methode)
      Grund ist: Ich weiß nicht, was bar alles macht, aber ich weiß, was ich ändern will, die Stelle, an der ich das ändern will, hat aber keine Verbindung mit der Stelle, wo bar definiert wird(also keine Verbindung zum Code da oben)
      Ich will auch nicht eine dummy Methode in Foo haben, die leer ist, aber von bar aufgerufen wird.
      Ein Event-Dispatcher funktioniert an der Stelle leider auch nicht. Der Code muss wie ein Teil der Klasse von PHP gesehen werden
      Zuletzt geändert von Seikilos; 05.01.2010, 15:08.
      SQL Injection kitteh is...

      Kommentar


      • #4
        Suchst du das "Observer Design Pattern" ??


        Der Code muss wie ein Teil der Klasse von PHP gesehen werden
        Nein!
        Keine Chance.
        Wir werden alle sterben

        Kommentar


        • #5
          Zitat von Seikilos Beitrag anzeigen
          Der Code muss wie ein Teil der Klasse von PHP gesehen werden
          Warum das?
          Warum kannst du nicht eine Ableitung der Klasse erstellen und die Methode überschreiben?

          So wie du es beschreibst, funktioniert es nicht. PHP ruft nicht automatisch irgendwelche Funktionen auf, bevor oder nachdem es eine Methode ausführt. Es gibt auch keine Möglichkeit, soetwas zu implementieren, ohne die Methode oder ihren Aufruf zu verändern.

          Kommentar


          • #6
            Nein, das nicht.
            Observer Pattern ähenlt dem Event-Dispatcher, den ich erwähnte.
            SQL Injection kitteh is...

            Kommentar


            • #7
              Zitat von Seikilos Beitrag anzeigen
              Nein, das nicht.
              Observer Pattern ähenlt dem Event-Dispatcher, den ich erwähnte.
              Dann sehe ich keine Chance für dich.
              Wir werden alle sterben

              Kommentar


              • #8
                Ok, ich erkläre es mal mit viel Luft.

                Ich habe eine Klasse die ist tief in den Innereien eines Projekts begraben. Die Definiert ein komplexes Verhalten und funktioniert wunderbar, wenn man das Projekt über den Browser nutzt.

                Neben der normalen Nutzung gibt es aber eine TestSuite, die führt Regressionstest an dem kompletten integriertem System über einen dummy browser. Es werden also fake http requests gesendet.
                An dieser Stelle muss die oben erwähnte Klasse nun aber etws anderes tun. Sie soll sich unter Test anders verhalten. In der TestSuite komme ich aber an keine Instanz dieser Klasse, ich bin zwar ein php script, aber ich nutze aber eine php browser klasse.
                Was ich tun kann, ist die Methode in dem Test script zu überladen, ich kann mein Foo::bar quasi neu implementieren, um das andere Verhalten zu erzeugen. Aber ich will dass Foo::bar ausgeführt wird, weil die Implementierung korrekt ist und ich nachträglich nur eine Variable anpassen möchte.

                Ich kann an bar kein Event auslösen und kriege mein Mock Objekt auch nicht durch Vererbung durchgereicht bis zu dem Punkt, an dem quasi Foo durch MockFoo ersetzt werden könnte. Da wäre Vererbung kein Thema.
                Events gehen da nicht, weil die Klasse, so wie sie ist perfekt für den produktiven Einsatz ist und ich die Logik nicht um schmuzige Hacks erweitern will, nur um was zu testen
                SQL Injection kitteh is...

                Kommentar


                • #9
                  Es wäre sowieso falsch, das Verhalten von zu testendem Code für den Test zu verändern. Man will doch "den richtigen Code" "unter realen Bedingungen" testen. Wenn du zusätzlichen Code ausführst, testest du im Endeffekt nicht mehr das, was im Livebetrieb passiert und/oder müsstest irgendwie sicherstellen (durch Tests), dass der zusätzliche Code keine Nebenwirkungen hat, sich also in jeder Hinsicht identisch verhält.

                  Wieso simulierst du mit PHP nicht einfach den Browser? Oder benutzt gleich Selenium? Dann machst du sozusagen genau das selbe wie die TestSuite bisher und alles kann so bleiben wie es ist.

                  Kommentar


                  • #10
                    Naja, der Haken an der ganzen Sache ist, die beschriebene Klasse ist ein HTML Formular und das was ich zum Testen raushängen will ist das captcha

                    Ich sitz den ganzen Tag dran, selenium noch der Browser kriegen das captcha raus (was gut ist) und ich kann die Abfrage an den captcha server nicht faken (ist reCaptcha und die haben nur ne Api für "Antwort richtig" und "Antwort falsch")
                    :/
                    Aber was mir gerade klar geworden ist, ich kann mit dem Hack von mir, den hier beschrieben habe, zumindest den Captcha Validator überschreiben.
                    Dass muss ich mal testen
                    SQL Injection kitteh is...

                    Kommentar


                    • #11
                      Wenn den Objekt sein Verhalten anhand irgendwelcher Kriterien ändern soll, dann muss es Dinge über die Umwelt wissen. Es muß entscheiden können.

                      Kann es das nicht, dann ist es das falsche Objekt für diesen Zweck.
                      Wir werden alle sterben

                      Kommentar


                      • #12
                        Zitat von Seikilos Beitrag anzeigen
                        Naja, der Haken an der ganzen Sache ist, die beschriebene Klasse ist ein HTML Formular und das was ich zum Testen raushängen will ist das captcha

                        Ich sitz den ganzen Tag dran, selenium noch der Browser kriegen das captcha raus (was gut ist) und ich kann die Abfrage an den captcha server nicht faken (ist reCaptcha und die haben nur ne Api für "Antwort richtig" und "Antwort falsch")
                        Gibt es da keine Art "Test-Modus"? Sowas wäre nämlich üblich.

                        Kommentar


                        • #13
                          Was ist ein Testmodus? Ich erkenne natürlich, ob ich mich in test, prod oder dev environment befinde, will aber keine Hacks im funktionierenden Code dafür
                          SQL Injection kitteh is...

                          Kommentar


                          • #14
                            Zitat von Seikilos Beitrag anzeigen
                            Was ist ein Testmodus? Ich erkenne natürlich, ob ich mich in test, prod oder dev environment befinde, will aber keine Hacks im funktionierenden Code dafür
                            Üblicherweise haben API (zB. Bezahlsysteme) einen Testmodus, den man mit einem zusätzlichen Parameter aktivieren kann. Das sollte alles in der Doku stehen.

                            Kommentar


                            • #15
                              Du meinst die Api des captchas? Das schrieb ich ja weiter oben, dort hab ich als erstes gefragt, haben sie nicht. Fänd ich eigentlich auch sinnig
                              SQL Injection kitteh is...

                              Kommentar

                              Lädt...
                              X