php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 16-04-2011, 15:52
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Question 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.
Mit Zitat antworten
  #2 (permalink)  
Alt 16-04-2011, 15:57
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

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

Zitat:
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.
Mit Zitat antworten
  #3 (permalink)  
Alt 16-04-2011, 16:14
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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:
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
Mit Zitat antworten
  #4 (permalink)  
Alt 16-04-2011, 16:20
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
  #5 (permalink)  
Alt 16-04-2011, 16:32
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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
Mit Zitat antworten
  #6 (permalink)  
Alt 16-04-2011, 16:36
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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:
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.
Mit Zitat antworten
  #7 (permalink)  
Alt 16-04-2011, 16:38
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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 :-)

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

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.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #8 (permalink)  
Alt 16-04-2011, 16:41
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #9 (permalink)  
Alt 17-04-2011, 15:20
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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...
Mit Zitat antworten
  #10 (permalink)  
Alt 17-04-2011, 15:48
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
  #11 (permalink)  
Alt 17-04-2011, 16:04
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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.
Mit Zitat antworten
  #12 (permalink)  
Alt 18-04-2011, 21:12
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

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

Geändert von fireweasel (18-04-2011 um 22:09 Uhr)
Mit Zitat antworten
  #13 (permalink)  
Alt 18-04-2011, 21:25
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von fireweasel Beitrag anzeigen
In welcher Sprache soll das der Fall sein?
Ich dachte an Java und nicht an JavaScript.
Mit Zitat antworten
  #14 (permalink)  
Alt 18-04-2011, 21:33
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

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

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.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #15 (permalink)  
Alt 18-04-2011, 22:03
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

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

Geändert von fireweasel (18-04-2011 um 22:08 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Interzeptor- und magische Methoden Kropff PHP Developer Forum 13 08-11-2009 20:51
magische zauberkugel ? Abraxax Out of Order 17 29-09-2006 03:48
zuweisung.. uschi PHP Developer Forum 5 12-02-2006 01:56
Magische Quadrate Maverick PHP Developer Forum 8 10-10-2002 21:32
implizierte zuweisung Elthin PHP Developer Forum 1 21-06-2001 12:42

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:10 Uhr.