Dec 15, 2008Smart funktion
Tänkte dela av mig utav en smart funktion:
Tänkte dela av mig utav en smart funktion:
Den största och enligt mig bästa uppdateringen till PHP5 som släpptes för mer än fyra år sedan är den utökade objektmodellen. Tyvärr är det dock väldigt sällan man ser objektorientering utnyttjas i PHP, vilket är synd, då det ofta bidrar till bättre organiserad kod och separation av olika delar av en applikation.
I en liten miniserie om objektorientering i PHP kommer jag ta upp det mest grundläggande delarna inom objektorientering med PHP.
Vad är då objektorientering egentligen?
Objektorientering är ett sätta att programmera, där man separerar olika delar för sig. När man talar om OOP är ofta det första man hör ”Klasser” och ”Objekt”. Vad är då detta, vad är skillnaden?
En klass är en definition, en beskrivning för hur ett objekt skall se ut, samtidigt som objektet är den ”fysiska” produkten utav en klass. Detta kan enkelt relateras till bilar, där ritningen (klassen) som säger hur bilen ska se ut, vilka funktioner den skall ha (gasa, bromsa, svänga), och objektet den fysiska, tillverkade bilen.
Klasser består utav attribut (egenskaper) och metoder (funktioner). Ett attribut är en egenskap för ett objekt, där det till vår bil skulle kunna vara en färg eller ett registreringsnummer. Metoder är funktioner, som säger åt ett objekt hur det skall bete sig. Vår bil skulle till exempelvis kunna ha en metod som säger åt bilen hur den skall gasa eller svänga.
Nåja, mycket text är tråkigt att läsa, så vi drar igång med ett simpelt kodexempel:
Här deklarerar vi en ny klass, Bil. Vi specifierar även två stycken attritbut, färg och fardriktning. Till detta skapar vi även två metoder, en för att svänga, och en för att byta färg på bilen. För att skapa en bil gör vi enligt följande:
Här skapar vi alltså ett ny variabel, $bil, som vi sedan sätter till ett nytt Bil-objekt. Vi byter sedan färg på bilen till blå, och svänger vänster.
Här är antagligen något nytt för PHP-programmerare som inte använt objektorientering innan, nämligen ”->”. Dessa pilar används för att anropa en metod som tillhör en klass.
Någonting annat som antagligen är okänt för en oerfaren objektorienterare är nyckelorden ”private” och ”public” i vår klassdefinition. Dessa nyckelord specifierar att en metod är privat eller publik, i praktiken innebär detta att privata metoder och attribut endast är åtkomliga från inifrån klassen, medan publika metoder och attribut är åtkomstbara överallt.
Jag använder även nyckelordet $this en hel del. Varför? Jo därför att $this refererar till det egna objektet. Som vi vet lever en variabel endast inuti en metod eller funktion, vilket innebär att vi måste referera till objektet med $this om vi vill komma åt klassens egna attribut.
MEN, måste inte en bil alltid ha en färg? Naturligtvis måste den det. Detta löser vi med någonting som kallas för konstruktor, vilket är en helt vanlig metod. En konstruktor är en metod som ALLTID körs när ett objekt skapas. Ett exempel på en lämplig konstruktor är följande:
Det vi gör här är alltså att definiera en konstruktor, notera att metodnamnet alltid måste deklareras enligt __construct. Vi ser även att konstruktorn tar en inparameter, $farg. Detta innebär att vi måste skicka med en färg när vi skapar vårt objekt, enligt följande:
Detta var allt för idag, återkommer med nästa del vid ett senare tillfälle. Så länge håller jag tilgodo med ett simpelt program:
$person = new Person(‘Alexander’, 19);
echo $person->getName() . ‘ är ‘ . $person->getAge() . ‘ gammal.’;
$person->haveBirthday();
echo $person->getName() . ‘ är nu ‘ . $person->getAge() . ‘ gammal.’;
Studera och förstå!
PHP har stöd variabla variabler, vilket fungerar på detta sätt:
Vilket kommer att skriva ut foobar.
Upplys mig gärna om något praktiskt användningsområde för detta.
Jag satt för en tid sedan och började bygga på ett eget ORM-framework, och funderade på olika lösningar för att bygga upp sql-satserna. Det jag kom fram till blev slutligen:
$q = new Query;
$q->select(‘this’)->from(‘that’)->group(‘this’)->limit(0, 10);
echo $q;
?>
vilket kommer att skriva ut
SELECT this FROM that GROUP BY this LIMIT 0,10
Hemligheten bakom detta är att man returnerar $this i varje metod, vilket gör att man kan kedja kommandon, mycket smidigt!
Finns intresse kommer jag antagligen släppa hela versionen av mitt ORM här på Iocore om ett tag..
Någonting som jag ofta använder mig av i både PHP och C# är metoder för att formatera strängar. I PHP är det främst sprintf som används, och String.Format i C#.
Sprintf fungerar på följande vis:
Första argumentet till sprintf är strängen man vill formatera, och de efterföljande argumenten värdena som nycklarna i strängen skall ersättas med.
*printf-funktionerna stöder ett antal olika nycklar, varav de vanligaste är %s och %d. %s använder du när du vill skriva ut en strän, och %d när du vill skriva ut en integer.
Situationer där det är smidigt att kunna formatera strängar är vid till exempel skapandet av sql-satser, exempelvis:
En annan användbar funktion i samma familj är vsprintf, som tar två argument, där första är strängen man vill formatera, och andra en array med värdena. Till exempel:
*printf-funktionerna är även användbara för att formatera och bestämma precisionen för hel och flyttal. Skriver vi till exempel:
Kommer det skrivas ut Jag är 10011 år gammal, där alltså %b är den binära representationen av 19.
Man kan som sagt även bestämma precisionen av hel och flyttal, till exempel.
där vi alltså skickar in ett flyttal och får ut ett avrundat heltal, jag vet, heltal kan inte vara flyttal.
PHP5 kommer som standard färdigkompilerat med biblioteket SimpleXML, vilket är fruktansvärt användbart om när man snabbt vill läsa ut data från en XML-fil.
En simpel kodsnutt för att läsa ut de senaste inläggen från min favoritblogg Gratis tårta skulle kunna se ut enligt följande:
<h1><?php echo $xml->channel->title; ?></h1>
<em>Senaste inlägg</em>
<ul>
<?php foreach($xml->channel->item as $item): ?>
<li>
<a href="<?php echo $item->link; ?>"><?php echo $item->title; ?></a>
</li>
<?php endforeach; ?>
</ul>
Hoppas ni förstår melodin!
Ja, varför ligger dessa (bland flera) i AJAX control toolkitet när de inte har någonting som helst med AJAX att göra? Jag trodde glatt att jag kunde dra in en accordion och flera accordion panels, och sedan få dessa att hämta datan dynamiskt när man expanderade den, men icke, all text bara döljs och visas sedan med JavaScript. Usch. 2008? Nej.
Det blir antagligen att bygga något liknande med JQuery istället, dock går man ju miste om alla events m.m man kan använda sig av om man bygger det i enbart .net.
Visst, det är ett par dagar gammalt, men wordpress har nu släppt en screenshot samt information om den kommande versionen. Sidan[1] för att lägga till en ny post känns väldigt fräsch, och alla relevanta funktioner och kontroller finns inom räckhåll, vilket underlättar mycket.
Information[2] är även släppt om den nya dashboarden, där de talar om bland annat utseende och nya funktioner. Bland annat kommer en ny funktion kallad QuickPress finnas, vilket innebär att man enkelt skall kunna skapa nya inlägg direkt från dashboarden. Mycket fint.
[1] http://wordpress.org/development/2008/10/the-visual-design-of-27/
[2] http://wordpress.org/development/2008/10/the-new-27-dashboard/
Tänkte bara dela med mig utav ett skript jag knåpade ihop på ett par minuter, för att generera e-postadresser i bilder dynamiskt.
header (‘Content-type: image/png’);
/* Cache settings */
$cachedir = ‘cache/’;
$cachetime = 60 * 60 * 24 * 5; // 5 days
$filename = $cachedir . md5($email) . ‘.png’;
if(file_exists($filename) && filemtime($filename) > $cachetime)
{
require_once $filename;
}
else
{
$handle = imagecreate (200, 20);
$trans = imagecolorallocate ($handle, 255, 0, 255);
$text = imagecolorallocate ($handle, 51, 51, 51);
$font = ‘arial.ttf’;
$fontsize = 9;
imagecolortransparent ($handle, $transparent);
imagettftext($handle, $fontsize, 0, 0, ($fontsize+2), $text, $font, $email);
imagepng ($handle, $cachedir . md5($email) . ‘.png’);
require_once $filename;
}
?>
Skriptet förklarar nästan sig själv, om inte annat, fråga om du undrar någonting.