Scriptorama.nl

Header image showing a keyboard, mouse, laptop and books on design patterns

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.

PHP:
  1. trait A {
  2.   function helloWorld()
  3.   {
  4.   }
  5. }
  6.  
  7. class MijnClass
  8. {
  9.    use A;
  10. }
  11.  
  12. $x = new MijnClass();
  13. $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:

PHP:
  1. trait A {
  2.   function helloWorld()
  3.   {
  4.   }
  5.  
  6.   function doX()
  7.   {
  8.   }
  9. }
  10.  
  11. trait B {
  12.   function helloWorld()
  13.   {
  14.   }
  15. }
  16.  
  17. class MijnClass {
  18.   use a { doX => doY }
  19.   use b { !helloWorld }
  20. }
  21.  
  22. $x = new MijnClass;
  23. $x->myHelloWorld();
  24. $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.

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.

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?

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.

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?

Stefan Marr heeft z'n RFC geupdate: http://www.stefan-marr.de/artikel/rfc-traits-for-php.html

Ik heb mijn mening herzien en ik ben om:
http://www.phpfreakz.nl/forum.php?forum=5&iid=1107152

Het ziet er echt goed uit. Zal van pas komen denk ik. Geef het een betere kans dan de taint mode.

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

Leave a comment
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>