Traits in PHP?
Het regent voorstellen voor PHP de afgelopen paar maanden, na taint mode, closures/betere anonymous functions kwam Stefan Marr gister met een voorstel voor Traits. Traits zijn een soort niet te instantieren class (denk interface / abstract class) welke gebruikt kunnen worden om een class definitie verder uit te breiden.
-
trait A {
-
function helloWorld()
-
{
-
}
-
}
-
-
class MijnClass
-
{
-
use A;
-
}
-
-
$x = new MijnClass();
-
$x->helloWorld();
Wanneer een class een trait gebruikt worden de methods die gedefinieerd zijn in deze trait gekopieerd naar de klasse in kwestie. Het voordeel hiervan is dat je geen gigantische inheritance boom creeƫrt of hoeft te copy pasten wanneer je 2 verschillende classes definieert die gelijke methodes hebben
Je kunt met dit voorstel meerdere traits gebruiken en daarbij kiezen hoe er omgegaan moet worden met dubbele methodes. Een methode die in meerdere traits bestaat kun je namelijk aliasen of gewoon niet toevoegen aan de class definitie:
-
trait A {
-
function helloWorld()
-
{
-
}
-
-
function doX()
-
{
-
}
-
}
-
-
trait B {
-
function helloWorld()
-
{
-
}
-
}
-
-
class MijnClass {
-
use a { doX => doY }
-
use b { !helloWorld }
-
}
-
-
$x = new MijnClass;
-
$x->myHelloWorld();
-
$x->doY();
Het voorstel is aardig positief ontvangen, ook door hoe Stefan Marr zijn voorstel heeft gebracht, al is nog niet iedereen overtuigd van het nut van Traits. Ook is men nog niet helemaal gecharmeerd van de syntax die Stefan Marr heeft voorgesteld.
Je kunt nu al Traits proberen door de patch van Stefan Marr toe te passen op een recente versie van de PHP 5.2 branch.
Volg Scriptorama via RSS!
Reageer ook!
> Het voorstel is aardig positief ontvangen,
> ook door hoe Stefan Marr zijn voorstel heeft
> gebracht, al is nog niet iedereen overtuigd
> van het nut van Traits.
Het voostel is leuk, maar ik heb mijn twijfels. Dergelijke dingen kunnen mijn inziens namelijk gewoon met compositie/proxy te worden opgelost, om de overzichtelijkheid en duidelijkheid te bewaren.
De voordelen zijn evident; je hoeft immers geen instantie van andere objecten door te geven, je misbruikt overerving niet, maar het voelt toch als een OO hack.
Maar goed, ik zal vanavond de RFC eens doorlezen en wat meer (en gegronder) commentaar leveren.
Door berry__
op 02.20.08 @ 9:48 am | Permalink
Heel interessant, alleen kan ik geen situatie bedenken waar ik dit in zou gebruiken.
use a { doX => doY }
Zou ik uit het oogpunt van de PHP syntax zo doen.
use a ( doX AS doY );
Voor deze kan ik niet even 123 een goede syntax bedenken.
use b { !helloWorld }
Alleen vraag ik mij af of 'use' geen problemen gaat geven met Namespace-support?
Door Sebastiaan Stok
op 02.20.08 @ 11:38 am | Permalink
Wbt. use, nee, staat in een andere context waar het als het goed is geen problemen oplevert.
Over syntax, Marr heeft zelf wat mogelijkheden op een rijtje gezet: http://news.php.net/php.internals/35613
Maar goed, syntax is natuurlijk pas interessant op het moment dat de feature interessant is.
Door Mathieu Kooiman
op 02.20.08 @ 11:44 am | Permalink
Dit zou wel een heel makkelijke oplossing zijn om flexibeler classes uit te breiden.
Maar ik kan me voorstellen dat men hier hetzelfde op reageert als op 'goto:label', het kan leiden tot rommelcode.
berry, ik kan zo gauw niets vinden op je steekwoorden, heb je een linkje daarover?
Door Chris
op 02.20.08 @ 2:45 pm | Permalink
http://en.wikipedia.org/wiki/Composite_pattern / http://en.wikipedia.org/wiki/Proxy_pattern
Door Mathieu Kooiman
op 02.20.08 @ 2:54 pm | Permalink
Stefan Marr heeft z'n RFC geupdate: http://www.stefan-marr.de/artikel/rfc-traits-for-php.html
Door Mathieu Kooiman
op 02.20.08 @ 8:33 pm | Permalink
Ik heb mijn mening herzien en ik ben om:
http://www.phpfreakz.nl/forum.php?forum=5&iid=1107152
Door berry__
op 02.21.08 @ 1:34 pm | Permalink
Het ziet er echt goed uit. Zal van pas komen denk ik. Geef het een betere kans dan de taint mode.
Door Marten
op 02.21.08 @ 1:56 pm | Permalink
[...] Eerder hadden we al voorstellen voor Taint mode (waar het akelig stil over blijft, overigens) en Traits. Gister kwam daar een derde bij namelijk een voorstel voor closures & lambda's door Christian [...]
Door PHP voorstel: Closures & Lambda functies | Scriptorama.nl op 08.03.08 @ 1:15 pm | Permalink
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>