PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   Magische Methode für Zuweisung? (https://www.php-resource.de/forum/php-developer-forum/101519-magische-methode-fuer-zuweisung.html)

sili 16-04-2011 14:52

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.

wahsaga 16-04-2011 14:57

Zitat:

Zitat von sili (Beitrag 652893)
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.

Zitat:

So endet das natürlich in einer Fehlermeldung.
Wenn du keine magische Setter-Methode implementiert hast, ist das nur logisch.

sili 16-04-2011 15:14

Zitat:

Zitat von wahsaga (Beitrag 652894)
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:

Zitat von wahsaga (Beitrag 652894)
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 ;)

h3ll 16-04-2011 15:20

Zitat:

Zitat von sili (Beitrag 652893)
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.

sili 16-04-2011 15:32

Zitat:

Zitat von h3ll (Beitrag 652896)
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


h3ll 16-04-2011 15:36

Zitat:

Zitat von sili (Beitrag 652897)
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:

Zitat von sili (Beitrag 652897)
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.

wahsaga 16-04-2011 15:38

Zitat:

Zitat von sili (Beitrag 652895)
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 :-)

Zitat:

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:

Zitat von sili (Beitrag 652897)
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.

Zitat:

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.

AmicaNoctis 16-04-2011 15:41

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

sili 17-04-2011 14:20

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...

wahsaga 17-04-2011 14:48

Zitat:

Zitat von sili (Beitrag 652910)
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 :p

sili 17-04-2011 15:04

Zitat:

Zitat von wahsaga (Beitrag 652911)
Oder kurzum bzw. anders formuliert: Du möchtest eigentlich lieber in einer anderen Sprache als PHP programmieren :p

Man kann ja nicht immer wählen ;)
Aber allgemein arbeite ich wirklich immer weniger mit PHP.

fireweasel 18-04-2011 20:12

Zitat:

Zitat von sili (Beitrag 652897)
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.

sili 18-04-2011 20:25

Zitat:

Zitat von fireweasel (Beitrag 652957)
In welcher Sprache soll das der Fall sein?

Ich dachte an Java und nicht an JavaScript.

wahsaga 18-04-2011 20:33

Zitat:

Zitat von fireweasel (Beitrag 652957)
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.

Zitat:

Für Javascript ist diese Annahme falsch, zumindest soweit ich diese Sprache verstanden habe.
Nee, Operatoren-Überladung gibt's da auch m.W. nicht.

fireweasel 18-04-2011 21:03

Zitat:

Zitat von wahsaga (Beitrag 652961)
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:

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.


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:15 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG