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:
-
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:
PHP:
-
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.