Magische Methode für Zuweisung?

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

  • Magische Methode für Zuweisung?

    Eigentlich dachte ich, es gäbe eine magische Methode welche bei Objekt-Zuweisungen aufgerufen wird. Nur finde ich keine solche. Als Beispiel sei Folgendes gegeben:
    PHP-Code:
    $v = new Foo();
    $v 'bar';
    $v->do(); 
    So endet das natürlich in einer Fehlermeldung. Aber gibt es keine magische Möglichkeit in der zweiten Zeile eine bestimmte Methode der Klasse aufzurufen (z.B. $this->set($x))? __invoke() kommt dem ganzen ja schon ziemlich nahe, ist aber nicht genau das, was ich suche.

  • #2
    Zitat von sili Beitrag anzeigen
    Eigentlich dachte ich, es gäbe eine magische Methode welche bei Objekt-Zuweisungen aufgerufen wird. Nur finde ich keine solche.
    PHP: Magic Methods - Manual
    http://www.php.net/manual/en/languag...oading.members
    Manual lesen schwer, ich wissen ... so viele Buchstaben, nicht zurechtfinden, Kopf tun weh.

    So endet das natürlich in einer Fehlermeldung.
    Wenn du keine magische Setter-Methode implementiert hast, ist das nur logisch.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Zitat von wahsaga Beitrag anzeigen
      Manual lesen schwer, ich wissen ... so viele Buchstaben, nicht zurechtfinden, Kopf tun weh.
      Meine Frage zu lesen und zu verstehen scheint dir auch nicht gerade leicht zu fallen. Ich schreibe von einer OBJEKTzuweisung und nicht von einer ATTRIBUTzuweisung. Bei einer Objektzuweisung wird __set() nicht aufgerufen. Natürlich ist mir aber klar, was stattdessen abläuft und dementsprechend auch, warum es zu einer Fehlermeldung kommt.

      Zitat von wahsaga Beitrag anzeigen
      Wenn du keine magische Setter-Methode implementiert hast, ist das nur logisch.
      Daher schrieb ich ja "natürlich". Ohne die richtige Methode zu wissen (__set() funktioniert nicht) wird es ja auch schwierig diese zu implementieren.

      Über den Sinn oder Unsinn einer solchen Zuweisung müsst ihr euch im Übrigen keine Gedanken machen. Es geht nur um ein kleines Experiment um den Umgang mit den primitiven Datentypen zu vereinfachen

      Kommentar


      • #4
        Zitat von sili Beitrag anzeigen
        Eigentlich dachte ich, es gäbe eine magische Methode welche bei Objekt-Zuweisungen aufgerufen wird. Nur finde ich keine solche. Als Beispiel sei Folgendes gegeben:
        PHP-Code:
        $v = new Foo();
        $v 'bar';
        $v->do(); 
        So endet das natürlich in einer Fehlermeldung. Aber gibt es keine magische Möglichkeit in der zweiten Zeile eine bestimmte Methode der Klasse aufzurufen (z.B. $this->set($x))? __invoke() kommt dem ganzen ja schon ziemlich nahe, ist aber nicht genau das, was ich suche.
        Ab Zeile 2 befindet sich in $v kein Objekt mehr, sondern ein String.

        Kommentar


        • #5
          Zitat von h3ll Beitrag anzeigen
          Ab Zeile 2 befindet sich in $v kein Objekt mehr, sondern ein String.
          Das ist mir bewusst und war auch nicht meine Frage
          Meine Frage ist, ob es eine Möglichkeit gibt, durch die Zuweisung $v='bar' eine (magische) Methode der Klasse "Foo" auszuführen.

          Mein Ziel ist es, wie von anderen Sprachen gewohnt, etwas in der Art zu machen:
          Code:
          String v = new String("foo");
          v = "bla"; // v ist immer noch ein String-Objekt und nicht nur ein gewöhnlicher String wie er es in PHP nun wäre

          Kommentar


          • #6
            Zitat von sili Beitrag anzeigen
            Das ist mir bewusst und war auch nicht meine Frage
            Meine Frage ist, ob es eine Möglichkeit gibt, durch die Zuweisung $v='bar' eine (magische) Methode der Klasse "Foo" auszuführen.
            Nein, weil es das Objekt nichts angeht und davon nichts mitkriegt.

            Zitat von sili Beitrag anzeigen
            Mein Ziel ist es, wie von anderen Sprachen gewohnt, etwas in der Art zu machen:
            Code:
            String v = new String("foo");
            v = "bla"; // v ist immer noch ein String-Objekt und nicht nur ein gewöhnlicher String wie er es in PHP nun wäre
            Bist du sicher, dass hier eine Methode im Objekt aufgerufen wird und es nicht einfach durch ein neues String-Objekt ersetzt wird? zB. in JavaScript ist jeder String automatisch ein Objekt, egal was vorher in der Variable war.

            Kommentar


            • #7
              Zitat von sili Beitrag anzeigen
              Meine Frage zu lesen und zu verstehen scheint dir auch nicht gerade leicht zu fallen.
              Stimmt - was du eigentlich willst, erkenne ich erst jetzt ... Sorry. Mit einer so abstrusen Fragestellung in Bezug auf PHP habe ich einfach nicht gerechnet :-)

              Ich schreibe von einer OBJEKTzuweisung und nicht von einer ATTRIBUTzuweisung.
              Das, was du eine „Objektzuweisung“ nennst ist in PHP schlicht und einfach das Überschreiben eines Variableninhaltes.

              Zitat von sili Beitrag anzeigen
              Meine Frage ist, ob es eine Möglichkeit gibt, durch die Zuweisung $v='bar' eine (magische) Methode der Klasse "Foo" auszuführen.
              Allerhöchstens ein Aufruf des Destruktors wäre denkbar - aber auch nur dann, wenn der GC das Objekt mit der Zuweisung bereits entsorgt, wovon ich nicht ausgehen würde.

              Mein Ziel ist es, wie von anderen Sprachen gewohnt, etwas in der Art zu machen:
              Code:
              String v = new String("foo");
              v = "bla"; // v ist immer noch ein String-Objekt und nicht nur ein gewöhnlicher String wie er es in PHP nun wäre
              So arbeitet PHP nicht.
              $v ist überhaupt nicht an einen bestimmten „Datentyp“ gebunden.
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                Hallo,

                sowas ist definitiv mit PHP nicht möglich, da dafür der = Operator überladen werden müsste. Sowas geht aber nur mit einem selbstkompilierten PHPMod. Da das dann aber nicht mehr auf einem Standardwebserver einsetzbar ist, sollte die Idee an diesem Punkt schon verworfen werden.

                Sinnvoller wäre es, stattdessen eine Methode zu verwenden. "loadString" dürfte sich vom Namen her anbieten.

                Gruß,

                Amica
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Danke für eure Antworten. Habe schon fast befürchtet, dass das nicht gehen wird

                  AmicaNoctis: Operatorüberladung wäre ab und zu ganz praktisch. Aber noch lieber hätte ich eine feste Typisierung in PHP...

                  Kommentar


                  • #10
                    Zitat von sili Beitrag anzeigen
                    Operatorüberladung wäre ab und zu ganz praktisch. Aber noch lieber hätte ich eine feste Typisierung in PHP...
                    Oder kurzum bzw. anders formuliert: Du möchtest eigentlich lieber in einer anderen Sprache als PHP programmieren
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Zitat von wahsaga Beitrag anzeigen
                      Oder kurzum bzw. anders formuliert: Du möchtest eigentlich lieber in einer anderen Sprache als PHP programmieren
                      Man kann ja nicht immer wählen
                      Aber allgemein arbeite ich wirklich immer weniger mit PHP.

                      Kommentar


                      • #12
                        Zitat von sili Beitrag anzeigen
                        Das ist mir bewusst und war auch nicht meine Frage
                        Meine Frage ist, ob es eine Möglichkeit gibt, durch die Zuweisung $v='bar' eine (magische) Methode der Klasse "Foo" auszuführen.

                        Mein Ziel ist es, wie von anderen Sprachen gewohnt, etwas in der Art zu machen:
                        Code:
                        String v = new String("foo");
                        v = "bla"; // v ist immer noch ein String-Objekt und nicht nur ein gewöhnlicher String wie er es in PHP nun wäre
                        In welcher Sprache soll das der Fall sein?
                        Für Javascript ist diese Annahme falsch, zumindest soweit ich diese Sprache verstanden habe.

                        Du weist zuerst der Variablen v ein String-Objekt zu.
                        Danach weist du ihr einen String zu. Damit ist v kein String-Objekt mehr. Das ursprüngliche String-Objekt ist nicht mehr erreichbar (und wird beim nächsten Garbage-Collector-Lauf entfernt).

                        Strings und String-Objekte sind (in Javascript) unterschiedliche Datentypen. Ein String-Objekt ist eine Art Wrapper um den String-Wert. In der üblichen Script-Bastel-Praxis fällt dieser kleine Unterschied aber selten auf.
                        Zuletzt geändert von fireweasel; 18.04.2011, 21:09.
                        Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                        Kommentar


                        • #13
                          Zitat von fireweasel Beitrag anzeigen
                          In welcher Sprache soll das der Fall sein?
                          Ich dachte an Java und nicht an JavaScript.

                          Kommentar


                          • #14
                            Zitat von fireweasel Beitrag anzeigen
                            In welcher Sprache soll das der Fall sein?
                            Wie Amica schon sagte, muss dazu ja erst mal die Möglichkeit bestehen, den Zuweisungsoperator zu überladen.

                            Wobei ich das hinsichtlich der Verständlichkeit des Codes auch gar nicht immer so eine dolle Sache finde.
                            Das führt eine „Magie“ in den Code ein, die ich auf den ersten Blick gar nicht erkennen kann.

                            Für Javascript ist diese Annahme falsch, zumindest soweit ich diese Sprache verstanden habe.
                            Nee, Operatoren-Überladung gibt's da auch m.W. nicht.
                            I don't believe in rebirth. Actually, I never did in my whole lives.

                            Kommentar


                            • #15
                              Zitat von wahsaga Beitrag anzeigen
                              Wie Amica schon sagte, muss dazu ja erst mal die Möglichkeit bestehen, den Zuweisungsoperator zu überladen.
                              ... und dessen Überladung sollte in einer vernünftig designeten Sprache nicht möglich sein.

                              Zitat von sili
                              Ich dachte an Java und nicht an JavaScript.
                              Ganz sicher? Von welchem Java-Clone redest du?

                              The Java Language Environment :: Features Removed ... :: No More Operator Overloading

                              Ich würde mal glattweg behaupten (bis zum Beweis des Gegenteils), dass dein Code-Beispiel in Java, wenn es denn widerstandslos vom Compiler gefressen und ausgeführt wird, das gleiche bewirkt, wie seine JavaScript- oder auch PHP-Variante: Der ursprünglich in v gespeicherte Wert geht verloren und v referenziert im Anschluss den zweiten Wert. Der Grund, warum das in PHP nicht geht, liegt daran, dass in PHP String-Literale keine Objekte darstellen.
                              Zuletzt geändert von fireweasel; 18.04.2011, 21:08.
                              Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                              Kommentar

                              Lädt...
                              X