Interface einer abstracten Klasse speichern?

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

  • Interface einer abstracten Klasse speichern?

    Abend.

    Ich habe mir gerade die Benutzung zu den abstrakten Klassen und Interfaces durchgelesen.

    Soweit ist mir alles klar.
    Nur wo speicher/schreibe ich das Interface?
    In einer extra Datei oder in der Datei wo ich die abstrakte Klasse definiert/geschrieben habe?
    Gut geraten ist halb gewußt.

  • #2
    technisch gesehen spielt es keine rolle, so lange php das interface bekannt gemacht wird.

    logisch gesehen gehört das interface in eine eigene datei, denn es kann ja auch noch andere Klassen geben, die das selbe interface implementieren...

    wenn du sicher gehen willst, dass du das bekanntmachen nicht aus versehen vergisst, kannst du die interface-datei mit require_once von der klassendatei einbinden lassen...

    greetz, high
    Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
    When everything else fails, manipulate the data...
    Beschriftungen / Großformatdruck / Werbemittel

    Kommentar


    • #3
      Aha. Ja also ich hätte ja auch auf das abspeichern in einer einzelnen Datei getippt. Den Aspekt, das das Interface auch von anderen Klassen genutzt werden kann habe ich noch garnicht bedacht und spricht ja auch noch dafür.

      Hatte mir diese Frage aber erst überhaupt gestellt, weil ja das Interface nicht immer sehr umfangreich sein muß. Und wenn das extra in einer Datei gespeichert ist und mit require_once eingebunden wird, kostet es ja Zeit.
      Also Zeit die wenigen Zeilen des Interfaces in dieser Datei zu laden, aber man ist ebend flexibler.
      Gut geraten ist halb gewußt.

      Kommentar


      • #4
        das das Interface auch von anderen Klassen genutzt werden kann habe ich noch garnicht bedacht
        Wofür auch immer man sonst ein Interface braucht ... (nicht umbedingt in mehreren Klassen aber zumindest nicht fest).
        Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

        Kommentar


        • #5
          Ok.
          Da mich das alles interessiert, ich aber nicht immer alles laden möchte, was ich vielleicht nicht immer benötige, mal eine Fragen zu einem kleinen Beispiel:

          Hier ist ein kleines Command Muster als Beispiel.

          Also wenn ich sowas schreibe, denn speicher ich die Interfaces und Klassen in jeweils einzelnen Dateien in dem gemeinsamen "libs" Ordner.
          Würdet ihr das soweit auch machen?
          Wenn nicht, wie würdet ihr das machen?

          Dann würde ich in der Datei "Batch.inc.php" wo ich die Klasse "Batch" drinne gespeichert habe genau über der Zeile wo die Klasse anfängt:
          PHP-Code:
          require_once('libs/interface_Invoker.inc.php');
          require_once(
          'libs/interface_Command.inc.php');
          class 
          Batch implements Invoker 
          die benötigten Interfaces per require laden.




          Und wenn ich ein Befehl aufrufen möchte wie zum Beispiel:
          PHP-Code:
          $Batch->add ( new Install 'Pear::MDB2' ) ); 
          dann würde ich davor immer die nötige Datei laden in der ich den Befehl deklariert habe:
          PHP-Code:
          require_once('libs/install.inc.php');
          $Batch->add ( new Install 'Pear::MDB2' ) ); 
          Mal abgesehen von dem require sind die Muster eine feine Sache.
          Gut geraten ist halb gewußt.

          Kommentar


          • #6
            zum ersten teil würde ich spontan mal sagen, das kann man durchaus so machen...

            Klassen solltest du nicht unmittelbar vor ihrer verwendung laden, sondern einmal zu beginn des scripts.

            seit php5 kannst du auf den ganzen require geschnick für klassen verzichten, sofern du deine dateien sauber benennst und eine __autoload() funktion schreibst (siehe handbuch)

            greetz, high
            Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
            When everything else fails, manipulate the data...
            Beschriftungen / Großformatdruck / Werbemittel

            Kommentar


            • #7
              Aha danke, diese Funktion hatte ich ingoriert.
              __autoload() werde ich dann so wie in diesem Beispiel einsetzten und in der Globalen conf.inc.php die Namen definieren und in der Globalen function.inc.php die Funktion speichern.

              Habt ihr schon in PHP Muster eingesetzt? Wo habt ihr die Dateien sonst immer gespeichert?

              Alternativ hatte ich mir überlegt, den Globalen Ordner "libs" zu unterglieder, in z.B
              "libs/diexyanwendung/" und "libs/diexyzanwendung/" das es alles bisschen übersichtlicher wird.

              Ansonsten habe ich irgendwann 100 Dateien im "libs" Ordner und das wäre unübersichtlich.

              Falls ich ein spezielles Modul wie ein Forum habe, denn habe ich in diesem Forum ja auch ein "libs" Ordner wo ich denn auch diese Untergliederung machen würde.

              Wie würdet ihr das machen, bzw.wie macht ihr es?
              Gut geraten ist halb gewußt.

              Kommentar


              • #8
                Je nach dem wie deine Klassennamen aussehen kannst du für jeden _ einen / setzen und bekommst so automatisch eine gute Struktur in der du auch Interfaces unterbringen kannst. Das hat denn Vorteil das du bei den Klassen nicht mit eine extra Konfiguration arbeiten musst. Wenn du Klassen oder mehrere Funktionen als __autoload-Handler definieren willst hilft auch spl_autoload_register.
                Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                Kommentar


                • #9
                  Guter Tipp, danke. Werde es denn nach Packages bennen.
                  Soweit ist mir alles klar.

                  Nur Interfaces kann ich ja nicht automatisch laden, weil es ja keine Klasse ist oder hab ich nur die Funktion spl_autoload_register nicht kapiert?
                  Gut geraten ist halb gewußt.

                  Kommentar


                  • #10
                    Doch, auch bei nicht geladenen Interfaces wird die __autoload()-Funktion aufgerufen. Da musst du dann halt nur entsprechend anders drauf reagieren. Du könntest beispielsweise wie in .NET alle Interfaces mit I im Namen beginnen. Bsp: IDisposable

                    Kommentar


                    • #11
                      Achso, danke für den Hinweis.
                      Hatte mal ein Beispiel gesehen, wo es mit I begann. Jetzt weiß ich auch warum.
                      Gut geraten ist halb gewußt.

                      Kommentar


                      • #12
                        Ich hab direkt noch ne Frage zur __autoload - Funktion. Das funktioniert ja nur, wenn eine Instanz per new erzeugt wird. Wenn die Instanz aber durch eine statische Methode erzeugt wird (z.b. Singleton-Pattern), geht es nicht. Kann man das lösen oder muss man diese Klassen immer vorher mit require einbinden?
                        ich glaube

                        Kommentar


                        • #13
                          Wenn die Instanz aber durch eine statische Methode erzeugt wird (z.b. Singleton-Pattern), geht es nicht.
                          Wie erzeugst du eine Klasse ohne new??

                          Kommentar


                          • #14
                            Original geschrieben von PHP-Desaster
                            Wie erzeugst du eine Klasse ohne new??
                            Bei Singleton ist der Konstruktur privat und wird durch eine statische Methode aufgerufen ... recht hat er, da wird das ganze Komplizierter, aber auch nicht unmöglich. Factory-Pattern kann helfen, __autoload kann man dann vergessen~

                            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                            Wie man Fragen richtig stellt

                            Kommentar


                            • #15
                              Wie erzeugst du eine Klasse ohne new??
                              PHP-Code:
                              $db =& db::get_instance(); 
                              z.b.

                              __autoload kann man dann vergessen
                              ok, dann brauche ich danach nicht weiter suchen. Factory würde gehen, stimmt.

                              recht hat er
                              Falls du mich meinst, ist er immer noch ne sie, sei dir aber verziehen
                              ich glaube

                              Kommentar

                              Lädt...
                              X