Includen von Methoden !?

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

  • Includen von Methoden !?

    Includen von Methoden !?

    Hi,
    ich möchte eine Anfrage auf eine Methode mit __call() abfangen,
    und die gewünschte methode includen, falls diese nicht definiert sein sollte,
    oder einfach für bessere Strukturierung, eine Klasse nicht durch Vererbung zusammenbauen,
    sondern durch includen der Methoden, gibt es dazu irgendeinen mir nicht bekannten Trick oder ist es
    überhaupt Möglich ?

    Nochmal auf den Punkt: Ich möchte Methoden innerhalb einer Klasse Includen !


  • #2
    includen kannst erstmal nur Dateien.

    Woher soll PHP auch wissen, aus welcher Klasse die Methode kommt?
    Sunshine CMS
    BannerAdManagement
    Borlabs - because we make IT easier
    Formulargenerator [color=red]Neu![/color]
    Herkunftsstatistik [color=red]Neu![/color]

    Kommentar


    • #3
      [OOP]

      Jo mir schon klar das ich nur dateien includen kann, die methoden sollen ja dann auch in Dateien gespeichert sein.

      PHP-Code:

      // Inhalt von meine_methode.meth.php 

      public function meine_Methode()
      {
              echo 
      "Klappts ?";
      }



      // Inhalt von ersteklasse.class.php 

      class ErsteKlasse
      {
            
      // die soll jetzt hier hinzugefügt werden, per include der Datei
      }



      // Inhalt von zweiteklasse.class.php 

      class ZweiteKlasse
      {
            
             public function 
      __call($method_name)
             {
                     include(
      strtolower($method_name) . ".meth.php");
             }

      }


      $obj = new ZweiteKlasse();
      $obj->meine_Methode();

      // Ausgabe von: Klappts ? 
      Das das nicht geht ist mir klar, ich suche nur einen Weg zum selben Ergebnis.

      Das Problem ist, das sich die Klassennamen ja ändern wenn man extended und da man nachträglich in ein instanziertes Objekt keine methoden hinzufügen kann.


      klasse2 extends klasse1

      ein mit klasse1 instanziertes Objekt enthält nicht die Funktionen von klasse2 jetzt. Deswegen ist eine dynamische Erweiterung so nicht möglich sondern immer nur eine aufeinander aufbauende.

      Man muss praktisch immer das letzte Mitglied des Extends instanzieren also kann man immer nur ALLE extenden und nicht auf anfrage einzelne hinzufügen.

      Sry wenn ich es nicht richtig erklären kann hab mein bestes gegeben.
      Zuletzt geändert von BlueByte; 08.03.2007, 11:46.

      Kommentar


      • #4
        Das geht mit dem Decorator Pattern, so wie es in PHP Design Patterns beschrieben ist. Allerdings habe ich das beim Lesen nicht so gut verstanden, dass ich dies jetzt ohne Weiteres zusammenfassen könnte...

        Vielleicht findest du damit was bei Google oder jemand anders kann es dir richtig erklären.
        EDIT:
        Hab nochmal nachgeguckt - war nicht ganz richtig, das Decorator Pattern ist wohl eher dazu da, bereits vorhandene Methoden zur Laufzeit zu erweitern... doch nicht ganz das richtige, entschuldige
        Zuletzt geändert von ministry; 08.03.2007, 12:05.
        ich glaube

        Kommentar


        • #5
          PHP-Code:
          // Inhalt von meine_methode.meth.php 

          public function meine_Methode()
          {
                  echo 
          "Klappts ?";

          Ich hoffe dir ist bewußt, dass das vollständiger quatsch ist oder?

          Eine Funktion die nicht in einer Klasse liegt hat kein public.

          Ich weiß nun nicht, was du da wirklich machen willst, klingt mir alles auch sehr abenteuerlich, aber es gibt denke 2 Wege.

          a) du schreibst dir ganz normale procedurale Funktionen in eine oder mehrere Dateien. Wenn nun ein AUfruf kommt, dann includest du die Datei und rufst die Funktion auf.

          b) du schreibst dir eine Klasse und packst da die Funktionen rein und definierst diese als statisch. Dann brauchst du kein Objekt der Klasse um die Funktionen aufzurufen.

          Dir sollte aber bewußt sein, dass jeglicher Versuch auf Variablen des aufrufenden Objektes zuzugreifen scheitern wird, außer du gibst beim Aufruf das Objekt selbst als Parameter mit. Dann aber dürften sich jedem Entwickler die Fußnägel aufrollen, wenn er das ließt.

          Es gibt ein paar Sachen, bei denen das was du da vorhast sinnvoll sein kann, aber meist würde ich sagen, du solltest deine Ableitungsstruktur mal über denken.

          Kommentar


          • #6
            Ne du verstehst nicht um was es geht, du nimmst den Code so wie er ist und sagst das das Quatsch is, wie ich sagte is mir das auch klar, nin ja kein nap, ich hab auch mein 7 Jahre PHP hinter mir und schön größere Projekte...Das sollte nur ein Konstrukt sein was ich durch eine bestimmte Technik ermöglichen will, das du die function als Funktion ansiehst is schon dein fehler, das soll ne ausgelagerte methode sein, das das so ned stimmt is mir wie gesagt auch klar, das sollte nur das gewünschte Konstrukt verdeutlichen

            Nochmals: Ich möchte methoden von klassen in dateien auslagern, das is mit funktionen ja gang und gebe, mit klassen auch, aber methoden von klassen ist bis jetzt noch nicht Möglich und genau das ist es was ich will. Jetzt verstanden ? und sinnvoll ist es bei allen grösseren Klassen wenn man nicht extenden will... einfach um übersicht reinzubringen.


            Und ministry viele Dank für deine Mühe. Solche Antworten brauch man hier

            Kommentar


            • #7
              damit ich das richtig verstehe. so was in der art?
              PHP-Code:
              // class.blubb.php

              class blubb
              {
                 include (
              'blubb_methoden.php');
              }

              // blubb_methoden.php
              public function blubber()
              {
                 ...

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

              Kommentar


              • #8
                Ganz genau exakt das ist es was ich will im notfall muss man sich was bauen was so eine struktur bereitstellt bin aber noch ned aufn trichter gekommen

                Kommentar


                • #9
                  Hi,

                  wir hatten vor kurzem eine ähnliche frage.

                  Wenn du das classkit der pecl installiert hast
                  kannst du method_add verwenden.


                  Ansonsten:
                  dreckiger hack im commentar

                  Allerdings ist das nicht so toll.

                  In ruby kann man das schön über module lösen.
                  In php musst du dir eben selber was basteln.

                  Ich würde auch den weg gehen und die zu aggregierenden methoden
                  in eine klasse tun.

                  Und bevor du jetzt damit anfängst überleg dir nochmal ob es nicht
                  doch einen anderen weg gibt.

                  greets
                  (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                  Kommentar


                  • #10
                    Vll. sind ja Singleton's noch ne Lösung. Verwende ich zumindest, um innerhalb einer Klasse weitere Klassen laden zu können.
                    Sunshine CMS
                    BannerAdManagement
                    Borlabs - because we make IT easier
                    Formulargenerator [color=red]Neu![/color]
                    Herkunftsstatistik [color=red]Neu![/color]

                    Kommentar


                    • #11
                      Das is ne gute idee, hatte ich auch schon im sinn, dacht halt es gäbe jemand der schon ne Technik gebalstelt hat um das wirkliche ergebnis zu erreichen, ich finde das is schon ne starke schwäche, man kann ja keine 2MB grosse klasse machen zB nen Pre-Core, den Anfragen erst durchlaufen bevor er zum script durchreicht, den kann man ned mit extends machen weil er ja verschiedene methoden bereitstellen soll die man vorher noch nicht kennt. Danke auf jeden Fall die letzten Antworten waren echt super. Gibts sonst noch jemand der was weiss

                      Kommentar


                      • #12
                        Original geschrieben von BlueByte
                        ich finde das is schon ne starke schwäche, man kann ja keine 2MB grosse klasse machen
                        Naja das lässt eher auf schwächen im design schliessen.
                        2 MB klassen (allein quelltext) haben ein wesentlich zu großes
                        interface.

                        zB nen Pre-Core, den Anfragen erst durchlaufen bevor er zum script durchreicht,
                        Pre-Core?



                        greets
                        (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                        Kommentar


                        • #13
                          Ich würde sagen, du hast einen Fehler im Design, wenn du sowas benötigst.


                          ggf. kannst du ja ne child-klasse machen (extend) und die da reinpacken. ggf. teilst du die sogar auf komplett andere Klassen auf.

                          Ich denke, die Schlüsselwörter für dich sind eher Delegation und Aggregation
                          Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
                          var_dump(), print_r(), debug_backtrace und echo.
                          Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
                          Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
                          Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

                          Kommentar


                          • #14
                            Original geschrieben von BlueByte
                            Das is ne gute idee, hatte ich auch schon im sinn, dacht halt es gäbe jemand der schon ne Technik gebalstelt hat um das wirkliche ergebnis zu erreichen, ich finde das is schon ne starke schwäche, man kann ja keine 2MB grosse klasse machen zB nen Pre-Core, den Anfragen erst durchlaufen bevor er zum script durchreicht, den kann man ned mit extends machen weil er ja verschiedene methoden bereitstellen soll die man vorher noch nicht kennt. Danke auf jeden Fall die letzten Antworten waren echt super. Gibts sonst noch jemand der was weiss
                            Ok nun verstehe ich dein Problem, ich habe das ganz anders gelöst.

                            Ich teile die benötigten Funktionen in Gruppen auf. Z.B. Mysql, Logging, Session, was auch immer.

                            Diese mit diesen in Verbindung stehenden Funktionen packe ich dann in eine Klasse.

                            Wenn ich nun eine Funktion einer solchen Klasse brauche, leite ich den intern weiter.


                            Das sieht dann in etwa so aus:

                            PHP-Code:
                            class dasGroßeGanze{

                            private 
                            mysql false;

                            private Function 
                            checkMysql(){
                            if (
                            $this->mysql === false){
                            hier solltest du dann mysql das entsprechende Objekt zuweisen
                            }
                            }

                            public function 
                            query($string){
                            $this->checkMysql();
                            $this->mysql->query($string)

                            Kommentar

                            Lädt...
                            X