Kwam ik vanmiddag in een discussie tegen hier op GoT.OO werken in php zonder polymorphisme?
Het was een antwoord/vraag op een suggestie van mij dat je in php best OO kan programmeren
Natuurlijk was die suggestie een beetje uitlokkend bedoeld (als men ontkent/bevestigd dat iets kan, moeten ze het ook aannemelijk kunnen maken imho), maar wel degelijk op de waarheid gebaseerd.
In php kan je gewoon (ok, niet zo gewoon als in java) OOP toepassen.
De opmerking hierboven doet denken dat PHP er hopeloos ongeschikt voor is, want er zou geen polymorfisme in php zijn.
Nou vond ik dat een beetje een vreemde/foute suggestie en ben ik es beter gaan navragen/zoeken wat er onder polymorfisme wordt verstaan.
mbravenboer gaf mij dit terug in een mailtje:
En even stuk voor stuk aflopen. Parametrisch polymorfisme is kent men van generics, inclusion kent men van inheritance.Luca Cardelli heeft in het zeer bekende artikel "On Understanding Types,
Data Abstraction, and Polymorphism" een kwalificering gemaakt van
polymorphisme:
1) Universal polymorphism:
a) Parametrisch
b) Inclusion
2) Ad hoc polymorphism
a) Overloading
b) Coercion
Overloading en coercion worden hierbij over het algemeen als de minder
interessante vormen van polymporphisme gezien, maar zijn daarom niet
minder nuttig. Het belangrijkste verschil is dat bij ad hoc
polymporphisme er meestal _verschillende_ implementaties zijn voor de
verschillende situaties en ook een _eindig_ aantal situaties, terwijl er
bij universal polymorphisme maar 1 implementatie is voor _alle_
verschillende situaties.
Overloading zie je vrijwel in alle getypeerde talen, bijvoorbeeld door
de + operator op zowel floats als ints als strings, of bijvoorbeeld door
overloading van methode namen. Bij coercion worden types automatisch
geconverteerd naar een type waarop de operatie kan worden uitgevoerd.
Ook dit zie je in erg veel talen en waarschijnlijk in het bijzonder in PHP.
Met inclusion polymorphisme gaat het om subtyping met super- en
subklassen. Hierdoor behoort een object dus tot verschillende typen en
daardoor kan je wellicht op verschillende typen dezelfde operaties
uitvoeren als deze objecten ook tot een andere gezamelijk type behoren.
Bij parametrisch polymorphisme is een methode of klasse
geparameterizeerd met een type variabele. De code van de methode of
klasse kan functioneren voor alle waarden van deze variabele. Eventueel
moet dus paramter voldoen aan bepaalde constraints.
Als je dus echt een goed oordeel wilt vormen moet je gewoon langsgaan of
de verschillende vormen van polymorphisme worden ondersteunt. Als je
zegt dat PHP geen polymorphisme kent zeg je in feite dat alle vormen
niet worden ondersteunt en dat is denk ik een wat kansloze uitspraak.
Waarschijnlijk wordt er dus bedoeld dat de interessantere vormen
(universal polymorphisme) niet worden ondersteunt.
4 vormen dus, afgebeeld op php:
coercion is simpel, mbravenboer zegt het ook al, tegenwoordig heeft bijna elke taal dat wel (bij 1 + 1.5 wordt vaak al coercion toegepast, de float wordt omgezet in een int).
overloading, ook dat kent php, simpelweg omdat er + overloading is
Wel kan je methoden van superclassen overloaden/herdefinieren.
inheritance, overerving, dat kent php zeker. Hoewel er geen echte structuur is en er geen erving tot een of ander root-object is, php kent wel degelijk overerving.
parametrisch, generics, heel flauw... Je _zou_ kunnen zeggen dat zelfs dit tot op zekere hoogte kan in php
Goed nou is het leuk dat ik van elke vorm van polyformisme een voorbeeld kan bedenken. Maar het gaat me er eigenlijk meer om, dat ik een helderder beeld wil krijgen van wat men nou nodig vindt voor OOP en uiteraard kan ik dan als een flauw rode draad proberen te bewijzen dat PHP OOP toegepast kan worden
Het blijkt wel uit de acceptatie van Java dat primitieven niet zo erg gevonden wordt, ook al is dat niet helemaal object oriented.
Dus de notie "alles is een object" is al niet per se noodzakelijk. Natuurlijk wel "zo veel mogelijk moet een object zijn" (en hier gaat php de fout in wat OO betreft natuurlijk OB kan nog prima).
"Knoeien met het type systeem" is een noodzaak voor OOP (polyformisme, eventueel subtyping, etc)
En er moet natuurlijk een notie zijn van objecten/etc, niet zo als php de mogelijkheid voor objecten. Want eigenlijk is php niet OO, maar je _kan_ er OB in programmeren en als je voor alles wrapper classen schrijft/gebruikt kan je zelfs (imho) OO ermee werken.
Kom maar op, wat vind je nodig voor je iets OOP wil noemen? (en eventueel mag je ook commentaar leveren op de rest van het relaas
Gelijk nog een leuke nadenker, wat vind je van het gebruik van Arrays en dat soort lowlevel constructs in OO (die in php is trouwens best highlevel, het is een multifunctioneel ding dat je als een map, list(?), stack, queue en array kan gebruiken)?