RSS Facebook Pusha Bloggy TwitThis Google Digg

Nyheter i PHP 5.3 Del 2 – Namespaces

I en tidigare post skrev jag om Nyheter i PHP 5.3 och visade funktionaliteten med Lambda och Closures. Naturligtvis var inte detta de ända nyheterna. Jag tänkte därför i denna post gå igenom den kanske bästa nyheten, nämligen Namespaces.

Den främsta anledningen att använda Namespaces är för att komma ifrån problemet med namnkollisioner. Zend har tidigare löst det med en hierarki, till exempel Zend_Db_Table. Dessa kan dock bli väldigt långa som till exempel denna Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive()

Ett exempel med Namespace

Jag kommer gå igenom ett väldigt enkelt exempel med namespace.

namespace Blog;
class User
{
	public function Hello()
	{
		echo "Hello World! from " . __NAMESPACE__ . " - " . __CLASS__;
	}
}
 
namespace CMS;
class User
{
	public function Hello()
	{
		echo "Hello World! from " . __NAMESPACE__ . " - " . __CLASS__;
	}
}

I detta exemplet har vi skapat två stycken namespaces, Blog och CMS. Här ser man redan fördelar med att använda namespaces, vi kan i detta exemplet nämligen ha två klasser med samma namn, User.

För att avända våra namespaces, klasser och funktioner använder vi följande kod.

$object = new CMS\User();
$object2 = new Blog\User();
 
$object->Hello();
$object2->Hello();

Resultatet av följande kod kommer bli:
Bild 20
Ett annat tips när det gäller namespaces är att du kan skapa ett alias för en klass.

use CMS\User as cmsuser;
use Blog\User as bloguser;
$object = new cmsuser();
$object2 = new bloguser();

Här skapar vi två stycken alias, cmsuser och bloguser, dessa kan vi sedan använda för att skapa objektet.

Sub-namespaces

Namespaces fungerar i stort sätt som en katalogstruktur. Du kan alltså skapa sub-namespaces, till exempel.

namespace Baronen\Blog;
class User
{
	public function Hello()
	{
		echo "Hello World! from " . __NAMESPACE__ . " - " . __CLASS__;
	}
}

Notera här att jag har ändrat namnet till Baronen\Blog. Tillvägagångssättet för att använda klassen är detsamma.

$object = new Baronen\Blog\User();

Vill du läsa mer om namespaces rekommenderar jag som vanligt den officiella dokumentationen.

Vill du veta mer om nyheterna i PHP 5.3 hittar du det här.

Som jag nämnt tidigare hoppas jag webbhotellen tar till sig nya versionen av PHP så snart som möjligt.

RSS Facebook Pusha Bloggy TwitThis Google Digg

Handlat.nu lanserat under 24HBC

Jag har under de senaste dagarna varit iväg på 24 Hour Buisness Camp. Evenemanget hölls på det flotta Yasuragi på Hasseludden i Stockholm.

Om jag sammanfattar hela evenemanget så var det riktigt grym och atmosfären var helt fenomenal. Utveckling, bra mat, fin anläggning, bra planerat och trevliga människor med samma intresse, det kan inte bli fel!

Handlat.nu

Tillsammans med Nicklas, Joacim och Erik byggdes webbtjänsten handlat.nu. Vi kallar det en backchannel för shopping. Det fungerar så att när du handlar något så kan du enkelt dela med dig av produkten i form av information, bilder och pris med mera. Detta för att andra ska kunna ställa frågor, se bilder och betyg.

Vi hann faktiskt med att beta av hela funktionslistan vi hade satt upp innan och det känns riktigt kul. Även om vi alla fyra inte har jobbat tillsammans på detta sätt tycker jag det gick väldigt bra och inga större incidenter inträffade. Vi har redan börjat planera en fortsättning för tjänsten och vi kommer eventuellt ändra inriktning.

Handlat.nu ligger live och du kan testa tjänsten.

På den officiella bloggen, 24hbc.com pågår nu en omröstning där den bästa tjänsten ska koras. Så gillar du handlat.nu och tycker det är en bra idé tycker jag att du ska rösta på handlat.nu. (I skrivande stund ligger vi på 5:e plats vilket känns jättekul)

Tack

Detta är bland det roligaste jag varit med om och jag vill tack alla som gjorde det möjligt, SSES, Ted, Yasuragi, alla sponsorer och Joakim för bra insats som konferencier.

Bilder från Yasuragi

Svslut
Slutsignalen

DSC_0011
Joacim och Erik

DSC_0032
Nicklas och Jag själv

DSC_0063
Erik presenterar Handlat.nu

DSC_0081

Avslutning

Jag har lagt upp fler bilder från 24hbc på flickr.

RSS Facebook Pusha Bloggy TwitThis Google Digg

Nyheter i PHP 5.3

I somras lanserades PHP 5.3 och det innebar mycket nyheter och trevliga godsaker. Jag har idag tagit tag i saken och installerat PHP 5.3 på vår server på kontoret, det tog lite tid med till slut gick det. Jag är väldigt exalterad över den nya versionen och all ny funktionalitet, jag hoppas verkligen inte det tar alltför lång tid innan PHP 5.3 blir standard på webbhotellen.

Det är väldigt mycket gamla saker som är förbättrade i nya versionen till exempel är md5() snabbare och konstanter är flyttade till read-only minnet. Enligt uppgifter ska prestandan vara 5%-15% bättre.

Men det är inte bara förbättringar utan väldigt mycket nya funktioner också, Namespaces, Lambda, Closures, Late static binding och garbage collector är några av nyheterna. Jag tänkte gå igenom några av nyheterna och visa kodexempel. Jag kommer göra detta i två delar, i denna del kommer jag att titta på Lambda och Closures. Detta är nytt för mig så vi får se hur det går.

Lambda funktioner och Closures

Lambda eller anonyma funktioner är funktioner som kan skapas när som helst och är ofta knutna till en variabel. Har du programmerat javascript kommer du känna igen det.

Jag tänkte visa ett exempel där vi använder lambda ihop med funktionen array_filter.

$input = array('andreas', 'tord', 'bo', 'kim', 'johannes');
$output = array_filter($input, function ($v) { return strlen($v) > 3; });
print_r($output);

Vi börjar med att skapa arrayen input som innehåller ett antal namn. Vi använder sedan funktionen array_filter som tar $input och andra parametern är det som kallas Lambda eller anonyma funktioner.
Vi skapar alltså en anonym funktion, i denna funktionen kontrollerar vi vilka namn som är längre än tre tecken och returnerar dom.
Kollar vi på resultatet ser det ut som följande.

Bild 13

Som vi ser nu är bara tre namn kvar, de som är längre än tre bokstäver.

Closures

Att skapa anonyma funktioner har man kunnat göra tidigare med funktionen create_function(). Nu ska vi titta vidare på det som kallas Closures. Closures är nästan som anonyma funktioner med skillnaden att de känner till variabler som inte är skapade i sig själva.

Om vi tittar på exemplet nedan så har vi $globalVar som ligger utanför funktionen, denna kan vi sedan använda i funktionen genom att använda ordet use. Vi skickar den som referens genom att använda &.

$globalVar = 1;
$closure = function($arg) use (&$globalVar) {
	echo "Medskickad parameter: " . $arg . " - " . ++$globalVar;
};
$closure('Parameter 1') . "<br />";
$closure('Parameter 2') . "<br />";

Det här var två exempel på Lambda och Closures i nya PHP 5.3

Ny Magisk metod __invoke

Slutligen tänkte jag visa den nya magiska funktionen __invoke. Detta är en funktion som körs när man försöker köra ett objekt som en funktion, $object('hej').

class Demo{
	public function __invoke($args){
		echo $args;
	}
}
$object = new Demo();
$object('hej');

Anropar man nu objektet som som en funktion så kommer __invoke rycka och och i detta exemplet skriva ut ‘hej’.

Som jag nämnde tidigare såg är jag väldigt uppjagad över nya PHP och jag hoppas verkligen att flertalet webbhotell kommer uppgradera sina versioner inom kort.

RSS Facebook Pusha Bloggy TwitThis Google Digg

Förenkla PHP med autoload

När man bygger webbplatser i PHP är det ganska lätt att antalet klasser springer iväg. Använder du dig av “require” eller “include” för att inkludera dessa klasser kan det bli väldigt omständligt och rörigt.

Jag tänkte därför tips om en funktion som heter spl_autoload_register som gör att PHP kan själv ladda in de klasser som behövs. Det är väldigt enkelt och det behövs inte mycket kod för att åstadkomma detta.

Börja koda

Vi kommer i första delen av exemplet använda en index-fil, en mapp som innehåller en klass.

Bild 27

//Set the includepath
set_include_path(get_include_path().PATH_SEPARATOR."lib");
function autoload($class) {
	include $class.".php";
}
spl_autoload_register('autoload');

Här börjar vi alltså med att ställa sökvägen till inkluderingsmappen, i detta fall mappen “lib”. Vi skapar sedan en vanlig funktion vi kallar autoload som helt enkelt inkluderar den klass vi skapar. Slutligen använder vi funktionen spl_autoload_register och skickar med namnet på vår autoload-funktion.

Notera, för att detta ska fungera ska klassnamnet och filnamnet vara likadant, vilket ändå är en bra regel att använda sig efter.

I mappen “lib” skapar vi en testklass där filnamnet blir “Test.php” och klassnamnet blir alltså “Test”. Nu kan vi alltså skapa nya objekt/klasser och PHP kommer automatiskt att inkludera dessa när det behövs.

$test = new Test();

Använda undermappar och autoload

Som jag nämnde inledningsvis är autoload kanon när man har många klasser i sin applikation. Men att lägga alla klasser i mappen “lib” kan bli väldigt rörigt. Därför tänkte jag även visa ett exempel på hur man kan ha undermappar och ändå ladda in klasser automatiskt.

Vi börjar med att skapa undermappar i mappen “lib” och skapar sedan två nya klasser.

Bild 28

För att kunna ladda in klasser som ligger i undermappar måste vi förändra vår autoload-funktion en aning.

set_include_path(get_include_path().PATH_SEPARATOR."lib");
function autoload($class) {
	$class = str_replace('_', '/', $class);
	include $class.".php";
}
spl_autoload_register('autoload');

Det vi har lagt till nu är att vi använder str_replace för att byta ut “_” till “/”.

I och med denna metod måste vi döpa våra klasser på följande sätt “Mapp_Klassnamn”. Vill du läsa mer om standard för namngivning rekommenderar jag Zend’s standard.

Klassen Mailer kommer alltså sen ut enligt följande:

class Mail_Mailer
{
	public function __construct()
	{
		echo "Created a mailer object <br />";
	}
}

För att skapa ett nytt Mailer-objekt gör vi enligt följande.

$mailer = new Mail_Mailer();

Den här metoden med “Mapp_Namn” lämpar sig bra för PHP-versioner under 5.3 då stöd för Namespaces finns i 5.3.

Demo och källkod

Se demo eller ladda ner källkoden här.

Föregående Nästa