Vous êtes sur la page 1sur 8

16/8/2015

LesliaisonsUMLimplmentesavecPHP
Forums Tutoriels Magazine FAQs Blogs Chat Newsletter tudes Emploi Club
Contacts

Vosrecrutementsinformatiques
700000dveloppeurs,chefsdeprojets,ingnieurs,informaticiens...
Contacteznotrequipespcialisteenrecrutement
Accueil

ALM

Java

.NET

Dv.Web

EDI

Programmation

SGBD
ALM

FORUMSALM

TUTORIELSALM

Office
Merise

Solutionsd'entreprise

Applications

Mobiles

p
u
b
l
i
c
i
t

Systmes

UML

F.A.QsALM

LIVRESALM

LesliaisonsUMLimplmentesavecPHP

Tabledesmatires
I.Hritage
IA.Privprotg
IB.Hritagemultiplearbre
d'hritage
IC.SubstitutiondeLiskov
II.Association
III.Agrgation
IIIA.Agrgateurautomatis
IV.Composition
V.Implmentation
VI.Lectured'unschmaUML
VII.Conclusion
9commentaires
UMLdfinitplusieursliensremarquablesentrelesclasses.Latotalitdeceslienspondrspermetde
mesurercequel'onappellelecouplage.Savoirlireundiagrammedeclassesestaujourd'huiindispensablepourlaconceptiond'une
applicationweb.PHPnefaitpasexceptioncela,sonmodleobjettanttrsmrettoutfaitcapable.
Nousallonsiciprsenterlesdiffrentesliaisons,leurscaracteristiquesainsiqueleursavantages/inconvnientsetquandlesutiliser.
Association,hritage,agrgation,composition.
Danscetarticle,nousallonsvoircommentutilisercesliaisonsavecPHP.
Articlelu8476fois.
L'auteur
JulienPauli
L'article
Publile6juillet2010Misjourle15mai2012
VersionPDFVersionhorsligne
ePub,AzwetMobi
Lienssociaux

Partager

I.Hritage
Unenotionquetoutlemondeconnaitcertainement,nouspasseronsvitesursa
dfinition.L'hritagesetraduitparunlienfortentre2classesdontl'enfant"estun"
"estunesortede"visvisdesonparent.
Sil'onnepeutpasdirecela,alorsilnes'agitpasd'unhritage.L'hritagevient
rapidementl'espritpourrsoudretouslesproblmesdeconceptionmaisilest
rarementlasolutionetilfautl'utiliseravecmodration(uneprofondeurd'hritage
tropimportantetraduitunproblmedeconception).
Nousallonsvoirquel'hritagepossdequelquesastuces.
EnUML,l'hritagesereprsenteparuneflcheblanchegnralementtournevers
lehaut.

Hritage
Uneclassevhicule
Slectionnez
<?php
classVehicule{}

Unhritageenversvhicule
Slectionnez

http://julienpauli.developpez.com/tutoriels/php/liaisonsuml/

1/8

16/8/2015

LesliaisonsUMLimplmentesavecPHP
<?php
require_once'path/to/Vehicule.php';
classVoitureextendsVehicule{}

Premirenotion:l'hritageestunlienfort.Unepartieducodeduparentvatre
portdansl'enfant,celuiciadoncbesoindeladfinitiondelaclassedesonparent
pourexisterd'ol'instructionrequire.
LeprogrammePHPDependpermetuneanalysestatiquedecodeetlaproductionde
statistiqueentermedecouplage,decohsionetd'hritage.
Pourviterd'avoirchargerlesdpendancesmanuellement(require),PHPpropose
desmcanismesd'autoloadpasssenrevuedanscetarticle.

IA.Privprotg
Lorsqu'onparle"d'unepartieducodequivatreporte",ils'agitducodenon
priv.Ladiffrencedevisibilitentreprivetprotgn'adesensquepour
l'hritage.
Toutcequiestprotg(etdoncaussitoutcequiestpublic)vatreportduparent
versl'enfantautomatiquementalorsquecequiestprivn'estpasport.
L'hritageetleportagedelavisibilitpriveenPHP
Slectionnez
<?php
classA
{
private$foo;
}
classBextendsA{}
var_dump(newB);
/*affiche
object(B)#1(1){
["foo":"A":private]=>
NULL
}
*/

CommeonlevoitlorsquePHPdumpunobjetilutiliseunenotation"nom
attribut":"nomclasse":privateetdonclenomdelaclassequipossdel'attribut
privestbienvisible.Ilsepasselammechoselasrialisation,PHPajoute
"\0nomclasse\0nomattribut",ouencorelorsqu'oncasteunobjetversuntableau
(c'estuneastuceutilisepourmodifierunattributprivlorsqu'onenn'apasle
droit,maispassonssurcettetechniquetrs"hack")
Srialisationetattributsprivs
Slectionnez
<?php
classA
{
private$foo;
}
classBextendsA{}
echoserialize(newB);
var_dump((array)newB);
/*affiche
O:1:"B":1:{s:6:"Afoo";N;}
Unhexdumpmontrebienlescaractresnuls\0:
000000004f3a313a2242223a313a7b733a363a22|O:1:"B":1:{s:6:"|
00000010004100666f6f223b4e3b7d|.A.foo";N;}|
0000001b
array(1){
["Afoo"]=>
NULL
}
Unhexdumpmontrebienlescaractresnuls\0:
000000006172726179283129207b0a20205b2200|array(1){.[".|
000000104100666f6f225d3d3e0a20204e554c4c|A.foo"]=>.NULL|
000000200a7d0a|.}.|
00000023
*/

CommeleschainesPHPsont"binarysafe",ellespeuventcomporterlecaractre
"\0"sansgnercettereprsentation.\0adonctchoisidansleformatde
srialisationpardfaut.
Preuvedunonportagedelavisibilitprive
Slectionnez
<?php
classA
{
private$foo='A';
protected$bar='A';

publicfunctiondumpPrivate()

http://julienpauli.developpez.com/tutoriels/php/liaisonsuml/

2/8

16/8/2015

LesliaisonsUMLimplmentesavecPHP
{
return$this>foo;
}

publicfunctiondumpProtected()
{
return$this>bar;
}
}
classBextendsA
{
private$foo='B';
protected$bar='B';
}
$b=newB;
echo$b>dumpPrivate();
echo$b>dumpProtected();
/*Affiche
A
B
*/

Lecodecidessusdmontrequelavisibilitpriven'estpasportedansl'hritage
cequiestlecasdelavisibilitprotge.
Biensr,nousneparlonspasicidelavisibilitpubliqueaccessiblepartoutetqui
estportedansl'hritagecommelavisibilitprotge.

IB.Hritagemultiplearbred'hritage
EnPHPl'hritagemultiplen'existepas:uneclassenepeuthriterqued'uneetune
seuleclasse.Ainsil'hritagedoitserflchircarilreprsenteunpointdeblocage
("attention,jecreunhritage,sidanslefuturjeveuxhriterd'uneautreclasse:
jenepourraiplus").
Unedessolutionsfaceunproblmed'hritagemultipleestledesignpattern
dcorateur.
Enrevancheonpeutallongerl'arbred'hritagetantqu'onrespectelarelation"est
un",souventvuecomme"gnralisationspcialisation"ettantquel'onne
bloquepasl'arbreaumoyendumotclfinal.
Nonrespectdelarelationd'hritage:fatalerror
Slectionnez
<?php
classA
{
publicfunctionfoo(){}
}
classBextendsA
{
privatefunctionfoo(){}
}
/*Affiche
Fatalerror:AccessleveltoB::foo()mustbepublic(asinclassA)
*/

L'exemplecidessusbriselarelationd'hritagecarBhritedeAmaisBn'estpas
unAcarilnepeutpasfairecequeAsaitfaire(onnepeutappelerlamthode
foo()surluimaisonlepeutsursonpre).Idemsil'onutiliseprotecteddansle
parentetprivatedansl'enfant.
Largled'hritageestsimple:l'enfantdoitsavoirfairetoutcequesaitfairelepre
etventuellementplus,maisenaucuncasmoins("estun")
Sivousvoulezbloquerl'hritaged'uneclasse(etdoncterminerl'arbred'hritage),
PHPvouslepermetaumoyendumotclfinal
Utilisationdefinalpourbloquerl'hritage
Slectionnez
<?php
classA{}
classBextendsA{}
finalclassCextendsB{}
classDextendsC{}//Fatalerror:ClassDmaynotinheritfromfinalclass(C)

Dansl'exemplecidessus,noussommesenprsenced'unarbred'hritaged'une
profondeurde3niveauxdontledernierniveauestfinal:toutetentativede
prolongementdel'arbreviasabrancheCsesolderaparuneerreurfatale(laclasse
Ddansl'exemple),ilrestepossibleparcontredeprolongerl'arbreenrecrantune
branchepartirdeB.
L'utilisationdefinaldevantuneclasseestraremaispeuts'avrerpratique.
finalpeuttreutilisdevantunemthodeempchantainsisasurchargedansune
classefille.Cetteutilisationestrare,maisintressantedansdescastrs
spcifiques.

IC.SubstitutiondeLiskov
http://julienpauli.developpez.com/tutoriels/php/liaisonsuml/

3/8

16/8/2015

LesliaisonsUMLimplmentesavecPHP
Leprincipedesubsitutionestclair:UnobjetutilisateurdeAdoitpouvoirmanipuler
unfilsdeAsanss'enrendrecompte.Sivousbrisezceprincipe,PHPvousavertira
maiscontrairementl'hritage,iln'enverraqu'uneerreurdeniveauE_STRICTsi
vousavezactivcerapportd'erreur(quinel'estpaspardfautpourPHP<5.4).
CassureduprincipedeSubstitutiondeLiskov
Slectionnez
<?php
/*indispensablesinonl'erreurn'apparaitpas,engnral
E_STRICTestactivavecE_ALLdansphp.inipourledveloppement*/
error_reporting(E_STRICT);
classA
{
publicfunctionfoo($a,$b){}
}
classBextendsA
{
publicfunctionfoo($a,$b,$c){}
}
/*Affiche
Strictstandards:DeclarationofB::foo()shouldbecompatiblewiththatofA::foo()
*/

Onvoitclairementiciqu'unobjet(Cparexemple)quiutilisaitAnepeutpasutiliser
Bsaplacecarildevraitalorspasserunparamtreenpluslorsdel'appeldela
mthodefoo()surceluici.Leprincipedesubstitutionrejointceluidel'arbre
d'hritagemaislepousseunpeuplusloin.
Dansl'exemplecidessus,lesimplefaitdepasserleparamtreadditionnel$cen
facultatif(c'estdireenluidonnantunevaleurpardfaut),rendlasignature
compatibleaveccelleduparent,etfaitainsidisparaitrel'erreur.
BriserleprincipedesubstitutiondeLiskovavecuneinterfacegnrerauneerreur
deniveaufataletnonplusstrict.
II.Association
L'associationestuneutilisationponctuelleoupermanented'unemthoded'unobjet
auseind'unautre.

Association

Associationponctuelle
Sil'utilisationestpermanente,l'inclusiondelaclasseutiliseestobligatoire.Dans
lecascontraireellepourratrechargel'utilisationetletraitUMLdevientalors
pointill.
Uneassociationpermanente
Slectionnez
<?php
require_once'path/to/Log.php';
classData
{
publicfunction__construct()
{
Log::write('text');
//...
}
//...
}

Ici,dslacrationdel'objetDatalaclasseLogvatreutilise,elleestdonc
absolumentncessaire.Onauraitpuimaginerd'autrescasidentiques
fonctionnellement:touteslesmthodesdeDatautilisentLogparexemple.
Uneassociationponctuelle
Slectionnez
<?php
classData
{
publicfunctionfoo(Log$l)
{
$l>method();

http://julienpauli.developpez.com/tutoriels/php/liaisonsuml/

4/8

16/8/2015

LesliaisonsUMLimplmentesavecPHP
//...
}
publicfunctionbar(){}
}

Danslecascidessus,onpeututiliserl'objetDatasansjamaisavoirbesoindeLog
(onpeutparexemplen'appellerquelamthodebar()etjamaisfoo()).
Ils'agitdoncd'uneassociationmaisponctuelle.Onauraitpuimaginerd'autres
exemplesounemthodedeDatautiliselaclasseLogenl'incluantpluttqued'en
recevoirunobjetviaunemthode.
Rappel:PHPn'apasbesoindeconnaitreladfinitiondelaclasselorsqu'ontypeun
paramtredemthodesurcetteclassel.Aucuneinstructionrequiren'estdonc
ncessaire.
III.Agrgation
L'agrgationestuneassociationparticuliredanslaquelleunobjetestencapsul
dansunautreavecpossibilitd'entresortie.C'estuneassociationpermanente
maisplusprcisequisetraduitparlaprsencedegetters/setters.Onl'utilisepour
effectuerdeladlgationderesponsabilitsetdel'tudede
variabilits/communalits.
EnUML,larelationestcaractriseparunlosangeblancquivadel'objetagrgant
versl'objetagrg.Ontraduitl'agrgationparunerelation"aun","estcompos
d'un","utiliselesservicesd'un".

Agrgation
UneagrgationsimpleenPHP
Slectionnez
<?php
classLog
{
protected$file;

publicfunctionsetFile(File$file)
{
$this>file=$file;
}

publicfunctiongetFile()
{
return$this>file;
}

publicfunctionevent($priority,$message)
{
if($this>file){
$this>file>write(sprintf("Priority:%d,message:%s",$priority,$message));
}
}
}
classFile
{
publicfunctionwrite($message){}
}

Ilesttrsimportantdenoterquebienqueles2objetssoientlis,ilsnelesontque
sionledsireetsil'onprendlapeinedelesconstruireetlesassemblerlamain
(principedel'inversiondecontrle).
C'estLAdiffrenceaveclarelationdecomposition(chapitresuivant).Dansnotre
exemple,l'objetagrgFileestpartageableetlesaccesseursget/setdeLog
permettentdepartageroudercuprerl'objet.
Iciils'agitdeset/get:lacardinalitestdoncde1:l'objetLognepeutpossderen
luiqu'unetunseulobjetFile.EngnralonmatrialisecelasurleschmaUML
directementenindiquantlacardinalitprsdelarelation.Personnelementje
prfreutiliserdesconventions:silacardinalitavaittdeplusieurs(plusieurs
objetsFilepeuventtreajouts/retirsLog),alorsj'auraiscritdesmthodes
addFile()etremoveFile()etnonget/setquilaissentsuggrer"unetunseul".

IIIA.Agrgateurautomatis
Crertouteslesmthodesget/setdesagrgatsdansuneclassepeutdevenir
pnible.Atitred'exemplevoiciuneutilisationdesmthodesmagiquesetdela
ReflectionenPHPpourcreruneagrgateurautomatiseninterceptantlesappels
demthodesset/get.
Laclasseagrgateur
Slectionnez
classAgregator
{
publicfunction__call($meth,$args)
{

http://julienpauli.developpez.com/tutoriels/php/liaisonsuml/

5/8

16/8/2015

LesliaisonsUMLimplmentesavecPHP
if(preg_match("#(g|s)et(\w)+#",$meth,$matches)){
list(,$getOrSet,$class)=$matches;
try{
$param=newReflectionProperty($this,$paramName=strtolower(substr($meth,
}catch(ReflectionException$e){
$this>fail("Unknownattribute",$e);
}
if(!$param>isPublic()){
switch($getOrSet){
case'g':
return$this>$paramName;
break;
case's':
if(array_key_exists(0,$args)&&$args[0]instanceof$paramName){
$this>$paramName=$args[0];
}
return$this;
break;
}
}
$this>fail("Aggregateattributeshouldnotbepublic");
}
}

privatefunctionfail($message,Exception$e=null)
{
thrownewRuntimeException($message,null,$e);
}
}

Danscetteexemple,unemthode__call()estutilisepourintercepterlesappels
auxmthodesget*()ouset*().
Onanalyseensuiteleparamtrepasscesmthodesetonregardesidansla
classeilexisteunattributnonpublicayantlemmenom(parexemplesetA(new
A)).Sic'estlecasons'execute,sinononrenvoieuneerreur.
Cetyped'artefact"magique"estutilissousuneformedformedanscertains
frameworkscommeZendFrameworkouSymfony.
L'exemplemontrcidessusn'estlqu'titrededmonstrationdelaflxibilitde
PHP,iln'estpasutilisdansdescasrelscarilapportedenombreux
inconvnients.
IV.Composition
Lacompositionestuneagrgationnonpartageable(nonisolable).Concrtement,
celasignifiequecommepourl'agrgation,unobjetvatrecontenudansunautre.
Ladiffrenceestqu'iln'yaaucunmoyendecrerl'objetcontenu,nidele
rcuprer.

Composition
Exempledecomposition
Slectionnez
<?php
require_once'path/to/File.php';
classLog
{
protected$file;

publicfunction__construct($path)
{
$this>file=newFile($path);
}
publicfunctionevent($priority,$message)
{
$this>file>write(sprintf("Priority:%d,message:%s",$priority,$message));
}
}
classFile
{
publicfunctionwrite($message){}
}

Lacompositionsereconnaitparrapportl'agrgationparl'absencedeget/set
(nonpartageable)etparlaprsenced'un"new"auseind'uneclasse(oud'une
fabrique).
Dansl'exemplecidessus,lacrationd'unobjetLogentrainelacrationd'unobjet
File(cellecipeutcependanttrediffre)etsurtoutladestructiondel'objetLog
entraineladestructiondel'objetFilelecomposant.
Lacompositionestpeurecommandecarellerendlecouplagetropfort,elleest
l'inverseduprinciped'inversiondecontrleetrendainsilesprogrammes
difficilementtestables.
V.Implmentation

http://julienpauli.developpez.com/tutoriels/php/liaisonsuml/

6/8

16/8/2015

LesliaisonsUMLimplmentesavecPHP
L'implmentationestuneliaisonquifaitinterveniruneclasseetuneinterface.Une
classeimplmenteuneinterface.Larelationsedcritcomme"permet","admet","a
lacapacitde".
Contrairementl'hritage,uneclassepeutimplmenterautantd'interfacesqu'elle
lesouhaite.Uneimplmentationn'estpasunhritage,mmesiayressemble
danslaforme.
C'estunlienfortquincessitel'inclusionducodedel'interfacedanslecodedela
classel'implmentant(prsenced'uneinstructionrequire).EnUML,celasetraduit
parlammeflchequ'unhritage,maisletraitestdiscontinu.

Implmentation
Uneinterfacequelconque
Slectionnez
<?php
interfaceVendable
{
functionvendre($nb);
}

Implmentation
Slectionnez
<?php
require_once'path/to/Vendable.php';
classProduitimplementsVendable
{
publicfunctionvendre($nb){}
publicfunctionfoobar(){}
}

Siuneclasseimplmente2interfacesdfinissantunemmemthode,ilyaalors
conflit,PHPrenverrauneerreurfataleetvousdemanderadevousarranger
(renommerunemthodeparexemple).
Conflitd'interfaces
Slectionnez
interfaceFoo
{
functionbaz();
}
interfaceBar
{
functionbaz();
}
classAimplementsFoo,Bar
{
publicfunctionbaz(){}
}
/*Affiche
Fatalerror:Can'tinheritabstractfunctionBar::baz()(previouslydeclaredabstractinFoo)
*/

Bienquecesoitrarementutilis,uneinterfacepeuthriter(extends)d'uneautreet
lasurchargeroulacomplter.
Uneinterfacepardfinitionreprsentedesmthodespubliques.Vouspouvez
prciserlemotcl'public',maisc'estfacultatif.
Lecorpsdesfonctionsnedoitpastrecrit,ilnefautmmepasouvrirles
accolades,maisbienfermerladclarationimmdiatementavecunpointvirgule.
Uneinterfacenepeut,pardfinition,pascontenird'attributs.
Uneinterfacepeutcontenirdesconstantes.
Vousdevezdfinirconcrtementlamthodedel'interface,danslaclasseen
question:vousnepouvezpasladclarer"abstract".
VI.Lectured'unschmaUML
Entrainonsnouslalectured'undiagrammedeclassesUMLsimplifidanslequel
n'apparaissentquedesrelations.

http://julienpauli.developpez.com/tutoriels/php/liaisonsuml/

7/8

16/8/2015

LesliaisonsUMLimplmentesavecPHP

Schmagnral
Alalecturedeceschmasimplifinouspouvonsaffirmer(chaquemotdesphrases
ciaprsestrflchi):
1. Laclasse"principale"estMagasin,onpeutluipasserunePersonneetdes
Consommables
2. Ilexiste2typesconcrtsdePersonne:ClientetAnonyme
3. Ilexiste2typesabstraitsdeConsommable,ServiceetProduitchacun
ayantdessoustypesconcrts
4. LeMagasingreunTicket.
Attention"un"et"des".Sic'est"un"etqu'ils'agitd'uneagrgation,desmthodes
get/setserontprsentes.Sic'est"des",pouruneagrgationtoujours,alorsdes
mthodesadd/removeserontprsentes.
"Onpeutluipasser"dfinitl'agrgation,enrevanche"FoogreunBar"laisse
suggrerunecompositiondeBardansFoo.
VII.Conclusion
LesliaisonsUMLdanslesdiagrammesdeclassessonttrsimportantes.La
comprhensiond'unsystmed'informationorientobjetsedcomposeen2parties:
lacomprhensiondelaresponsabilitdechaqueobjetETlamaniredontcetobjet
estliausystmegnral.Exactementcommeenmcanique,oudemanireplus
gnraleen"tudedesystmes"(dansnotrecasinformatique).
UMLestunlangagedemodlisationpermettantdedessinerdesschmas
reprsentantunepartieprcised'unsystmeinformatique.Ilexistedestonnesde
schmas,pasquelediagrammedeclassesmmesiceluiciestleplusutilis.
Ilexisteaussideslogicielsdemodlisation,certainssontcapablesdegnrerle
squeletteducodepartirdudiagrammedeclasses.Cetteutilisationestpeu
rpanduedanslemondePHP,maistrsutiliseenJavaouencoreenC++.
NotrerubriquegnraleUML
LespatternsdetestsavancsavecPHPUnit
Vousavezaimcetutoriel?Alorspartagezleencliquantsurlesboutonssuivants:

Partager

Copyright2010.Aucunereproduction,mmepartielle,nepeuttrefaitedecesiteetde
l'ensembledesoncontenu:textes,documents,images,etc.sansl'autorisationexpressede
l'auteur.Sinonvousencourezselonlaloijusqu'troisansdeprisonetjusqu'300000de
dommagesetintrts.

ResponsablebnvoledelarubriqueALM:FrancisWalterContacterparemail
Nouscontacter

Participez

Hbergement

Informationslgales

Partenaire:HbergementWeb

Copyright20002015www.developpez.com

http://julienpauli.developpez.com/tutoriels/php/liaisonsuml/

8/8