Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) Newsgroups: de.comp.lang.php Subject: Re: return types Date: 1 Apr 2016 16:26:38 GMT Lines: 96 Message-ID: References: <1t56fced94i14b9n3e8%sfroehli@Froehlich.Priv.at> <3243755.WBM996tjSl@PointedEars.de> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net /gY3F/a6LhVpFvdDw8m76QKaJbhTk4/WD/IRXE0Mhdxl2EG1s= X-Orig-Path: not-for-mail Cancel-Lock: sha1:7Q8IHSk7fSD3FebIVijaV2TjOJI= X-Blattlinie: dieser Artikel repraesentiert meine persoenliche Meinung X-Medieninhaber: Stefan Froehlich X-Verleger: Stefan Froehlich X-Verlagsort: Wien User-Agent: tin/2.2.1-20140504 ("Tober an Righ") (UNIX) (Linux/3.16.0-4-amd64 (x86_64)) Xref: csiph.com de.comp.lang.php:3854 On Thu, 31 Mar 2016 21:40:04 Thomas 'PointedEars' Lahn wrote: > > class Foo { > > public function cloneMe() : Foo { > > return clone $this; > > } > > } > > > > > > class Foo_Child extends Foo { > > public function cloneMe() : Foo_Child { > > return clone $this; > > } > > } > > ?> > > #v- > > > > führt zu: > > > > | PHP Fatal error: Declaration of Foo_Child::cloneMe(): Foo_Child must be > > | compatible with Foo::cloneMe(): Foo in /home/sfroehli/test.php on line > > | 13 > > Dass die Signaturen kompatibel sein müssen ist klar, > Ich finde auch das zu eng gedacht. Stimmt, *müssen* tun sie es nicht. Allerdings: > Wenn ich eine Methode überschreiben kann, sollte ich das auf beliebige > Art tun können. Polymorphismus impliziert nicht, dass Gleichbenanntes > auch gleich funktionieren muss; denn ich kann die Klasse eines Objekts > ermitteln und die polymorphe Methode so aufrufen, wie es für die > jeweilige Klasse korrekt ist. Ich persönlich möchte, wenn ich lese: #v+ abstract class Foo { public function bar(int $b) : int; } #v- ...auch *garantiert* das folgende fehlerfrei tun können: #v+ if ($f instanceof Foo) $b2 = $f->bar($b1); #v- ...und nicht womöglich daran scheitern, dass die abgeleitete Klasse Foo_Bar die Methode womöglich ganz anders definiert hat. Das geht aber nur dann, wenn mir nicht jemand die Signatur dieser Methode unter dem Hintern wegziehen kann. Allerdings würde ich mir gelegentlich das wünschen, was ich bei C++ so geschätzt habe, z.B.: #v+ abstract class Foo { public function bar(Array $a) : int; public function bar(Collection $c) : int; } #v- Es geht allerdings - wenn überhaupt - nur eines von beiden: Entweder überschreiben Methoden diejenigen ihrer Elternklasse unabhängig von den verwendeten Parametern, oder halt nicht. > > aber eine *Einschränkung* des return types in einer abgeleiteten > > Klasse ist doch vollkommen unproblematisch; [...] > ACK. Darüberhinaus sehe ich nicht einmal die Notwendigkeit, dass > die Rückgabetypen polymorpher Methoden in einer > klassenhierarchischen Beziehung zueinander stehen. Wenn zum > Beispiel eine abgeleitete Klasse eine gleichnamige Eigenschaft > hat, in der ein Wert mit einem anderen Typ gespeichert ist als in > einer übergeordneten Klasse und ein Getter dafür existiert, so ist > es nicht einzusehen, dass der Getter nicht gleich heissen > darf *und* einen anderen Rückgabetyp hat als den, welchen der so > überschriebene Getter hat. Das sehe ich - aus dem gleichen Grund wie oben - nun wiederum anders. Wäre so etwas zulässig, könnte man sich nicht mehr auf die Signaturen gemeinsamer Elternklassen verlassen, und gerade das finde ich sehr hilfreich. So, wie es derzeit implementiert ist, ist das aber jedenfalls halbgar und hilft weder Dir noch mir weiter. Servus, Stefan -- http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich Offizieller Erstbesucher(TM) von mmeike Stefan: die Lust zu lieben! (Sloganizer)