Operator-Ueberladung mit PHP

Operator-Ueberladung mit PHP

am 22.06.2006 13:36:43 von Ulf Kadner

Moin!

Ich sitze gerad hier vor einem Projekt und ärgere mich nen bischen über
mein PHP. ;-)

Folgendes Szenario:

Gegeben ist eine Klasse (ich nenn die mal "Version")
Diese muss mit anderen Klasses gleichen Typs und mit Strings
vergleichbar sein.

Der üblich Weg waere also, die notwendigen Methoden zum Vergleich
einzubinden.

public function compare( Version $version ) { return (int)$result; }
public function compareString( $version_str ) { ... }
public function equals( Version $version ) { ... }
...

Jetzt wäre es doch aus programmiertechnischer Sicht angenehm, wenn man,
statt jedesmal if ($myversion->compare(...) >= 0) und andere aufzurufen
gleich einen direkten Vergleich mittels Operatoren durchführen könnte.

Bsp.:

$oldversion = new Version('0.1.1.002');
$newversion = clone( $oldversion );
$newversion += '0.0.0.1'
if ($oldversion <= $newversion) ...
$newversion = '0.1.1.002';
if ($oldversion == $newversion) ...
usw.

Da ich als Verfasser der Klasse durch die Implementierung eines
derartigen Verhaltens, eine inkorrekte Klassenverwendung minimieren
kann, (Prüfroutine in Klasse integriert) sollte das doch keine schlechte
Sache sein!

Eine Implementierung koennte dann die folgt aussehen (theoret. Code)

public static operator ==( $left, $right ) {
$result = false;
if ($left instanceof Version) ...
elseif (is_string($left)) ...
...
return $result;
}

Gibts so aber leider nicht.

Jetzt frage ich mich, ob wirklich kein Bedarf nach solcher
Funktionalität bei anderen PHP-Programmierern besteht?

In den Todos zu PHP6 finde ich auch keine Hinweise auf derartige Wünsche
oder Diskusionen zu diesem Thema.

Wie seht Ihr das so? Oder bin ich etwa der Einzige, der sich sowas
wünscht? :~]

MfG, Ulf

Re: Operator-Ueberladung mit PHP

am 22.06.2006 13:41:31 von thornythegod

Ulf Kadner schrieb:

> Wie seht Ihr das so? Oder bin ich etwa der Einzige, der sich sowas
> wünscht? :~]

Öhm - nein. Das sicher nicht. Aber aus meiner Sicht: ja :P

Bei Perl kann man jeden Operator und fast jedem Sprachkonstrukt eine
andere Bedeutung zuweisen und die Folge ist katastrophal lesbarer Code.
Wie soll es möglich sein ein == von einem == zu unterscheiden? Soll es
nur lokal oder global gelten? usw.

Gruß,
Torsten

Re: Operator-Ueberladung mit PHP

am 22.06.2006 15:33:35 von Niels Braczek

Ulf Kadner schrieb:

> In den Todos zu PHP6 finde ich auch keine Hinweise auf derartige Wüns=
che=20
> oder Diskusionen zu diesem Thema.

Die kann man ja mal anstoßen.

> Wie seht Ihr das so? Oder bin ich etwa der Einzige, der sich sowas=20
> wünscht? :~]

Nein, ich hätte das auch gerne.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Operator-Ueberladung mit PHP

am 22.06.2006 16:00:30 von Ulf Kadner

Torsten Zühlsdorff wrote:

> Ulf Kadner schrieb:
>>Wie seht Ihr das so? Oder bin ich etwa der Einzige, der sich sowas
>>wünscht? :~]
>
> Öhm - nein. Das sicher nicht. Aber aus meiner Sicht: ja :P

Da bin ich ja mal gespannt! :-)

> Bei Perl kann man jeden Operator und fast jedem Sprachkonstrukt eine
> andere Bedeutung zuweisen und die Folge ist katastrophal lesbarer Code.

Ja, aber was hat das jetzt mit meinem Vorschlag zu tun. Ich habe keine
derartigen Details festgelegt. Das es auch besser geht zeigt z.B. C#

> Wie soll es möglich sein ein == von einem == zu unterscheiden?

Was willst Du damit sagen? == ist nunmal gleich ==
Oder hast Du überlesen, das ich von Überladung schrieb.

> Soll es
> nur lokal oder global gelten? usw.

Naturlich im statischen Kontext der Klasse. Daher auch mein Beispiel
als statische Operator-Überladung

MfG, Ulf

Re: Operator-Ueberladung mit PHP

am 22.06.2006 16:05:15 von Ulf Kadner

Niels Braczek wrote:

> Ulf Kadner schrieb:
>>In den Todos zu PHP6 finde ich auch keine Hinweise...
>
> Die kann man ja mal anstoßen.

Fein. Ich war bei Suchen da wirklich etwas verwundert, das PHP6 derartig
wenig neue interessante Features bieten soll.

> Nein, ich hätte das auch gerne.

Sind wir ja schon 2. Vom Feinsten! ;-)

MfG, Ulf

Re: Operator-Ueberladung mit PHP

am 22.06.2006 19:07:32 von Norbert Melzer

Ulf Kadner schrieb:
> Torsten Zühlsdorff wrote:
>> Wie soll es möglich sein ein == von einem == zu untersche=
iden?
>=20
> Was willst Du damit sagen? == ist nunmal gleich ==
> Oder hast Du überlesen, das ich von Überladung schrieb.

Ich kann mir ungefähr vorstellen was er meint, ich habe in C++ Klass=
en
gesehen, die im Prinzip nix anderes waren als ein selbstgeschriebenes
int, und die Operatoren quer durch die Gegend überluden. Ein
NeuInt+NeuInt resultierte in einer Division der Werte, bei
NeuInt+StandardInt verhielt sich das + wieder ganz anders und so weiter..=


OK, ich gebe zu, die Leute wollten damit darstellen, daß die
möglichkeiten Operatoren zu überladen nicht nur vorteile bringt=
sondern
auch Gefahren birgt, aber wie gesagt, ist jetzt mal so als Beispiel fü=
r
Torstens einwand.

Re: Operator-Ueberladung mit PHP

am 22.06.2006 19:31:11 von Oliver Block

Ulf Kadner wrote:
> Jetzt frage ich mich, ob wirklich kein Bedarf nach solcher
> Funktionalität bei anderen PHP-Programmierern besteht?

Hallo Ulf,

solche Fragen werden gelegentlich in der internals Liste von php diskutiert.
Am besten Du addressiert die Frage dort.

Ich persönlich finden den Gedanken, auch wenn ich OOPHP eher selten nutze,
gar nicht abwegig.:)

Gruß,

Oliver
P.S. Du kannst auch im Archiv nachschauen, ob so etwas bereits diskutiert
wurde.

Re: Operator-Ueberladung mit PHP

am 23.06.2006 10:17:15 von thornythegod

Ulf Kadner schrieb:

>>> Wie seht Ihr das so? Oder bin ich etwa der Einzige, der sich sowas
>>> wünscht? :~]
>>
>> Öhm - nein. Das sicher nicht. Aber aus meiner Sicht: ja :P
>
> Da bin ich ja mal gespannt! :-)

Das brauchst du nicht. Überladungen gehören einfach zu den Techniken,
die ich nur außerordentlich ungerne verwende, obwohl es durchaus
sinnvolle Verwendungen gibt :P

>> Wie soll es möglich sein ein == von einem == zu unterscheiden?
>
> Was willst Du damit sagen? == ist nunmal gleich ==
> Oder hast Du überlesen, das ich von Überladung schrieb.

Ich war gerade ein wenig von der Rolle. ;)

Was für sinnvolle Anwendungsfälle würden dir noch einfallen? Läßt sich
soetwas nicht über MOP oder ähnlichem einfacher und leichter Lesbar
realisieren (nunja, leichter wäre sehr subjektiv aufgrund des
Abstraktionslevels).

Gruß,
Torsten

Re: Operator-Ueberladung mit PHP

am 23.06.2006 10:33:47 von Ulf Kadner

Norbert Melzer wrote:

> Ich kann mir ungefähr vorstellen was er meint, ich habe in C++ Klassen
> gesehen, die im Prinzip nix anderes waren als ein selbstgeschriebenes
> int, und die Operatoren quer durch die Gegend überluden. Ein
> NeuInt+NeuInt resultierte in einer Division der Werte, bei
> NeuInt+StandardInt verhielt sich das + wieder ganz anders und so weiter...

Ist schon klar das man als Programmierer einer anderen Spache nie ganz
ausschliessen kann, das es Leute gibt, die damit versuchen grässliches
zu tun. Aber dazu bedarf es in keiner Sprache des Vorhandenseins von
Operatorüberladungen. Das geht auch so in jeder Sprache.

Z.B. in Delphi gehen im Bezug auf Überladungen noch viel grusligere
Dinge, als bisher aufgezählt. Aber das ändert ja nichts an meiner
Einstellung zu einer Feature-Implementierung in PHP.

Wozu soll das Argument also gut sein?

> OK, ich gebe zu, die Leute wollten damit darstellen, daß die
> möglichkeiten Operatoren zu überladen nicht nur vorteile bringt sondern
> auch Gefahren birgt

Es birgt auch Gefahren mit 100 gegen eine Mauer zu fahren. Trotzdem
gibts immer wieder Leute dies versuchen! ;-)

MfG, Ulf

Re: Operator-Ueberladung mit PHP

am 23.06.2006 10:37:02 von Ulf Kadner

Oliver Block wrote:

> solche Fragen werden gelegentlich in der internals Liste von php diskutiert.
> Am besten Du addressiert die Frage dort.

Genau diese Frage wurde dort noch nicht diskutiert, was eine Frage hier,
zur Akzeptanz durchaus rechtfertigt. Es bringt nix einen Featurerequest
abzusetzen, wenns keiner haben will.

> Ich persönlich finden den Gedanken, auch wenn ich OOPHP eher selten nutze,
> gar nicht abwegig.:)

Na immerhin! ;-)

> P.S. Du kannst auch im Archiv nachschauen, ob so etwas bereits diskutiert
> wurde.

Was Du nicht sagst... :-)

MfG, Ulf

Re: Operator-Ueberladung mit PHP

am 23.06.2006 10:52:10 von Ulf Kadner

Torsten Zühlsdorff wrote:

> Das brauchst du nicht. Überladungen gehören einfach zu den Techniken,
> die ich nur außerordentlich ungerne verwende, obwohl es durchaus
> sinnvolle Verwendungen gibt :P

Das verstehe ich jetzt nicht. Überladung ist Bestandteil fast jeder mir
bekannten OO-Programmiersprache. Was ist daran denn so negativ?

Ich denke es kommt immer auf das Knowhow des Programmierers an.

Ansonsten mueste man C ja direkt verbieten, da man damit noch viel
unvernünftigere Dinge anstellen kann.

>>Was willst Du damit sagen? == ist nunmal gleich ==
>>Oder hast Du überlesen, das ich von Überladung schrieb.
>
> Ich war gerade ein wenig von der Rolle. ;)

:-) Kenn ich.

> Was für sinnvolle Anwendungsfälle würden dir noch einfallen?

Reicht es nicht aus, direkt eine Objekt XYZ, z.B. mit dessen
String-Representation (__toString()) vergleichen zu koennen ohne erst
den String erstellen zu muessen? z.B. ($myVersion ist Object):

if ($myVersion <= '0.0.2.1')

Ich schreibe meine Code ausschliesslich OOP (soweit moeglich) und finde
es daher manchmal einfach ärgerlich derartiges nicht tun zu koennen!

Stattdessen muss ich schreiben:

if ($myVersion->compare('0.0.2.1') <= 0)

> soetwas nicht über MOP oder ähnlichem einfacher und leichter Lesbar
> realisieren (nunja, leichter wäre sehr subjektiv aufgrund des
> Abstraktionslevels).

Da müste ich jetzt erst mal suchen, was Du mit MOP meinst. (0 Bock)

MfG, Ulf

Re: Operator-Ueberladung mit PHP

am 23.06.2006 11:19:37 von thornythegod

Ulf Kadner schrieb:

>> Das brauchst du nicht. Überladungen gehören einfach zu den Techniken,
>> die ich nur außerordentlich ungerne verwende, obwohl es durchaus
>> sinnvolle Verwendungen gibt :P
>
> Das verstehe ich jetzt nicht. Überladung ist Bestandteil fast jeder mir
> bekannten OO-Programmiersprache. Was ist daran denn so negativ?

Die Lesbarkeit. :P Aber es unsinnig darüber zu diskutieren, weil mir
gerade kein fachlicher Grund dafür einfällt ;)

> Ich denke es kommt immer auf das Knowhow des Programmierers an.

Das ist überall so.

> Ansonsten mueste man C ja direkt verbieten, da man damit noch viel
> unvernünftigere Dinge anstellen kann.

Daran hat wohl schon jeder vernüftigere C-Programmier gedacht :P

>> Was für sinnvolle Anwendungsfälle würden dir noch einfallen?
>
> Reicht es nicht aus, direkt eine Objekt XYZ, z.B. mit dessen
> String-Representation (__toString()) vergleichen zu koennen ohne erst
> den String erstellen zu muessen? z.B. ($myVersion ist Object):
>
> if ($myVersion <= '0.0.2.1')
>
> Ich schreibe meine Code ausschliesslich OOP (soweit moeglich) und finde
> es daher manchmal einfach ärgerlich derartiges nicht tun zu koennen!
>
> Stattdessen muss ich schreiben:
>
> if ($myVersion->compare('0.0.2.1') <= 0)

Nunja - ich frage, weil mich genau ein Beispiel nicht davon überzeugt,
solche Funktionalität in die Sprache zu übernehmen. Wobei in deinem Fall
auch dein Editior die Arbeit abnehmen könnte.
Im Prinzip hast du natürlich recht.

>> soetwas nicht über MOP oder ähnlichem einfacher und leichter Lesbar
>> realisieren (nunja, leichter wäre sehr subjektiv aufgrund des
>> Abstraktionslevels).
>
> Da müste ich jetzt erst mal suchen, was Du mit MOP meinst. (0 Bock)

MOP = Model Oriented Programming.

Es läuft im Grund darauf hinaus, "komplizierte" Schritte in eine Art
Scriptsprache auszulagern und aus dieser Scriptsprache den Code in der
ursprünglichen Sprache zu erstellen. Es ist quasi generatives programmieren.
Der Vorteil daran ist die Arbeitsersparnis durch das Zusammenfassen der
Arbeitsschritte in eine Anweisung. Durch das erzeugen des Codes geht
auch kein Overhead für die Interpreation des Scriptes drauf.
Ein Nachteil ist aber der sehr sehr hohe Abstraktionsgrad, der dadurch
betrieben wird - anderseits, reduziert sich dieser im generierten Code
natürlich erheblich.
Ich suche gerade nach dem Referenz-C-Beispiel. Das war irgendeine
Server-Applikation, welche in 50KLOC Script geschrieben wurde und aus
der man 300KLOC Code generiert hat.
Gerade bei C lohnt sich soetwas, wobei mir bei PHP jetzt weniger
sinnvolle Anwendungen einfallen :P

Gruß,
Torsten

Re: Operator-Ueberladung mit PHP

am 23.06.2006 11:32:04 von Johannes Mueller

Ulf Kadner schrieb:

> Da ich als Verfasser der Klasse durch die Implementierung eines
> derartigen Verhaltens, eine inkorrekte Klassenverwendung minimieren
> kann, (Prüfroutine in Klasse integriert) sollte das doch keine
> schlechte Sache sein!
>
> Eine Implementierung koennte dann die folgt aussehen (theoret. Code)
>
> public static operator ==( $left, $right ) {
> $result = false;
> if ($left instanceof Version) ...
> elseif (is_string($left)) ...
> ...
> return $result;
> }
>
> Gibts so aber leider nicht.
>
> Jetzt frage ich mich, ob wirklich kein Bedarf nach solcher
> Funktionalität bei anderen PHP-Programmierern besteht?
>
> In den Todos zu PHP6 finde ich auch keine Hinweise auf derartige
> Wünsche oder Diskusionen zu diesem Thema.
>
> Wie seht Ihr das so? Oder bin ich etwa der Einzige, der sich sowas
> wünscht? :~]

....also die idee hört sich gut an, aber ich würde es begrüssen, wenn
dann auch irgendwas zur Verfügung stehen würde, dass mir bei der
Fehlersuche klarmacht, dass im Skript in Zeile xy ein Operator
überladen wurde.

Sowas wie 'ne Notice oder Variable oder was vergleichbares...

Grüße
Johannes

--
Emails ohne "[nospam]" im Betreff werden kommentarlos gelöscht.

Re: Operator-Ueberladung mit PHP

am 23.06.2006 11:42:20 von thornythegod

Ulf Kadner schrieb:

> if ($myVersion <= '0.0.2.1')
>
> Ich schreibe meine Code ausschliesslich OOP (soweit moeglich) und finde
> es daher manchmal einfach ärgerlich derartiges nicht tun zu koennen!

Was ich vergessen habe zu fragen: Gibt es irgendwelche Test usw. wie
sich das auf die Performance in anderen Sprachen auswirkt? Das würde
mich mal interessieren.

Gruß,
Torsten

Re: Operator-Ueberladung mit PHP

am 23.06.2006 12:47:45 von Norbert Melzer

Ulf Kadner schrieb:
>=20
> Wozu soll das Argument also gut sein?
>=20

Das Argumnent war lediglich um zu zeigen was Torsten meinte als er ===

und == unterscheiden wollte.

Ich muss ja auch sagen, da ich sowohl PHP als C++ programmiere (oder es
zumindest versuche :-) ) wäre ich dankbar über die Überlad=
ung von
Operatoren. Es macht vieles einfacher. Ich finde myClass+myClass
einfacher zu lesen und zu verstehen als zB myClass.add(myClass) oder gar
einer ausgelagerten Funktion wie myFunctionLibTomyClass(myClass,
myClass, "add") (extrembeispiel).

>> OK, ich gebe zu, die Leute wollten damit darstellen, daß die
>> möglichkeiten Operatoren zu überladen nicht nur vorteile bri=
ngt sondern
>> auch Gefahren birgt
>=20
> Es birgt auch Gefahren mit 100 gegen eine Mauer zu fahren. Trotzdem=20
> gibts immer wieder Leute dies versuchen! ;-)

Da sage ich ja auch nix gegen :-)
Wie gesagt, es war als erklärung für Torstens aussage gedacht, =
und
spiegelt nicht eine Abneingung gegen die Technik der
Operatorenüberladung wieder, denn ich... (steht oben :-) )

MFG
Norbert

Re: Operator-Ueberladung mit PHP

am 27.06.2006 11:32:07 von Stefan Ohrmann

Hallo,

Am 22.06.2006 13:36 schrieb Ulf Kadner:
> Wie seht Ihr das so? Oder bin ich etwa der Einzige, der sich sowas
> wünscht? :~]

Ich wünsche mir sowas eigentlich nicht, da ich:

if ($version1->isGreater($version2)) {
...
}

lesbarer finde, aber es gibt da Ansätze von Sara Golemon
():



Gefunden habe ich das ganze im PHP Magazin 03.06 S. 11, nach deren
Aussage ist für die Überladung von ">" und ">=" noch ein Patch
() auf die PHP Sourcen
anzuwenden.

MfG

Stefan

--
Jamie Lee Curtis: "You think your an intellectual, don't you ape?",
Kevin Kline: "Apes don't read philosophy.", Jamie Lee Curtis: "Yes they
do Otto, they just don't understand it!"

Re: Operator-Ueberladung mit PHP

am 28.06.2006 10:44:56 von Andre Manikofski

Ulf Kadner schrieb:
> Moin!
>
> Ich sitze gerad hier vor einem Projekt und ärgere mich nen bischen über
> mein PHP. ;-)
>
> Folgendes Szenario:
>
> Gegeben ist eine Klasse (ich nenn die mal "Version")
> Diese muss mit anderen Klasses gleichen Typs und mit Strings
> vergleichbar sein.
>
> Der üblich Weg waere also, die notwendigen Methoden zum Vergleich
> einzubinden.
>
> public function compare( Version $version ) { return (int)$result; }
> public function compareString( $version_str ) { ... }
> public function equals( Version $version ) { ... }
> ...
>
> Jetzt wäre es doch aus programmiertechnischer Sicht angenehm, wenn man,
> statt jedesmal if ($myversion->compare(...) >= 0) und andere aufzurufen
> gleich einen direkten Vergleich mittels Operatoren durchführen könnte.
>
> Bsp.:
>
> $oldversion = new Version('0.1.1.002');
> $newversion = clone( $oldversion );
> $newversion += '0.0.0.1'
> if ($oldversion <= $newversion) ...
> $newversion = '0.1.1.002';
> if ($oldversion == $newversion) ...
> usw.
>
> Da ich als Verfasser der Klasse durch die Implementierung eines
> derartigen Verhaltens, eine inkorrekte Klassenverwendung minimieren
> kann, (Prüfroutine in Klasse integriert) sollte das doch keine schlechte
> Sache sein!
>
> Eine Implementierung koennte dann die folgt aussehen (theoret. Code)
>
> public static operator ==( $left, $right ) {
> $result = false;
> if ($left instanceof Version) ...
> elseif (is_string($left)) ...
> ...
> return $result;
> }
>
> Gibts so aber leider nicht.
>
> Jetzt frage ich mich, ob wirklich kein Bedarf nach solcher
> Funktionalität bei anderen PHP-Programmierern besteht?
>
> In den Todos zu PHP6 finde ich auch keine Hinweise auf derartige Wünsche
> oder Diskusionen zu diesem Thema.
>
> Wie seht Ihr das so? Oder bin ich etwa der Einzige, der sich sowas
> wünscht? :~]
>
> MfG, Ulf

Hallo Liste,

ist nicht eine implizite Operatorenüberladung in PHP implementiert?

str == str
array == array

Je nach kontext - soweit es mir der Handbuch klar macht. ;-)

Gruß
André

Re: Operator-Ueberladung mit PHP

am 28.06.2006 10:53:10 von Ulf Kadner

Johannes Mueller wrote:

> Ulf Kadner schrieb:
>> Wie seht Ihr das so? Oder bin ich etwa der Einzige, der sich sowas
>> wünscht? :~]
>
> ...also die idee hört sich gut an, aber ich würde es begrüssen, wenn
> dann auch irgendwas zur Verfügung stehen würde, dass mir bei der
> Fehlersuche klarmacht, dass im Skript in Zeile xy ein Operator überladen
> wurde.

Logisch, anders häts keinerlei Sinn.

> Sowas wie 'ne Notice oder Variable oder was vergleichbares...

Exception... :-)

Danke fuer Deine Antwort!

MfG, Ulf

Re: Operator-Ueberladung mit PHP

am 28.06.2006 10:59:09 von Ulf Kadner

Stefan Ohrmann wrote:

> Ich wünsche mir sowas eigentlich nicht, da ich:
>
> if ($version1->isGreater($version2)) {
> ...
> }

Ich nehme an, das Du Operator-Überladung bisher noch nie genutzt hast?
(In anderen Sprachen)

> lesbarer finde

Nur aus Gewohnheit/Lern-Faulheit alles beim Alten lassen zu wollen ist
nicht schön.

>

Ja, das hab ich mittlerweile auch gefunden, aber wenn, dann doch gleich
als PHP-Intern, da es keine Garantie für eingebundene Extensions gibt.

Danke für Deine Antwort.

MfG, Ulf

Re: Operator-Ueberladung mit PHP

am 28.06.2006 11:04:13 von Ulf Kadner

Andre Manikofski wrote:

> Hallo Liste,

So hat mich noch keiner genannt! :-)

> ist nicht eine implizite Operatorenüberladung in PHP implementiert?
>
> str == str
> array == array
>
> Je nach kontext - soweit es mir der Handbuch klar macht. ;-)

Implizit ja, explizit nein.

Es sollte aber eindeutig aus der Fragestellung hervorgehen was ich da
gemeint habe!

MfG, Ulf