Ankündigung

Einklappen
Keine Ankündigung bisher.

Mehrfachedeklaration von Objekten

Einklappen

Neue Werbung 2019

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

  • Mehrfachedeklaration von Objekten

    Guten Tag,

    Ich möchte gerne mehrmals ein Objekt deklarieren, was den selben Namen hat. Dabei ist es so, dass in eine Schleife mehrere Datein (mit dem selben Namen, aber in unterschiedlichen Ordnern) geladen werden und diese immer die selbe Klasse besitzen, bzw. sie hat nur den selben Namen. Jetzt will ich mir dem Objekt was ich kriege ein paar Sachen machen, es danach verwerfen und das nächste Objekt laden.
    Das Problem hierbei ist, dass er mir sagt, das ich Objekte ne "redeclaren" kann. Ist soweit auch logisch und verständlich! Das Problem ist nur, dass ich das Objekt nicht richtig zerstört kriege, damit ich die Klasse erneut deklarieren kann.
    Ich hab's versucht mit "null"-Zuweisung des Objektes und mit unset... klappt alles nicht. Die Klasse besitzt natürlich auch den Destructor, dennoch funktioniert das nicht!

    Könnt ihr mir vll sagen wie ich die Klasse so zerstöre, dass ich sie erneut deklarieren kann???

    Gruß
    V

    Beispiel:
    PHP-Code:
    class test{
    function 
    t(){
     echo 
    "hallo";
    }
    function 
    __destructor(){
    }
    }

    $obj = new test;
    $obj->t();
    unset(
    $obj);

    // ist die Klasse in ner anderen Datei
    class test{
    function 
    t(){
     echo 
    "hallo";
    }
    function 
    __destructor(){
    }
    }
    $obj = new test;
    $obj->t();
    unset(
    $obj); 


  • #2
    Zitat von Das_Pfau Beitrag anzeigen
    Könnt ihr mir vll sagen wie ich die Klasse so zerstöre, dass ich sie erneut deklarieren kann???
    Das ist m.W. innerhalb ein und der selben Scriptinstanz gar nicht möglich.

    Ich hab's versucht mit "null"-Zuweisung des Objektes und mit unset... klappt alles nicht.
    Natürlich nicht, Klasse != Objektinstanz

    Die Klasse besitzt natürlich auch den Destructor, dennoch funktioniert das nicht!
    Natürlich, auch der ist nur dafür da, beim Zerstören von Objektinstanzen aufgerufen zu werden - er „entsorgt“ aber nicht bereits geparsten Quellcode.

    Ich möchte gerne mehrmals ein Objekt deklarieren, was den selben Namen hat. Dabei ist es so, dass in eine Schleife mehrere Datein (mit dem selben Namen, aber in unterschiedlichen Ordnern) geladen werden und diese immer die selbe Klasse besitzen, bzw. sie hat nur den selben Namen. Jetzt will ich mir dem Objekt was ich kriege ein paar Sachen machen, es danach verwerfen und das nächste Objekt laden.
    Klingt nach einem Fehler im Design.

    Kommentar


    • #3
      Kurz: Das ist unmöglich. Ein Objekt ist etwas anderes als eine Klasse. Ein Objekt ist der IKEA Schrank, die Klasse ist die Bauanleitung für „ASPELUND“. Die kannst Du nicht austauschen, es gibt nur eine Art, ein Objekt des Typs „ASPELUND“ zu bauen. Es kann aber viele gleiche Schränke geben - oder auch gar keinen.

      [edit]
      Das ist m.W. innerhalb ein und der selben Scriptinstanz gar nicht möglich.
      Richtiger: innerhalb eines Requests.
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #4
        Das ist unmöglich und entspricht nicht dem Prinzip von objektorientiertem Programmieren! Mehrere Objekte mit dem selben Namen zu haben macht keinen Sinn, wieso machst du das so? Vlt. können wir dir einen besseren Weg nennen.

        Sobald eine Klasse deklariert wurde bleibt sie für PHP bis zum Ende des Skriptablaufes bekannt.

        Kommentar


        • #5
          Also erstma Danke für die schnelle Antwort.

          Der Gedanke dabei war folgender:
          Ich will eine Funktionalität schreiben, die automatisch erkennt welche Objekte und Funktionalitäten besitzt meine Anwendung. Dazu gehe in einem Ordner alle Datein durch und rufe stehts pro Unterordner eine gewisse Datei auf, in der eine Klasse drin enthalten ist. Diese Klasse gibt mit dann Auskunft über die Klassen und Funktionalitäten... des Ordners.
          Ich wollte jeden Funktionalität in einem Ordner strukturieren.
          Damit ich aber nun weiß, welche Klasse in der php-datei enthalten ist, war mein Gedanke, nehme ich mir einfach eine "Definitions-Klasse" die immer gleich heißt, damit ich den Namen weiß und hol mir die restlichen Informationen daher.

          Somit könnte ich stets automatisch erkennen, welche Klassen und generell Funktionalitäten besitzt die Anwendung.

          Ich wüsste sonst nicht wie ich an den Namen der Klasse innerhalb eine php-Datei komme.

          Gruß
          V

          PS: ich hoffe das ist einigermaßen verständlich erklärt

          Kommentar


          • #6
            genauso gut kannst Du auch eine Definitionsdatei benutzen - ini-File oder sonstwas. Technisch gesehen ist Dein Plan aber fragwüdig - Dateisystemoperationen sind in Hinblick auf die Performance der Applikation „teure“ Operationen. Wenn Du dann nur einen Bruchteil der Module benutzt, ist das reine Ressourcenverschwendung.
            --

            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


            --

            Kommentar


            • #7
              Ich weiß zwar nicht wofür du so ein Skript schreiben willst, aber du könntest die Namen der Klassen anhand der Ordner zuordnen.

              /blub/Info.php => Blub_Info
              /blub/bla/Info.php => Blub_Bla_Info

              So hast du immer eindeutige Klassennamen. Aber was genau möchtest du denn über die Funktionalität herausfinden? Ist es nicht besser dann einmal phpdoc über deinen Code laufen zu lassen und somit ne Doku dazu zu generieren?

              Kommentar


              • #8
                Zitat von nikosch Beitrag anzeigen
                Richtiger: innerhalb eines Requests.
                Warum soll das richtiger sein?
                Request ist ein Begriff aus dem HTTP-Umfeld; PHP kann aber auch anders als über HTTP „aufgerufen“ werden.
                Scriptinstanz ist m.E. der passende Begriff.

                Kommentar


                • #9
                  Ich führe diesen Funktionscheck nur beim "Start" der Anwendung aus. Danach speichere ich die Liste der Definitions-Klassen in der Session ab. Somit kann ich danach bei jedem Seitenaufruf gezielt nur noch die entsprechenden Datein einbindung und Objekte erzeugen lassen.
                  Ich will damit erreichen, dass die Anwendung bei jedem "Start" neu schaut, welche "Funktionalitäten" es gibt und diese automatisch einbindet. Das bedeutet, dass ich bei jeder neuen Funktion mich um die Implementation nicht mehr kümmern brauche. Die Funktionen "melden" sich ja beim Start der Anwendung an und geben Auskunft über ihre Eigenschaften!
                  Ich sehe den Vorteil daran, dass meine Kernanwendung nichts weiter am Anfang über ihre eigentlichen "Fähigkeiten" wissen muss. Sondern einfach fragt, "was kann ich eigentlich?" Jede vorhandene Funktionalität (In Form von Definitionsklassen, zumindestens war das der Plan antwortet dann auf die Frage mit: " Du kannst dies und das"

                  Gruß
                  v

                  Kommentar


                  • #10
                    Warum soll das richtiger sein?
                    Request ist ein Begriff aus dem HTTP-Umfeld; PHP kann aber auch anders als über HTTP „aufgerufen“ werden.
                    Scriptinstanz ist m.E. der passende Begriff.
                    Scriptinstanz sagt nichts über die beteiligten Scripte, noch den Aufrufkontext aus.

                    zu 1)
                    index.php inkludiert class1.php und class2.php.

                    Was ist jetzt die Scriptinstanz? Für das vorliegende Problem ist der Gesamte Includebaum entscheidend, wenn bspw. in class1 und class2 die selbe Deklaration stünde. „Scriptinstanz“ würde für mich bedeuten, ich dürfte nur die selbe Datei, bspw. class1, nicht doppelt inkludieren.

                    zu 2)
                    index.php inkludiert class1.php und class2.php abhängig von einer Parameterisierung. Oder class1.php oder class2.php deklarieren die Klassen nur abhängig von einer Parameterkondition. Hier sagt auch der Inkludebaum alleine nichts über die Problematik aus. Wohl aber der Gesamtkontext aus beteiligten Scripten, aktuellen Parametern etc. Was ich im Normalfall als Request bezeichnen würde.
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar


                    • #11
                      Das bedeutet, dass ich bei jeder neuen Funktion mich um die Implementation nicht mehr kümmern brauche. Die Funktionen "melden" sich ja beim Start der Anwendung an und geben Auskunft über ihre Eigenschaften!
                      Ich sehe den Vorteil daran, dass meine Kernanwendung nichts weiter am Anfang über ihre eigentlichen "Fähigkeiten" wissen muss. Sondern einfach fragt, "was kann ich eigentlich?" Jede vorhandene Funktionalität (In Form von Definitionsklassen, zumindestens war das der Plan antwortet dann auf die Frage mit: " Du kannst dies und das"
                      Halte ich für unsinnig. Neue Komponenten werden sicher nicht einfach durch Hineinkopieren aktiv. Im Normalfall wird man da sicher noch etwas konfigurieren oder zumindest die Module irgendwo einbinden?! An dieser Stelle ist dann ihmo auch Gelegenheit, das Modul global zu deklarieren (ini-Datei o.ä.). Den Mehrwert der Session-Variante sehe ich nicht. Sicher wirst Du nicht zur Laufzeit Module ergänzen (und wenn nützt Dir die veraltete Session-Information da auch nichts).
                      --

                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                      --

                      Kommentar


                      • #12
                        Zitat von nikosch Beitrag anzeigen
                        index.php inkludiert class1.php und class2.php.

                        Was ist jetzt die Scriptinstanz?
                        Alles zusammen ist eine Scriptinstanz.
                        Du hast ein mal den PHP-Interpreter angeworfen.

                        Für das vorliegende Problem ist der Gesamte Includebaum entscheidend, wenn bspw. in class1 und class2 die selbe Deklaration stünde. „Scriptinstanz“ würde für mich bedeuten, ich dürfte nur die selbe Datei, bspw. class1, nicht doppelt inkludieren.
                        Nein, für mich nicht.

                        index.php inkludiert class1.php und class2.php abhängig von einer Parameterisierung. Oder class1.php oder class2.php deklarieren die Klassen nur abhängig von einer Parameterkondition. Hier sagt auch der Inkludebaum alleine nichts über die Problematik aus.
                        Dass der überhaupt was aussagt, habe ich ja auch nicht behauptet.

                        Wohl aber der Gesamtkontext aus beteiligten Scripten, aktuellen Parametern etc. Was ich im Normalfall als Request bezeichnen würde.
                        Wie gesagt, wenn gar kein HTTP im Spiel ist, dann hast du keinen Request - aber die gleiche Problematik.

                        Kommentar


                        • #13
                          Naja, das Ziel ist es schon, durch's Kopieren aktiv zu sein
                          Konifigurationen können ja in Datenbanken abgespeichert werden und dann benutzt werden.
                          Weitere Änderungen, kann ich sicherlich durch's Überschreiben oder Überladen der Objekte realisieren.
                          Die Aktion dass ich die Liste in die Session schreibe, mach ich nur aus Performance-gründen, weil ich ja eh nur die Definitions-Klassen brauche um von da aus alle weiteren Einbindungen zu tätigen. Wenn ich die Daten nach'm Start schon habe, dann kann ich den Rest über die Arrays laufen lassen und somit auch nur die Datein und Klassen einbinden, die ich auch wirklich für den Seitenaufruf benötige!

                          Naja also generell halte ich die Idee für gar nicht so unsinnig! Ich müsste mir eigentlich nur nen anderes Konzept überlegen!

                          Gruß
                          V

                          Kommentar


                          • #14
                            Alles zusammen ist eine Scriptinstanz.
                            Du hast ein mal den PHP-Interpreter angeworfen.
                            Dann finde ich den Begriff aber unglücklich. Ist das ein offizieller Terminus? Analog zur Objekt„instanz“ wäre eine Scriptinstanz eine Aussage darüber, wie oft ein Script eingebunden wurde - in welchem Kontext auch immer.

                            Naja, das Ziel ist es schon, durch's Kopieren aktiv zu sein
                            Dann beschreib doch mal das Warum.
                            --

                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                            --

                            Kommentar


                            • #15
                              Normalerweise müssen doch Module irgendwie installiert werden. Seis ne eigene DB Struktur hinzuzufügen, nen Menüpunkt einzubauen oder bestimmte Templates zu verändern. Da kann man doch auch das Modul irgendwie registrieren.

                              Den ganzen Spass in der Session ablegen find ich auch unnötig. Somit hast du bei x Usern gleich x mal diese Information in ner Textdatei gespeichert, heißt extrem viele Informationen redundant gespeichert. Besser wäre es solche Informationen in einer einzigen Datei abzulegen und zu cachen, dann muss es nicht unnötig pro User einzeln gespeichert werden.

                              Kommentar

                              Lädt...
                              X