PHP växer upp.
Mycket har hänt med PHP sen jag tog mina första staplande steg för många, många årsen.
Då var PHP 3 som var det nya svarta och jag hade mest jobbat i Microsofts ASP innan. Jag minns vilken frihetkännsla jag fick med en gång, ex att en sån simpel sak som HTTP-uppladning redan var inbyggd och inte krävde strulande 3dje-parts komponenter gjorde att jag snabbt blev kär. Jag förundrades över hur mycket man kunde göra direkt i språket utan att ta till utomstående medel.
Då var det procedural kod för hela slanten, visst fanns det stöd för simplare klasser och objekt men var i det stora hela satt på undantag.
Med tiden jag blev duktigare insåg jag PHPs stora akilleshäl;
PHP är ett väldigt snabbt språk att prototypa med; vilket innebär att man snabbt har en fungerade lösning. Problemet är att just för att du har en fungerande lösning snabbt, går du vidare på nästa, men senare visar det sig att den fungerande lösningen biter dig i foten när det är dags att skala upp till större system. Är man inte supernoga med att strukturera upp det innan man sätter igång blir det snart en stor röra av det hela vilket motsäger det första jag sa, paradoxen är total. Många har gått på den niten, även jag, och det är därför PHP imånt och mycket har dåligt rykte.
Men sen kom PHP 5.0 och den “riktiga” objektorienteringen. Nu kom Interfaces, Abstracts och lite annat godis man kan behöva för att bygga en fungerande objektmodell. Problemet var (och är) att få personer faktiskt tog till sig det, inkluderat mig själv utan koden hamnade nånstans emellan objektorienterad och procedural. Många var (är) låsta vid tanken av “en sida-en funktion”. Man forsatte med saveform.php och uploaditem.php osv. Det tog mig själv ett bra tag innan jag släppte den tanken och började strukturer mina siter och projekt efter objekt och klasser, inte sidor.
PHP 5.3.3 släpptes nyligen och den största nyheten är namespaces. Fenomenet namespaces i sig är absolut ingen nyhet, alla morderna språk har stöd för det eller tom kräver det; som Java exempelvis.
Ett tidigare problem med PHP 5 är att hålla koll på alla inkluderade klasser,
I det stora hela har 2 varianter har funnits.
- Lägga till dom manuellt med include()/require() och få en gigantiskt lista som är svår att hålla reda på och ibland vill man inte ladda alla klasser för vissa saker, men oftas slutar det med att man ladda in alla ändå för att det blir för krångligt.
- En annan variant har varit att använda __autoload() funktionen. Problemet med den är alla klassfiler måste ligga i samma katalog och ett stort projekt kan innehålla ofantligt många. Vissa försök till strukturingen eller namespacing har försökts med att döpa klasserna smart som tex att döpa klassen till System_Server och sen låta __autoloadern leta i System/Server.php efter klassen. Som ni nog förstår slutar det oftast med att man har klassnamn om påminer om Objective-C:s funktionsnamn (ex att slå av/på autorotate på en iphone: (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation) mao dom är gigantiska och man blir snabbt knäpp på att använa $rq = new Core_System_Client_Requests() eller $db = Core_System_Database::getInstance() om och igen.
Här kommer namspaces in och sköter den magin. Autoloadern kan lätt sättas att leta efter klassfilen i samma foldern som klassens namespace och man får en snabbt överskådlig blick över sin objekt model i samma stil med Java eller Python.
En typisk klassdeklaration i 5.3.3 kan se ut så här
<?php
namespace Core\System;
class Database extends PDO
{
private static $_instance = 0;
public static function getInstance()
{
if(!self::$_instance)
{
$c = get_called_class();
self::$_instance = new $c();
}
return self::$_instance;
}
}
Sen när man är i den filen man ska använda klassen behöver man bara använda Use.
use Core\System\Database; $db= Database::getInstance(); osv..
I småprojekt kanske det hela verkar onödigt men i större produktioner underlättar det hela verkligen. Du slipper strula med konstiga klassnamn och akta dig för namnkrockar etc (PHP 5.3.3 har även stöd för alias men det går jag in på nu). Men ser du till att det blir en vana kommer era projekt bli väldigt lätta att skala upp och modifiera.
Så till kontentan med hela det här inlägget:
PHP har vuxit från att vara ett snabbt lite “fulhacks” skriptspråk till ett fullfjädrat objektorienterat språk. Visst kan du fortfarande fulhacka men då går du misste av mycket av det om är bra med PHP >5.3. PHP inbjuder numera till att du vill strukturera upp din kod och sköta din kodhygien.
Man kan säga att PHP har vuxit upp.