De sju vanligaste PHP misstagen

06 november 2010 kl. 11:10 f m | Publicerat i PHP | Lämna en kommentar
Etiketter:

I det här inlägget ska vi lista de sju vanligaste PHP misstagen, baserat på rapporter från nätet och egen erfarenhet.

Vi ska här alltså inte lista de sju vanligaste nybörjarmisstagen i PHP, utan de vanligaste misstagen och felen som den daglige PHP-programmeraren begår. Vi kommer även tipsa om hur man enklast undviker att göra dessa misstag.

1. Det förlorade dollartecknet

Det första felet är kanske vanligast för programmerare som har programmerat i andra språk där variabelnamn kan refereras via dess alfabetiska tecken. PHP använder dollartecken, $, för att indikera att det rör sig om en variabel.

<?php
	$hello = "hello";
	world = "world";
	echo $hello . " " . $world;
?>

Här försöker vi skriva ut ”hello world” genom att konkatenera $hello och $world. Problemet är dock att vi aldrig sätter $world, utan vi försöker sätta world. När vi gör detta får vi felutskriften:

Parse error: syntax error, unexpected ‘=’ in C:\xampp\htdocs\test\www\test.php on line 3

För att undvika detta måste vi lägga till $ till variabelnamnet.

Notera dock att detta endast gäller för variabler. Konstanter kan refereras utan $, som i följande kod:

<?php
	define("CONSTANT", 3.1415);

	echo CONSTANT;
?>

2. Jämförelse vs. Tilldelning

Ett klassiskt problem är när programmeraren avser att jämföra två värden, men istället gör en tilldelning. Detta sker när programmeraren skriver ut ett likhetstecken istället för två:

<?php
	$hello = "hello";
	$world = "world";
	if ($hello = $world) {
		echo $hello . $world;
	} else {
		echo "hello is not world";
	}
?>

Vi förväntar oss antagligen att den ska skriva ut ”hello is not world” då $hello och $world inte är ekvivalenta. Istället skriver den ut:

worldworld

Detta för att vi använder tilldelning istället för jämförelse i if-satsen. Detta gör att $hello får värdet som finns i $world, vilket är ”world”. Därefter evalueras $hello som ett sanningsvärde – i detta fall blir det sant. Detta gör att $hello . $world skrivs ut. Eftersom $hello tilldelades värdet av $world så har båda variablerna strängvärdet ”world”, varför utskriften blir ”worldworld”.

För att undvika detta lägger vi till ett extra likhetstecken:

// ... former code not shown here
if ($hello == $world) {
// ... do stuff
}
// ... rest of code not shown here

Nu skriver den som förväntat ut ”hello is not world”.

Det finns egentligen ingen anledning att tilldela variabler i en if-sats. Därför bör en programmeringsredigerare ha stöd för att markera detta som ett potentiellt problem, så att programmeraen lätt kan upptäcka detta fel.

3. Ett semikolon för kort

Semikolon används för att skilja satser från varandra. Om ett sådant semikolon fattas kommer koden inte kunna parsas, vilket ger upphov till ett rätt så obskyrt felmeddelande i stil med:

Parse error: syntax error, unexpected T_ECHO in C:\xampp\htdocs\test\www\test.php on line 4

Felet resulterar från följande kod:

<?php
	$hello = "hello";
	$world = "world"
	echo $world;
?>

Felet finns egentligen på rad tre, men upptäcks inte förrän rad 4. Felet är givetvis att raden $world = ”world” inte avslutas med semikolon.

Däremot är fullt möjligt att skriva:

<?php
	$hello = "hello";
	echo $hello
?>

Här utelämnar vi semikolon när vi skriver ut $hello med echo. Trots att denna rad saknar semikolon så kommer texten ”hello” att skrivas ut. Det går att skriva på detta sättet för att parsern upptäcker felet på raden efter satsen som saknar semikolon. Eftersom ingen kod förekommer efter denna rad upptäcks aldrig felet.

Det rekommenderas att man använder semikolon överallt där det behövs för att undvika framtida problem.

4. Matchande par

Detta misstag är inte specifikt för PHP, utan förekommer i (nästan) alla språk i någon form. Jag pratar förstås om matchande måsvingar och parenteser.

Det är lätt att glömma bort att stänga en måsvinge eller att inte matcha måsvingar och parenteser om man har väldigt många av dem på samma ställe i koden. Se koden nedanför:

<?php
	class Pseudo {
		function do_something() {
		}

		function do_anything() {
		}
?>

I koden ovanför glömmer vi skriva ut en avslutande måsvinge och får därmed felmeddelandet:

Parse error: syntax error, unexpected ‘;’, expecting T_FUNCTION in C:\xampp\htdocs\test\www\test.php on line 8

Detta obskyra felmeddelande hjälper inte så mycket. Däremot vet vi att felet upptäcktes på sista raden, vilket nästan alltid indikerar att vi inte har balanserat parenteser och måsvingar korrekt. För att programmet ska fungera behöver vi förstås lägga till en stängande måsvinge, }, före ?>.

För att undvika detta hjälper det om vi använder en textredigerare som highlightar (dvs markerar) matchande parenteser och måsvingar. Att indentera och använda rikligt med whitespaces (mellanslag, indrag, osv) brukar också hjälpa.

5. Hela vägen ut med header location

header() är  en funktion för att sända HTTP headers. Detta är väldigt bra om man t.ex. vill skicka en användare till en annan sida. Det är även en av de vanligaste orsakerna till felmeddelanden och programmerare som bankar på sina tangentbord.

Problemet är att headers måste sändas innan någon utdata (i form av t.ex. HTML) får skickas till webbläsaren. Följande kod är ogiltig:

<html>
<?php
	header("Location: http://example.org");
?>
</html>

Vi får då följande felmeddelande:

Warning: Cannot modify header information – headers already sent by (output started at C:\xampp\htdocs\test\www\test.php:2) in C:\xampp\htdocs\test\www\test.php on line 3

På rad tre anropar vi funktionen header(). Användaren kan inte skickas vidare till example.org för att vi redan skickat utdata till webbläsaren i form av <HTML>. Även nyrader, blanksteg, och liknande skickas som utdata till webbläsaren och hindrar header() från att skicka headers. Var därför noga med att inga whitespaces eller övrig utdata förekommer innan vi sänder headers.

För att fixa problemet med headers flyttar vi helt enkelt html till efter anropet av headers:

<?php
	header("Location: http://example.org");
?>
<html>
</html>

Du kan läsa mer om headers här.

6. Citationstecken vs. apostrofer vs. HEREDOC

Att blanda citationstecken och apostrofer i en sträng kan ge upphov till invecklad kod som är svår att förstå. Detta gör att det blir både svårt att skriva och läsa kod, vilket resulterar i fel.

Undersök koden nedanför och se hur lång tid det tar att hitta felet:

<?php
	echo "<form><input type=\"text\" name=\"enter_text"" .
		"value=\"'Enter some text here'\"</input></form>";
?>

Detta ger upphov till ett felmeddelande i stil med:

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ‘,’ or ‘;’ in C:\xampp\htdocs\test\www\test.php on line 3

Felmeddelandet här är inte till så mycket hjälp, annat än att den hittade felet på rad tre. Som det ofta är så finns det riktiga felet på föregående rad. Vi har glömt att escapa ett citationstecken här: nämligen name=\”enter_text”” bör vara name=\”enter_text\””.

För att undvika detta hjälper det att använda en klarare syntax utan att behöva escapa tecken. Detta görs bäst med HEREDOC. En alternativ lösning som använder HEREDOC ser ut så här:

<?php
	echo <<< STRING
	<form>
		<input type="text" name="enter_text"
		value="'Enter some text here'">
		</input>
	</form>
STRING;
?>

Koden blir betydligt mer läsbar och enklare att skriva. Exemplet ovanför är till för att poängtera varför HEREDOC är att föredras – detta skulle lika gärna kunna göras som HTML, utan att blanda in PHP.

7. Felstavade variabler är nya variabler

Till sist ett annat problem som är vanligt förekommande och kan vara väldigt irriterande. Om du felstavar en variabel så skulle man kunna tänka sig att man får ett felmeddelande. Detta är inte sant för PHP. Istället för att skriva ut ett fel så skapas en variabel som inte är satt:

<?php
	$hello = "hello";
	$world = "world";
	echo $wordl;
?>

Här avser vi skriva ut variabeln $world – fast råkar istället skriva ut variabeln $wordl.

För att undvika detta hjälper det om vi ger variabler namn som är enkla att läsa och skriva. Invecklade förkortningar bör undvikas. Om programmeringsredigeraren har någon slags highlighting av variabler eller lista över variabler i programmet är det ett plus i kanten.

Till sist…

Detta var alltså vår lista över vanligt förekommande misstag som görs i PHP. Här har vi koncentrerat oss på att beskriva de fel som uppstår med avseende på språkets syntax.

Utöver detta finns det vanliga fel som har mindre att göra med hur språket är uppbyggt och mer med att använda programmeringskonstruktioner på ett bra sätt. Detta kan t.ex. vara att ”escapa” query förfrågningar, cacha databasdata, eller använda E_ALL för felrapportering. Om du vill läsa mer om det rekommenderas den här sidan.

Vilka är dina vanligaste misstag när du programmerar i PHP? Skriv gärna en kommentar nedanför i kommentarsfältet eller skicka iväg ett mejl till ToggleOnBlog@gmail.com.

Liknande inlägg:
De sju vanligaste misstagen en nybörjare i Java kan göra

About these ads

Lämna en kommentar »

RSS-flöde för kommentarer till det här inlägget. TrackBack URI

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s

Create a free website or blog at WordPress.com. | Pool-temat.
Inlägg och kommentarer feeds.

Följ

Få meddelanden om nya inlägg via e-post.

%d bloggers like this: