Dynamiska argument till PHP funktioner
2005-04-05 -
747
Ett till PHP-tips från sandman.net. Säg till om jag tråkar ut er. Tina behöver inte svara :)
49739
För en bra stund sen nu så blev jag frustrerad av hur statiskt argumenten till en php-funktion är, det vill säga hur jobbigt det är att skicka med bara de argument man vill skicka med. Säg att man har en funktion som sätter en ram runt texten man skickar in, och man kan välja färg och bredd på ramen. Det skulle kunna se ut så här:
function frame($string, $width, $color){     return "       <div style='border: {$width}px solid $color'>         $string       </div>     ";   }   print frame("Hejsan", 1, "black");
Resultatet är "<div style='border: 1px solid black'>Hejsan</div> " Det jobbiga med ovanstående exempel är att man alltid måste skicka med bredd och färg till funktionen för att den inte ska returnera ett felmeddelande. Så PHP har möjligheten att ange standardvärdena på argumenten:
function frame($string, $width=2, $color="#666"){     return "       <div style='border: {$width}px solid $color'>         $string       </div>     ";   }   print frame("Hejsan");
Och resultatet blir "<div style='border: 2px solid #666'>Hejsan</div> ".
Men detta är inte nog - för om du någon gång vill använda funktionen frame() och behålla standardvärdet för bredd men ange en annan färg till exempel så måste du först kolla upp vad standardvärdet för färg är och även skicka med det. Det går inte att "hoppa över" ett värde. Detta är ett stort problem om du har funktioner med kanske tio argument eller mer. Att behöva skicka med standardvärdena då är ju inte användbart. Lösningen på problemet ligger i PHP-funktionerna func_num_args() och func_get_arg() som kan användas inne i funktionen för att gå igenom alla argument till funktionen och sen använda sig av dem. Vi måste dock använda oss av ett nyckel=värde par för att det ska fungera:
function frame(){     # Standardvärdena     $a = array(       "color" => "#666",       "width" => 2     );     # Gå igenom alla argument     for ($i=0; $i<func_num_args(); $i++) {       # Hämta argumentet       $arg = func_get_arg($i);       # Splitta på "="       list ($tag,$val) = split('=', $arg, -1);       # Ersätt standardvärdet       $a[$tag] = $val;     }     return "       <div style='border: {$a[width]}px solid $a[color]'>         $a       </div>     ";   }   print frame("text=Hejsan");   print frame("text=Hejsan", "color=red", "width=3");
Så, som ni ser så har funktionen inget argument alls i definitionen ("function frame(){ ... }") utan det får vi räkna ut själva. Det betyder att vi måste börja med att sätta standardvärdena i en array, här $a. Sen går vi igenom alla argument till funktionen och byter ut värdena i $a mot de som skickades med, om något skickades med. Resultatet av ovanstående kod är:
<div style='border: 2px solid #666'>Hejsan</div> <div style='border: 3px solid red'>Hejsan</div>
Lite imponerad hur mycket Apple Watch kan hålla reda på bär man simmar faktiskt
Får lite välbehövlig hjälp att fixa med elen i verkstaden
Improvisationsteater på Västmanlandsteatern. Lika delar pinsamt och skoj :)
Har ryggskott som börjar bli bättre. Nyser nu på morgonen och det hugger till i ryggen och gör ont som fan. Kollapsar på golvet, och när jag reser mig upp så har jag råkat få igång Siri som tror sig ha hört detta. Ok, det gör ont som fan, men jag är ok, Siri :)
Har en trappa hemma som måste renoveras, menrenoveringskit är dyra som tusan, tanken är att jag ska bygga eget renoveringskit, får se hur det går…
Bakbunden
Även en ordentlig geringsfräs för att kunna bygga hållbara trappnosar
Har införskaffat mig en planopress inför kommande bordsprojekt samt ett test för en trapprenovering.
Byggde en pokalhylla till dotterns alla danspokaler
Pricken över i:et :)
Bakbord
Nytt projekt på gång, bakbord till svärfar :)
“Gå och lägg dig” - ”Nej jag kollar på TV med Leia” :)
Extrabord till jul
Extrabord till julafton klart! Byggvideo kommer inom kort på min youtube :)
Weehoo, jag har en egen stämpel nu. Det ni!
Bordskiva oljad och vaxad, ben borstade och betsade. Kanske blir ett bord till slut?
Bordsskiva betsad. Ska slipas/borstas och sen oljas.
Renoverat vardagsrumsbord
Favoritbild från dansuppvisningen igår
Nattduksbord
PanPastel-porträtt
Crock Pot
PanPastel
Tron för Sigge
Road Trip Italien!
Verkstad Remake
Jonas och Jenna
Brud som chillar
Showing off
Undressing
Touch thyself
Hot Love
Profilporträtt
Resa utan kamera?
Paus
Supernöjd med folieringen!
Bilen ska folieras!
Ny såg
PHP och BankID
Jack Skellington
Verkstadsplaner
Magnettavla
Verandatak och grillhörna!
Vardagsrumsbord
Knivblock
Kökshylla
Ny ikon för karta
PC-bygge
Kerlee 35mm f/1.2
Objektivhylla
Natalie Dormer
Hållare till kattmatsskålar
Hälsningar från Norge
With a little help from my friends...
The Most Incredible Fantasy Maps You've Ever Seen
Cityfestivalen
Mitakon Speedmaster 50mm/f0,95
10 minuter vatten
Sony A7R II
Petzval 58 Bokeh Control Art Lens
Scrawlrbox
Nya skärmar till jobbet
Nikon Df - ny leksak
Boba Fett
First Order Storm Trooper
Mikisen
#inlineditbutton