Tein PHP-funktion, joka luo minulle sivun alun. Kun katselin tehtyä koodia, niin Firefox teki koodin yhdelle riville. Mitenkä saisin tehtyä koodin siten, että sitä olisi helppo lukea myöhemmin, eli olisi rivinvaihtoja ja sisennyksiä?
Nykyversio näyttää tältä:
<?php function site_start($name) { echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'; echo '<html xmlns="http://www.w3.org/1999/xhtml">'; echo '<head>'; echo ' <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>'; echo ' <title>'.$name.'</title>'; echo ' <link type="text/css" rel="stylesheet" href="styles.css" />'; echo '</head>'; echo '<body>'; }
Paras tapa on jättää HTML kokonaan tulostamatta PHP:llä. PHP:n voi katkaista HTML-osissa, yksi tapa on tämä:
<?php function foo($name) { ?> <ul> <li>HTML</li> <li>siististi</li> <li><?php echo $name; ?></li> </ul> <?php } // foo
Kaikista siistein (koodin ja tulostuksen kannalta) olisi suunnitella sivu siten, että HTML ja PHP ovat täysin erillään toisistaan. PHP:llä HTML:n tulostamista kannattaa kuitenkin välttää, sillä se on rumaa ja rikkoo syntaksivärityksen.
trilog kirjoitti:
sillä se on rumaa ja rikkoo syntaksivärityksen.
Minusta nuo eivät kyllä ole mitään painavia syitä jättää PHP:llä tulostamatta. Korkeintaan tyylikeinoja.
Jos PHP:llä silti haluaa tulostaa, niin vaihda heittomerkit lainausmerkkeihin (muista sitten escapettaa) ja lisää rivinvaihto \n (tai \r\n) tulostuksen loppuun.
Koodin muokkaaminen kuin myös lukeminen on vaikeampaa jos HTML:n sotkee PHP:n merkkijonojen sisään. Esimerkiksi juuri lainaus- ja heittomerkit ovat yksi hyvä esimerkki, miksi pitäisi alkaa erikseen escapettaa niitä? Siinähän on paljon turhaa työtä ja tulee yksi ylimääräinen bugin mahdollisuus.
trilogin ehdottama tyyli on ehdottomasti luettavampi ja myös suorituskyvyltään tehokkaampi (tulkin ei tarvitse etsiä esim. muuttujia normaalista tekstistä). Muotoilun ja rivinvaihdot saa säilymään ilman ylimääräistä vaivannäköä myös lopullisessa HTML:ssä. Se on kaikin puolin järkevämpi tapa.
<?php function site_start($name) { $name = htmlspecialchars($name); ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title><?php echo $name; ?></title> <link type="text/css" rel="stylesheet" href="styles.css" /> </head> <body><?php }
Tein tähän vielä pienen erityisen hienosäädön: htmlspecialchars $namelle. Korjasin myös ensimmäisessä metatagissa olleen pienen outouden.
Muoks!
Vaihdoin DOCTYPEn XHTML 1.0 Strictiksi, koska XHTML 1.1:stä ei saa mitään hyötyjä. Lisäksi sitä ei missään tapauksessa saisi tarjoilla text/html:nä (XHTML 1.0 saa, vaikkei sitä suositella, ja silti suurin osa tarjoilee sen text/html:nä).
Kannattaa panostaa enemmän itse kooditiedoston siisteyteen kuin selaimelle tulostettavan HTML-koodin siisteyteen: Isommassa sovelluksessa oikeaa sisennystä on usein mahdoton huomioida kattavasti, kun osia sivusta on eri tiedostoissa. HTML:ää ei ole tarkoitettukaan ihmisten luettavaksi, ja jos sitä haluaa jollain tutkia, järkevin vaihtoehto on käyttää jotain työkalua, joka osaa siistiä sen.
Yllä olevan kaltaisen funktion voisi siis kirjoittaa vielä selvemmin näin:
<?php function site_start($name) { ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title><?php echo htmlspecialchars($name); ?></title> <style type="text/css">@import "styles.css";</style> </head> <body> <?php }
Tuotetussa HTML-koodissa toki on hieman ylimääräistä sisennystä, mutta tämä ei haittaa. (Kyllä, IE tunnistaa DOCTYPEn, vaikka sitä edeltää whitespace.)
Minä muistelen käyttäneeni joskus yhdistelmää Output Control & Tidy. Eli kaikki tuloste otetaan talteen noilla PHP:n ob-alkuisilla funktioilla ja vedetään sitten Tidyn läpi. Monesti varsinkin astetta purkkamaisemmilla sivuilla ob on jo valmiiksi käytössä, joten tuollaisen debug-ominaisuuden lisääminen ei ole iso juttu. Tuonhan voi tehdä helposti niin, että käytössä on joku lippu, millä Tidy saadaan päälle, jolloin sitä ei ole pakko aina suorittaa vaan vain silloin kun on tarvetta lukea HTML:ä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.