[Alku]
Testaa CSS-oppaan navigoinnin toimivuutta!
   
 
Hae sivuiltani:
[Apua]

Muuttujien tehokäyttö

Aiheet

Muuttujien käytön perusidea ja nimeämiskäytännöt

Muuttujien käytön perusidea on siinä, että muuttujat voidaan määritellä muualla kuin käyttökohteessaan. Tässä mielessä PHP-muuttujien käyttö muistuttaa class attribuutin käyttöä. Edellisessä jaksossa olevassa esimerkissä määrittelin niitä samalla sivulla, mikä muistuttaa STYLE elementin käyttöä.

Jos muuttujat määritellään johtajasivujen ulkopuolella, käyttö muistuttaa CSS:n @import at-säännön käyttöä, jossa tuontitiedosto on ikään kuin kirjoitettu kyseessä olevalle sivulle.

Koska tarvitaan sekä tavanomaisia muuttujia että taulukkomuuttujia eräs s-postiystäväni ehdotti, että taulukkomuuttujat ja muut muuttujatyypit kannattaisi nimetä seuraavaa käytäntöä noudattaen, jotta jatkossa heti näkisi minkä tyyppisestä muuttujasta on kyse:

Koska merkkijonomuuttuja on useimmin käytetty muuttujatyyppi, en laita sille mitään etuliitettä. Sekakirjasinten (engl. mixed case, leikillisesti camel case) eli "kamelikirjainten" käyttö puolestaan lisää nimien luettavuutta (suosittelen sekakirjasinten käyttöä alaviivan sijasta, esim. $aMinunTaulukkomuuttuja pikemmin kuin $a_minun_taulukkomuuttuja).

[Alku]

Toistuvat merkkijonot

Kaikki tiedostokatkelmat voidaan kirjoittaa erillistiedostoihin, mutta pienet useaan kertaan käytettävät seikat kannattaa laittaa muuttujiksi. Jos sivut listaa aakkosilla, mutta ei ole varma, että sivujen keskinäinen järjestys tai sivumäärä säilyy samana, kannattaa luoda sivun järjestyskirjaimille merkkijonomuuttujat. Järjestyksen muuttuessa täytyy korjata paljon vähemmän sivuja. Muuttujaa voidaan käyttää samalla sivulla useaan otteeseen. Esim. dynaamisia valikoita käsittävän sivun aloitussivulla on samaa muuttujaa käytetty neljä kertaa:

[Alku]

Linkkilistat

Aiemmassa esimerkissä mainitsin sivukohtaisista muuttujista. Myös linkkilistat kannattaa luoda muuttujiksi. Linkit voi lajitella valmiiksi. Funktioilla sort() (ensimmäisestä viimeiseen) ja asort() (viimeisestä ensimmäiseen) aakkosten mukaan tapahtuva lajittelu tapahtuu muuttujan sisältämän merkkijonon eikä muuttujan nimen mukaan.

Jotta lajittelu menisi oikein olen laittanut linkeille class-attribuutti. Esim.

<?php
$CodeStyle ="<a class=\"CodeStyle\" href=\"http://www.codestyle.org/\" target=\"new\">CodeStyle</a>";
...
$aLinks = array($..., $..., $CodeStyle, $...);
sort($aLinks); /* Linkki http://www.codestyle.org tulee nyt ensimmäiseksi. */
?>
voidaan kutsua valmiiksi lajiteltuna toisessa yhteydessä, jossa PHP:llä luodaan lopullinen linkkilista, esim.:
<ul>
<?php
include('tutorials.inc');

for ($i = 0; $i < count($aLinks); $i++) /* Silmukan laskeminen aloitetaan nollasta, ja joka kierroksella lukemaa kasvatetaan yhdellä kunnes laskuri huomaa, että päästiin viimeisen muuttujan kohdalle. Taulukkomuuttujille on mahdollista käyttää myös foreach funktioita, joka on taulukkomuuttujille tarkoitettu esimääritelty silmukointi. Se luo taulukkomuuttujista tavanomaisia muuttujia (esim. foreach($aLinks as $jokuMuuttuja)), jolloin laskuria ei tarvita. */

{
print ("<li>".$aLinks[$i]."</li>\n"); /* Jos käytettäisiin foreach funktiota muuttujan nimenä oli annettu uusi muuttujanimi, esim. $jokuMuuttuja. Tässä tapauksessa on välttämätöntä käyttää kaksinkertaisia lainausmerkkejä. Jos käytetään "..." voidaan hakea muuttuja jonon keskelle siten, että muuttujan arvo tulostuu. Jos käytettäisiin '...' vain tarkat kirjaimet tulostuisivat, ei muuttujan arvo. Kohta voitaisiin toteuttaa myös ilman konkatenointioperaattoria muodossa ("<li>$aLinks[$i]</li>\n"). */
}
?>

</ul>

Attribuutin id käyttö olisi loogisesti mielekkäämpää, mutta käytön ongelmana on se, että samalla sivulla ei saisi koskaan olla kahta saman arvon omaavaa id-attribuuttia. Saattaa olla olla tilanteita, joissa samaan linkkiin viitataan samalla sivulla useaan otteeseen.

Jo en olisi käyttänyt luokka-attribuuttia, aakkostaminen olisi edellyttänyt erityisten avainten luomista. Olen kuitenkin pyrkinyt pitämään systeemin mahdollisimman yksinkertaisena. Alla on kuitenkin eräältä s-postiystävältä saadun mallin mukaan tehty esimerkki:

$aLinks = array(
"CodeStyle" => "<a href=\"http://www.codestyle.org/\" target=\"new\">CodeStyle</a>",
...
);

Esittämälläni tavalla voidaan saada luotua yksinkertaisia helposti hallittavia oikeita tietokantoja muistuttavia linkkitiedostoja. Listojen järjestely ja lopullinen tuottaminen muistuttavat tietokantatyöskentelyä. Edellä esitetyn ratkaisun ongelma on se, että linkkeihin liittyvät yksittäiset muuttujat täytyy manuaalisesti listata taulukkomuuttujiksi.

Mikäli linkkeihin liittyvät muuttujat listaa alla olevalla tavalla suoraan taulukkomuuttujiksi voidaan hakea joko koko taulukkomuuttuja tai sen yksittäisiä jäseniä. Taulukkomuuttujan päivittäminen ja uuden linkin lisääminen toteutuvat yhtä aikaa ilman, että taulukkomuuttujan päivittäminen aiheuttaa lisätöitä.

<?php
$aLinks = array(
($CodeStyle ="<a class=\"CodeStyle\" href=\"http://www.codestyle.org/\" target=\"new\">CodeStyle</a>"),
($IndexDOTCss="<a class=\"IndexDOTCss\" href=\"http://www.blooberry.com/indexdot/css/\" target=\"new\">Index DOT Css</a>"),
...
);
?>

Mikäli on tarpeen luoda uusi taulukkomuuttuja, jossa on enemmän muuttujia kuin jossakin olemassa olevassa taulukkomuuttujassa, uudet muuttuja voidaan lisätä olemassa olevaan taukkomuuttujaan, josta tulee uuden taulukkomuuttujan osa. Alla esimerkki array_push() funktion avulla luodusta uudesta taulukkomuuttujasta. Uudessa taulukkomuuttujassa on yksi jäsen enemmän kuin aikaisemmin luodussa taulukkomuuttujassa.

<?php
$aLinksFi = $aLinks;
array_push($aLinksFi,
($KeijoKortelainen="<a class=\"KeijoKort\" href=\"http://www.2kmediat.com/\" target=\"new\">Keijo Kortelainen, 2K mediat</a>")); /* Käytetty funktio lisää uuden muuttujan olemassa olevan taulukkomuuttujan loppuun. */
?>

Minun tapauksessani sama lopputulos olisi saatu funktiolla array_unshift(), joka lisää uuden muuttujan taulukkomuuttujan alkuun. Funktiolla array_merge() voidaan puolestaan yhdistää taulukkomuuttujia. Esimerkkitapauksessa muuttuja $KeijoKortelainen olisi ensin tarvinnut sijoittaa uuteen taulukkomuuttajaan.

Sillä että muuttujat määritellään taulukkomuuttujan sisällä on yksi haitta. Jos yksittäisiä muuttujia määritellään jossakin kohtaa uudelleen, muutos ei koske taulukkomuuttujia.

Jotta muuttujien uudet arvot saadaan myöskin taulukkomuuttujiin, taulukkomuuttujien sisällä olevat muuttujat täytyy poistaa ja niiden tilalle tulee laittaa muutetut muuttujat array_splice() funktion avulla, esim.:

$TopStyle=$TopStyle." (".$BradSoft.")";
$PageBuilder=$PageBuilder." (".$TafWS.")";
$DHTMLMenuB=$DHTMLMenuB." (".$xFX.")"; /* Alkuperäisessä $aApplications taulukkomuuttujassa edellä listatuilla muuttujilla on eri arvot. */

array_splice($aApplications,2,3,array($TopStyle,$PageBuilder,$DHTMLMenuB));
/* Parametrit 2,3 poistavat alkuperäiset muuttujat. */

Funktio array_splice() poistaa elementtejä alkuperäisestä taulukkomuuttujasta ns. siirtymän (offset) eli sijainnin ja pituuden (length) eli peräkkäisten muuttujien lukumäärän perusteella. Muuttujan nimen perusteella muuttien poistaminen ei ole mahdollista. Siksi alkupeäisten poistettavien muuttujien paikka täytyy tarkistaa ja poistettavien muuttujien tulee olla peräkkäin, jotta poisto ja uusien muuttujien antaminen voisi tapahtua yhdellä komennolla. Tämä on mielestäni suurin haittatekijä.

Oikeita tietokantoja käyttäen yksittäiset linkit voidaan hakea kenttien nimien perusteella. Koska muuttujien arvoja ei kirjoiteta suoraan taulukkomuuttijien sisään, paikalliset muutokset koskevat myös taulukkomuuttujia. Esittämässäni ratkaisussa uusien linkkien lisääminen linkkilistaan on kuitenkin suurin piirtein yhtä helppoa kuin tietokantoja käytettäessä. Alla on esimerkki tietokantojen käytöstä, jolla saavutettaisiin sama lopputulos kuin aikaisemmin esitetyssä esimerkissä noudetun inc-tiedoston käytöllä:

<ul>
<?php
result = mysql($conn, "SELECT class, osoite, nimi FROM tutorials"); /* Esimerkissä oletetaan, että tietokantataulukossa on kentät id, class, osoite nimi ja kuvaus, joista tässä esimerkissä noudetaan tietoa kolmesta kentästä. */
while (list($class, $osoite, $nimi) = mysql_fetch_row($result)) {
print("<li><a class=\"$class\" href=\"$osoite\" target=\"new\">$nimi</a></li>");
}
?>

</ul>
[Alku]