En önskning till PHP-tomten

Som ni kanske redan har läst här på min fina blogg har jag dykt ner lite i PHP under föräldraledigheten. Säga vad man vill om PHP men med Laravel kan man ha riktigt kul och få en vettig projektstruktur på köpet. Två flugor i en smäll så att säga. Nåväl, nu efter ett par månaders hackande tänkte jag ta tillfället i akt att ändå gnälla lite eftersom det är det vi människor är bäst på. 😉

Det finns mycket som man skulle kunna gnälla över när ämnet är PHP, särskilt ur mitt perspektiv som (främst) Javaprogrammerare. Men alla språk har sina begränsningar, sin historia och sin ryggsäck, och om verktyget – det vill säga språket – inte passar ändamålet är det väl bättre att byta verktyg än att sura ihop? Med det sagt finns det ändå en stor grej som jag saknar vad det gäller objektorienteringen i PHP, och det är det här med package-private visibility. Ni vet, den där varianten där man i Java utelämnar visibility i till exempel en metoddeklaration. I Java innebär det att metoden endast kan anropas från klasser i samma paket. Det kan låta som lite ”jaha” men det är faktiskt någonting väldigt användbart när man modellerar. Genom att använda denna visibility på ett förnuftigt sätt kan klasser inom ett och samma paket samarbeta utan att man behöver exponera sånt som bara är relevant inom paketet ut mot resten av systemet. Ett paket kan då designas att endast ha ett fåtal metoder som går att anropa utifrån. Det gör att vi kraftigt kan begränsa interaktionspunkterna med koden i paketet vilket i sin tur ger oss bättre förutsättningar att ha en förvaltningsbar kodbas.

Ett enkelt exempel på när avsaknaden av package-private visibility ställer till modelleringsbekymmer är när man vill bygga sig en Factory som skapar objekt av Foo, vi kallar den för FooFactory. Eftersom vi vill att FooFactory alltid ska sköta konstruktionen av objekt av typen Foo kan vi då i Java sätta package-private visibility på konstruktorn i Foo. Eftersom vi har package-private visibility på konstruktorn har vi effektivt sett till att det inte går att skapa upp instanser av Foo från någon annanstans än inom dess paket. Vi kan sedan välja att publicera en metod ut publikt mot resten av systemet i FooFactory som konstruerar objekt av typen Foo efter konstens alla regler.

I PHP är det en annan historia. Eftersom det inte finns någon package-private visibility får vi snällt låta konstruktorn vara publik. Visst kan vi skapa upp en Factory – exempel på det finns här – men då får vi helt enkelt gilla läget och låta konstruktorn i Foo vara publik. Vi har då alltså exponerat två sätt att skapa upp instanser av Foo – dels genom Foos konstruktor och via FooFactory – men vi vill bara att den senare av dem ska användas. Hur ska man kunna försäkra sig om det? Tja, jag antar att man får ha disciplin och berätta för nytillkomna programmerare att de ska hålla sig borta från Foos konstruktor. Men modelleringsmässigt känns det riktigt trist. Om man nu har bemödat sig med att lägga till stöd för namespaces i PHP kunde de väl ändå peta in package-private visibility också.

Sådär, då var dagens I-landsproblem avhandlat. Tack för mig. 🙂

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *