Ankündigung

Einklappen
Keine Ankündigung bisher.

Abfrage: Klasse bereits includiert?

Einklappen

Neue Werbung 2019

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

  • Abfrage: Klasse bereits includiert?

    Servus Leute,

    ich habe in verschiedenen Klassen andere Klassen includiert, die diese mit benutzen müssen.

    Wie kann ich abfragen, ob eine Klasse bereits "included" ist?

    Damit nicht folgender Fehler auftritt "Fatal error: Cannot redeclare class"

    Danke euch!!


  • #2
    Dateien in denen, Klassen und / oder Funktionen definiert werden, sollte man möglichst mit include_once() oder require_once() einbinden. Welche Dateien mit include_once() bzw. require_once() eingebunden wurden, kannst du mit get_included_files() feststellen. Um zu prüfen, ob eine Funktion bzw. eine Klasse bereits definiert wurde, eignen sich function_exists() bzw. class_exists().

    Kommentar


    • #3
      Ich finds schade, dass PHP keine Preprozessordirektiven hat. Dann könnte man das im Stil von C machen.

      Kommentar


      • #4
        require_once ist schon ok dafür.
        der overhead, jedes mal vor benutzung einer klasse noch ein absicherndes require_once reinzupacken, ist minimal.
        darüberhinaus gibt's __autoload() und auto_prepend_file .
        mehr braucht's weiß gott nicht.

        und wenn du C-direktiven haben möchtest, steht dir immer noch die benutzung von c-programmen im cgi-bin zur verfügung, außerdem ist das schreiben von php-extensions auch kein hexenwerk.

        also: require_once() verwenden und fertig.

        Kommentar


        • #5
          Ich benutz include_once.

          Kommentar


          • #6
            Naja, man kann einfach struckturierten Code verwenden.

            Die Strucktur kann eine 'index.php' haben:
            PHP-Code:
            <?php
            // -===== alle gebracuhten Klassen =====-
            include('./class/class.DB.php');
            include(
            './class/class.Account.php');
            include(
            './class/class.XYZ.php');
            // -===== alle gebracuhten Klassen | end =====-

            include('./logic.php');
            include(
            './layout.php');
            ?>
            dann wirst du nie solche Abfragen brauchen.

            Gruß
            Der Desian
            Wenn dich was ankotzt, machs besser.

            Kommentar


            • #7
              Zitat von DerDesian
              Naja, man kann einfach struckturierten Code verwenden.
              [...]
              dann wirst du nie solche Abfragen brauchen.
              Da fehlt der Zusammenhang. Außerdem ist das nur für kleinformatige und in sich abgeschlossene (nicht modulare) Programme praktikabel.

              "Struktur" schreibt man ohne "c".

              Kommentar


              • #8
                Zitat von Saraneus
                Zitat von DerDesian
                Naja, man kann einfach struckturierten Code verwenden.
                [...]
                dann wirst du nie solche Abfragen brauchen.
                Da fehlt der Zusammenhang. Außerdem ist das nur für kleinformatige und in sich abgeschlossene (nicht modulare) Programme praktikabel.

                "Struktur" schreibt man ohne "c".
                Danke für die Rechtschreibkorrektur.

                Aus welchem Grund sollte es 'nicht Praktikabel' sein.
                Gerade für größere Projekte ist es wichtig eine Zentraisierung vorzunehmen.

                Natürlich wird das dann noch in eine 'classes.php' ausgelagert, einige Klassen (oder auch Gruppen von Klassen) nur mit Bedingungen eingefügt.

                Gerade für 'größere' Projekte braucht man eine derartige Zentralisierung, wenn man nicht SpagettiCode haben will.

                Es ist immer besser ein Problem erst gar nicht zu haben, als es dann lösen zu müssen.

                Gruß
                Der Desian
                Wenn dich was ankotzt, machs besser.

                Kommentar


                • #9
                  Inkludiert wird überall dort, wo "fremder" Code (zB Klassen) verwendet wird. In großen Projekten werden einzelne Klassen häufig wiederverwendet, also auch häufig inkludiert. Das ist allein schon wichtig für die Wiederverwendung einzelner Programmteile. Und da üblicherweise jede Klasse ihre eigene Datei hat, kannst du dir das Ausmaß in großen Projekten vorstellen, sei es in PHP, Java oder C++.

                  Alles in eine einzige Resource zu schieben, wäre Humbug, da unüberschaubar und unstrukturiert, außerdem unperformant, weil nie immer alles gebraucht wird. Vor allem bei Projekten, die auf ein Team aufgeteilt sind, haben die Teammitglieder idealerweise nur Zugang zu den ihnen zugewiesenen Programmteilen. Was aber, wenn diese eine bestimmte Klasse benötigen, die sonst im Projekt nirgends auftaucht? Ein "zentrales" Framework hat nur einen Sinn, wenn man es nicht mehr anfassen muss.

                  Kommentar


                  • #10
                    Zitat von Saraneus
                    Alles in eine einzige Resource zu schieben, wäre Humbug, da unüberschaubar und unstrukturiert, außerdem unperformant, weil nie immer alles gebraucht wird.
                    Soso: Humbug, Unüberschaubar, unstruckturiert.
                    Ich bin mir sicher, du wirst deine Projekte in deiner Technik meistern.
                    Ich in meinem umüberschaubaren, unstruckturiertem Humbug.

                    Zitat von Saraneus
                    Ein "zentrales" Framework hat nur einen Sinn, wenn man es nicht mehr anfassen muss.
                    Diese Aussage verwirrt mich. Welchen anderen Grund als eine einfachere Wartbarkeit sollte eine Zentralisierung einehmen?

                    Ach lassen wir das, das führt zu nix.

                    Gruß
                    Der Desian
                    Wenn dich was ankotzt, machs besser.

                    Kommentar


                    • #11
                      Es geht ja erstmal um das Einbinden von Klassen und nicht um die Architektur an sich. Natürlich wäre es auch bei dem Prinzip "an einer zentralen Stelle alle Klassen einbinden" möglich, ein sinnvoll aufgebautes System zusammenzuschreiben.

                      Nur ist es natürlich reichlich unsinnig, für jede Anfrage an das System sämtliche Klassen zu laden und genau soviele müsstest du laden, wenn sich a) keine "verwaisten" Klassen im System rumliegen und b) zum Zeitpunkt des Ladens noch keine Informationen ausgewertet wurden, was überhaupt zu tun ist/tatsächlich gebraucht wird.

                      Übrigends wäre require_once() include_once() hier vorzuziehen (denn deine Anwendung ist nicht lauffähig, wenn das Einbinden schief geht, also wäre ein Fatal Error angebacht)

                      Basti

                      Kommentar


                      • #12
                        Zitat von Basti
                        Übrigends wäre require_once() include_once() hier vorzuziehen (denn deine Anwendung ist nicht lauffähig, wenn das Einbinden schief geht, also wäre ein Fatal Error angebacht)
                        Der fatale Fehler kommt schon, wenn eine Klasse benutzt wird, die nie eingebunden wurde

                        Kommentar


                        • #13
                          Zitat von DerDesian
                          Naja, man kann einfach struckturierten Code verwenden.

                          Die Strucktur kann eine 'index.php' haben:
                          PHP-Code:
                          <?php
                          // -===== alle gebracuhten Klassen =====-
                          include('./class/class.DB.php');
                          include(
                          './class/class.Account.php');
                          include(
                          './class/class.XYZ.php');
                          // -===== alle gebracuhten Klassen | end =====-

                          include('./logic.php');
                          include(
                          './layout.php');
                          ?>
                          dann wirst du nie solche Abfragen brauchen.

                          Gruß
                          Der Desian
                          Sowas halte ich nciht für sinnvoll, hast du dir schonmal größere Klassen angeschaut ? nuSOAP in php4 ? das waren > 300 kb die nur in Klassen verpackt waren, sowas IMMER zu includen ... das schlägt massiv auf die performance, ist ja schon was wie wenn ich ne datenbank hab und präventiv ein SELECT * FROM allen tabellen mache :P

                          mfg
                          robo47
                          robo47.net - Blog, Codeschnipsel und mehr
                          | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

                          Kommentar


                          • #14
                            Zitat von Saraneus
                            Zitat von Basti
                            Übrigends wäre require_once() include_once() hier vorzuziehen (denn deine Anwendung ist nicht lauffähig, wenn das Einbinden schief geht, also wäre ein Fatal Error angebacht)
                            Der fatale Fehler kommt schon, wenn eine Klasse benutzt wird, die nie eingebunden wurde
                            das ist bereits zu spät. 'compile time' vs. 'runtime'.

                            Kommentar


                            • #15
                              Zitat von axo
                              Zitat von Saraneus
                              Zitat von Basti
                              Übrigends wäre require_once() include_once() hier vorzuziehen (denn deine Anwendung ist nicht lauffähig, wenn das Einbinden schief geht, also wäre ein Fatal Error angebacht)
                              Der fatale Fehler kommt schon, wenn eine Klasse benutzt wird, die nie eingebunden wurde
                              das ist bereits zu spät. 'compile time' vs. 'runtime'.
                              Wen interessiert der Unterschied in PHP?

                              Kommentar

                              Lädt...
                              X