Šī rokasgrāmata ir pārpublicēta ar tās autora - Ingus Rūķa laipnu atļauju.

PHP programmētāja rokasgrāmata

Šī rokasgrāmata ir sarakstīta salīdzinoši sen, tāpēc daudz kas no šeit pieminētajām lietām var būt mainījies. Šobrīd tā tiek pamazām aktualizēta, esmu nedaudz pārrakstījis ievadu, pārējās nodaļas vēl sekos.

Ievads

PHP ir programmēšanas valoda, kas galvenokārt tiek izmantota dažādu tīmekļa aplikāciju (mājas lapu) izstrādei un uzturēšanai. Pašos pirmsākumos tā darbojās lai vienkārši atvieglotu darbu mājas lapu izstrādātājiem un ļautu dažādās lapas daļās iekļaut dinamisku saturu. Piemēram, vienkārši izveidot lapas, kurām visām ir vienāda izvēlne, viena un tā pati lapas galvene (header) un kājene (footer).

Laikam ejot arvien vairāk cilvēku sāka novērtēt šādas šablonu programmēšanas valodas iespējas un sāka piedalīties tās izstrādē. PHP kā programmēšanas valoda tiek izstrādāta balstoties uz atklātā koda principiem - praktiski jebkuram programmētājam jebkurā vietā uz pasaules ir iespējas ielūkoties PHP programmēšanas valodas kodā, piedāvāt savus labojumus vai ieteikt kādu vērtīgu papildinājumu.

Gadu gaitā PHP ir attīstījusies no vienkāršas šablonu programmēšanas valodas līdz pilnvērtīgai programmēšanas valodai, kas atbalsta modernas programmēšanas pieejas - sākot ar objektorientēto programmēšanu un beidzot ar darbavirsmas programmatūras izstrādi izmantojot citas atvērtā koda bibliotēkas.

PHP ir salīdzinoši vienkārša programmēšanas valoda un daudzi to izvēlas kā savu pirmo programmēšanas valodu, taču tikpat daudzi nonāk pie PHP pēc ilgstošas programmēšanas citās valodās. Tieši tāpēc PHP piedāvā dažādus veidus kā pierakstīt savas konstrukcijas. Lai arī sākumā tas varētu likties ļoti labi, jo rada izvēles brīvību un iespējas veidot savu programmēšanas stilu pēc sirds patikas, ar laiku vairums PHP programmētāju atzīst, ka tas patiesībā sagādā ļoti lielas galvassāpes.

Šajā nelielajā grāmatā tiks dots vispārīgs ieskats PHP programmēšanas valodā. Izlasot šo grāmatu, jums būs pamata zināšanas par šo valodu, tās konstrukcijām un to, kā sākt veidot savas pirmās PHP aplikācijas. Tālākais jau ir jūsu pašu ziņā. Līdz ar PHP programmēšanas valodas popularitāti ir pieejamas arī neskaitāmas pamācības un instrukcijas, kā izveidot vienu vai otru lietu šajā valodā. Diemžēl katram pašam ir jābūt pietiekami saprātīgam, lai saprastu, kas no tā visa ir derīgs un kas ne.

Šīs grāmatas pēdējā nodaļā tiks dots ieskats papildus literatūrā, kuru, manuprāt, būtu vērts izlasīt.

PHP instalācija un konfigurācija

PHP strādā ar dažādiem web serveriem dažādos veidos, taču uz šo brīdi vispopulārākais veids, kā darbināt PHP ir izmantot Apache web serveri, darbinot PHP kā moduli. Pilna instrukcija, kā uzstādīt PHP citos veidos, ir atrodama PHP dokumentācijā. Šeit apskatīsim tikai pašu populārāko.

Kad jūs lietojat PHP kā Apache moduli, PHP darbs tiek izsaukts ar speciālu MIME tipu. Tas tiek definēts Apache konfigurācijas failā ar sekojošu rindiņu:

AddType application/x-http-php .php

Šī rindiņa pasaka Apache, ka visi faili, kas beidzas ar .php, ir jāizpilda PHP modulim. Patiesībā .php jūs varat nomainīt ar ko vien vēlaties, tikai atcerieties, ka tad jūsu PHP failiem būs jābeidzas ar šo paplašinājumu.

Šāda cita faila paplašinājuma pievienošana var būt noderīga, kad jūs veidojat lapas ne tikai HTML, bet kādā citā valodā. Piemēram, WML, kura domāta aplūkošanai mobilajās ierīcēs, kas atbalsta WAP protokolu. Tāpat šī paplašinājuma nomaiņa varētu būt noderīga gadījumos, kad jūs nevēlaties lapas apmeklētājiem atklāti parādīt, ka jūs izmantojat PHP. Vēl kā piemēru varētu minēt www.ass.lv, kur visi faili beidzas ar paplašinājumu .ass. Šajā gadījumā pēc manām domām tam nav nekāda īpaša teorētiska pamatojuma. Kā redzams šo iespēju var izmantot arī tīri izklaides mērķiem.

Neaizmirstiet pārstartēt web serveri pēc izmaiņu izdarīšanas jūsu httpd.conf failā. Kad serveris ir pārstartēts, jūs varat pārliecināties par to, ka php darbojas izveidojot failu web servera dokumentu direktorijā ar nosaukumu info.php un vienu pašu rindiņu tajā:

<?php phpinfo( ); ?>

Tagad izsauciet to caur savu pārlūkprogrammu lietojot saiti http://jusu.domeens.com/info.php, attiecīgi nomainot adresi pret jūsu datoram atbilstošo (ja tas ir jūsu pašu dators, tad visticamāk, ka jāizmanto http://localhost/info.php). Lai attiecīgā lapa darbotos, tai ir jābūt saglabātai web servera dokumentu mapē. Ja gadījumā jūsu datoram nav piesaistīta domēna vārda, varat izmantot IP adresi. Kad būsiet atvēruši iepriekš aprakstīto lapu, vajadzētu parādīties lērumam ar informāciju par PHP. Ja jūs neredzat neko, mēģiniet apskatīt lapas izejas kodu. Ja redzat phpinfo() rindiņu, tas nozīmē, ka būsiet nepareizi norādījis AddType rindiņu savā httpd.conf failā. Ja jūsu pārlūkprogramma mēģina lejupielādēt php failu, tas nozīmē, ka ar AddType viss ir kārtībā, taču PHP modulis netiek izsaukts. Visdrīzāk, ka jūs esat aizmirsis LoadModule rindiņu Apache konfigurācijas failā.

Kad esat pārliecinājies par to, ka PHP darbojas, aplūkojiet PHP inicializācijas failu, kas saucas php.ini. phpinfo( ) lapa pateiks jums, kur PHP to centīsies atrast. PHP darbojas arī bez šī faila, taču šādā gadījumā tiks izmantoti noklusētie uzstādījumi. Ja jūs vēlaties mainīt noklusētos uzstādījumus, vai arī jūs vēlaties būt imūni pret izmaiņām noklusētajās vērtībās līdz ar jaunu PHP versiju iznākšanu, jums būtu jāizveido php.ini fails. PHP komplektā jau ir iekļauts php.ini-dist fails, kuru jūs varat pārsaukt par php.ini un ievietot phpinfo( ) norādītajā vietā. Lielākoties php.ini fails ir labi komentēts un pašizskaidrojošs.

Tāpat jūs varat ievietot konfigurācijas direktrīvas Apache httpd.conf failā vai arī .htaccess failos. Tas var būt ļoti noderīgi gadījumos, kad katrai direktorijai ir nepieciešams izmantot savādākus uzstādījumus vai arī jūs izmantojat Apache piedāvāto iespēju - virtual hosts. Ja jums php.ini failā ir rindiņa include_path = “.:/usr/local/lib/php:..“, tad jūs to pašu varat pateikt arī httpd.conf failā izmantojot: php_value include_path .:/usr/local/lib/php:..

Pavisam ir četras httpd.conf direktīvas, lai uzstādītu PHP parametrus:

  • php_value - lai uzstādītu normālus teksta mainīgos un vērtības
  • php_flag - lai uzstādītu boolean vērtības
  • php_admin_value - lai uzstādītu administratīvas vērtības
  • php_admin_flag - lai uzstādītu administratīvās boolean tipa vērtības

Papildus var tikt uzstādītas vērtības jūsu .htaccess failā, taču ar priekšnosacījumu, ka Apache uzstādījums AllowOverride (nosaka, ko drīkst darīt .htaccess failos) iekļaus vērtību „Options“

Papildus informāciju varat atrast lapā http://www.php.net/configuration

PHP iekļaušana HTML

PHP kods tiek iekļauts parastā HTML lapā. Piemēram, šādi jūs varat dinamiski ģenerēt lapas nosaukumu HTML dokumentā:

<html>
    <head>
        <title><?php echo $title; ?></title>
    </head>
    ...

Dokumenta daļa <?php echo $title; ?> tiek aizvietota ar PHP mainīgā title vērtību. echo ir parasta PHP valodas komanda, kuru jūs varat lietot, lai izvadītu datus.

Ir vairāki veidi, kā jūs varat iekļaut PHP kodu savā HTML dokumentā. Kā jūs jau tikko redzējāt, jūs varat kodu iekļaut starp <? un ?> iezīmēm:

<? echo "Hello World"; ?>

Šis veids ir visvairāk lietotais, taču ar to var rasties problēmas reizēs, kad jūs vēlēsieties darboties vienlaicīgi ar PHP un XML, jo arī XML lieto tādas pašas iezīmes. Šajā gadījumā ir vērts izslēgt šo PHP koda iekļaušanas veidu savā php.ini failā, izmantojot short_open_tag direktīvu.

Vēlviens veids, kā iekļaut PHP kodu ir izmantojot <?php un ?> iezīmes:

<?php echo "Hello World"; ?>

Ievērojiet, ka šis ir veids, kā iekļaut PHP kodu, kas darbojas vienmēr, neatkarīgi no php.ini failā uzstādītās direktīvas short_open_tag. Līdz ar to būtu ieteicams lietot tieši šo piegājienu, jo, gadījumā, ja būs nepieciešams pārvietot jūsu uzrakstīto prograamu uz citu sistēmu, problēmas ar PHP koda iekļaušanu nebūs.

Jūs varat vienlaikus iekļaut vairākas PHP komandas, atdalot tās ar semikoliem:

<?php
    echo "Hello World";
    echo "A second statement";
?>

Nav aizliegts jebkurā brīdī pārslēgties starp PHP un HTML kodu. Piemēram, ja jūs vēlaties 100 reižu izvadīt <br /> iezīmi, jūs varat rīkoties šādi:

<?php for($i=0; $i<100; $i++) { ?>
 <br />
<?php } ?>

Iepriekšējajā piemērā izmantota cikla konstrukcija, kas tiks apskatīta un izskaidrota nedaudz vēlāk, galvenā uzmanība šajā gadījumā ir jāpievērš faktam, ka jebkurā mirklī ir atļauts pārslēgties starp PHP un HTML kodu.

Protams, lietojot str_repeat( ) funkciju tas izskatītos sakarīgāk un vienkāršāk.

Kad jūs iekļaujat PHP kodu HTML failā, jums jālieto failam paplašinājums .php (vai tāds, kādu jūs to norādījāt konfigurējot web serveri), lai web serveris zinātu, ka šis fails ir jādod apstrādei PHP modulim.

Kad jūs esat iekļāvuši HTML failā savu PHP kodu, jūs varat uzskatīt šo lapu par PHP programmu. HTML un PHP gabaliņi veido programmas funkcionalitāti. Lapu komplektu, kas satur programmas sauc par web aplikāciju

Failu iekļaušana

Svarīga PHP iespēja ir iespēja iekļaut citus failus. Šie faili var saturēt papildus PHP komandas. Kad jūs projektējat web aplikāciju, jūs varat izšķirt biežāk lietojamos komponentus un salikt tos vienā failā. Šis solis padara daudz vienkāršāku web aplikācijas uzturēšanu, jo vienādās vietas ir jāmaina tikai vienreiz, vienā failā un izmaiņas atspoguļosies visā web aplikācijā. Lai varētu iekļaut failus, var lietot include komandu:

<?php
    $title="My Cool Web Application";
    include "header.inc";
?>

Savukārt pats iekļaujamais fails header.inc varētu izskatīties šādi:

<html>
    <head>
        <title><?php echo $title?></title>
    </head>

Šis piemērs ilustrē divas ļoti svarīgas lietas par PHP un iekļautajiem failiem. Pirmkārt, mainīgie, kas ir uzstādīti vienā no failiem, automātiski ir pieejami arī otrā, iekļautajā. Otrkārt, katrs iekļautais fails tiek iekļauts kā HTML dokuments, tas nozīmē, ka ja jūs vēlaties iekļaut PHP kodu, jums tas būs jāiekļauj PHP koda apzīmēšanas iezīmēs, kuras apskatījām jau iepriekš.

Ievērojiet, ka tika lietots fails ar paplašinājumu .inc. Tas nav nekāds īpašais faila tips, vienkārši paplašinājums, kādu es izvēlējos. Tā kā Apache web serverim nav pateikts, ka šie faili ir jāuzskata par PHP failiem, tad lietotāji atverot tos caur savu pārlūkprogrammu varēs apskatīt to izejas kodu. Šī ir viena no izplatītākajām drošības problēmām, ko pieļauj PHP programmētāji. Lai aizsargātos no atsevišķu failu parādīšanas caur pārlūkprogrammu, varam izmantot httpd.conf faila uzstādījumus:

<Files ~ "\.inc$">
    Order allow,deny
    Deny from all
</Files>

Šādi tiek nobloķēta tieša pieeja failiem ar paplašinājumu .inc. Lai izvairītos no šāda rakstura problēmām nevajadzētu izmantot citus failu paplašinājumus, kā tikai .php

Ir arī citi varianti (citas komandas), kā iekļaut failus. Var izmantot arī include_once, require un require_once funkcijas.

Atšķirība starp include un require ir tāda, ka, ja fails neeksistēs, include parādīs jums tikai brīdinājumu, kamēr require parādīs kļūdu un beigs skripta darbību. include_once un require_once funkcijas pārliecinās arī par to, ka jūs šo failu neiekļaujat vienā scenārijā vairākas reizes. Tas palīdz atbrīvoties no funkciju pārdefinēšanas kļūdām.

Valodas sintakse (pieraksts)

Mainīgo vārdi PHP valodā ir reģistra jūtīgi, tas nozīmē, ka $A un $a ir divi dažādi mainīgie. Tajā pašā laikā funkciju vārdi PHP nav reģistra jūtīgi. Šis noteikums ir attiecināms gan uz iebūvētajām PHP funkcijām, gan arī uz lietotāja definētajām.

PHP ignorē atstarpes starp komandām. Jūs varat lietot atstarpes, tabulatoru, pārneses jaunā rindiņā, lai noformētu un padarītu jūsu kodu labāk lasāmu. PHP komandas tiek atdalītas ar semikoliem:

<?php
    echo 'First line <br />';
    echo 'second line';
?>

Ir identisks ar:

<?php
    echo'First line <br />';echo'second line';
?>

Piezīme par to, ka pirmais pieraksta veids ir labāk lasāms un saprotams cilvēkam, laikam ir lieka. Līdz ar to ieteiktu brīvi un ar prātu lietot atstarpes un rindiņu atdalītājsimbolus, lai vajadzības gadījumā cilvēkam, kas lasīs jūsu programmu būtu vieglāk. Patiesībā uzreiz jau ir vērts iepazīties ar pasaulē pieņemtiem programmēšanas standartiem. Piemēram, PEAR Coding Standards vai Zend Coding Standard, kas nosaka labo praksi koda rakstīšanā. Pieturoties pie šādas koda pierakstīšanas metodikas, jūsu kods būs daudz labāk strukturēts un vieglāk uztverams citiem programmētājiem, ja radīsies tāda vajadzība.

Kā jau lielākajā daļā programmēšanas valodu, arī PHP ir padomāts par uzrakstītā koda komentēšanu. Tam parasti tiek izmantots speciāls pieraksts. PHP ir trīs komentāru pievienošanas veidi:

/* komentārs
vairāku rindiņu garumā */
 
// komentārs
 
# komentārs

Pirmais komentāru veids atļauj veidot arī komentārus vairāku rindiņu garumā, kamēr abi nākamie - tikai vienas rindiņas garumā.

Mainīgie

PHP valodā visi mainīgo vārdi sākas ar dolāra zīmi ($). Pēc $ seko jebkurš latīņu alfabēta simbols vai apakšvītra (_), pēc tam var sekot jebkurš latīņu alfabēta simbols, cipars vai apakšsvītra. Nav nekādu mainīgā nosaukumu garuma ierobežojumu. Mainīgo vārdi ir reģistra jūtīgi. Lūk daži piemēri:

$i
$counter
$first_name
$_TMP

Neskatoties uz to, ka mainīgo nosaukuma garumam nav nekādu ierobežojumu, vajadzētu izvēlēties kompromisu starp ļoti īsiem un ļoti gariem mainīgajiem. Nav absolūti nekādas jēgas lietot pāris simbolu garus mainīgos, ja to nosaukums neko nepasaka par vērtību, ko tas satur. Piemēram, kāda jēga programmā varētu būt no mainīgā ar nosaukumu $id? Tā vietā vajadzētu lietot nedaudz vairāk izsakošu mainīgo, piemēram $book_id, ja tas ir grāmatas identifikators, vai $car_id, ja tas ir automašīnas identifikators. Tāpat vajadzētu izvairīties arī no mainīgajiem ar pārspīlēti garu nosaukumu, piemēram: $_mana_pirmaa_kakja_vaards_bija_minkaans. Vēlviena piezīme - mainīgo nosaukumus vajadzētu veidot vienā valodā, lai nesanāk tā, ka puse no mainīgajiem ir latviešu valodā, vēl daļa angļu, krievu vai vācu valodā. Vienas valodas izmantošana jūtami atvieglos programmas lasīšanu vēlāk. Es personīgi izvēlos visu mainīgo vārdus angļu valodā, rakstot tos visus ar mazajiem burtiem, jo latviešu specifiskos simbolus (garumzīmes, mīkstinājuma zīmes) lietot nedrīkst.

Atšķirībā no citām programmēšanas valodām, PHP nav obligāti jādefinē mainīgie. PHP to dara jūsu vietā automātiski līdz ar pirmo mainīgā vērtības piešķiršanu. PHP mainīgie ir bez tipa, jūs varat piešķirt jebkuram mainīgajam jebkura tipa vērtību.

PHP lieto simbolu tabulu, lai glabātu mainīgo vārdus un vērtības. Ir divu veidu simbolu tabulas: globālā simbolu tabula, kas satur globālo mainīgo definīcijas un vērtības. Otra simbolu tabula ir funkciju jeb lokālā simbolu tabula, kas saglabā mainīgo nosaukumus un vērtības katrai funkcijai. To, kas ir funkcijas un kā tās lietot, apskatīsim nedaudz vēlāk.

Dinamiski mainīgie

Reizēm ir lietderīgi uzstādīt un lietot mainīgos dinamiski. Parasti jūs uzstādāt mainīgā vērtību šādi:

$var = "hello";

Tagad pieņemsim, ka jūs vēlaties mainīgo, kura nosaukums ir $var vērtība. Jūs to varat panākt sekojoši:

$$var = "World";

PHP izpilda $$var vispirms atšifrējot iekšējo mainīgo, kas nozīmē to, ka $var tiks pārveidots par „hello“. Pāri palikusī izteiksme ir $“hello“, kas ir vienāda ar vienkārši $hello. Citiem vārdiem sakot, mēs esam tikko izveidojuši mainīgo ar nosaukumu hello un piešķīruši tam vērtību „World“. Jūs varat šādi veidot mainīgos neierobežoti dziļi (piemēram, trešā līmeņa dinamiskais mainīgais: $$$var), taču der atcerēties, ka veidojot mainīgos dziļāk par 2. līmeni var radīt nopietnas grūtības vēlāk lasot kodu.

Lai izmantotu dinamiskos mainīgos, kam jāatrodas teksta virknēs, ir jāizmanto speciāla sintakse:

echo "Hello ${$var}";

Šī sintakse tāpat palīdz arī izvairīties no neskaidrībām, kas rodas izmantojot mainīgo masīvus. Piemēram, $$var[1] ir divdomīgs, jo PHP nav iespējas paredzēt, kuram no mainīgajiem šis indekss ir domāts. Ja mēs izmantojam sintaksi ar figūriekavām, šī problēma nerodas: ${$var[1]} vai ${$var}[1].

Iesākumā dinamiskie mainīgie varētu nelikties īpaši lietderīgi, taču ir reizes, kad tie var samazināt koda apjomu, kas ir jāuzraksta, lai paveiktu kādu iecerētu darbību. Piemēram, pieņemsim, ka mums ir šāds asociatīvs masīvs:

$array["abc"] = "Hello";
$array["def"] = "World";

Par to, kas ir asociatīvs masīvs, sīkāk tiks runāts nedaudz vēlāk.

Asociatīvi masīvi tiek atgriezti no dažādām PHP iebūvētajām funkcijām. mysql_fetch_array ir viena no tādām. Masīva indeksi parasti atsaucas uz laukiem vai entītiju vārdiem, kas ir saistīts ar to moduli, ar kuru jūs darbojaties. Ir parocīgi pārveidot šos entītiju vārdus par īstiem PHP mainīgajiem. Tādējādi jūs varat atsaukties uz tiem vienkārši lietojot $abc un $def. To var paveikt šādi:

foreach($array as $index => $value) {
    $$index = $value;
}

Datu tipi

PHP piedāvā četrus primitīvus datu tipus: veselos skaitļus (integer), decimāldaļskaitļus (real, floating point), teksta virknes (string) un boolean (boolean) tipa mainīgos. Papildus ir arī divi saliktie datu tipi: masīvi un objekti.

Veselie skaitļi (integers)

Veselo skaitļu robežas PHP valodai ir tādas pašas, kā long datu tipam valodā C. 32 bitu procesoros (tādi, kādi ir parastajos IBM PC tipa datoros), veselo skaitļu robežas ir no -2,147,483,648 līdz +2,147,483,647. PHP automātiski pārveido lielākas vērtības par decimāldaļskaitļiem, ja jūs parsniedzat šīs robežas. Veselie skaitļi var tikt izteikti decimālajos (skaitīšanas sistēmas bāze - 10), heksadecimālajos (bāze 16) vai oktālajos skaitļos (bāze 8). Piemēram:

$decimal=16;
$hex=0x10;
$octal=020;

Decimāldaļskaitļi (floating point numbers)

Decimāldaļskaitļu robežas PHP valdoā ir līdzvērtīgas double datu tipam valodā C. Lielākajā daļā platformu, tā robežas ir mērāmas starp 1.7E-308 un 1.7E+308. Skaitlis var tikt attēlots gan parastajā pierakstā, gan arī zinātniskajā:

$var=0.017; // parastais pieraksts
$var=17.0E-3; // zinātniskais pieraksts

Tāpat PHP ir divas kopas ar funkcijām, kas paredzētas, lai darbotos ar skaitļiem ar augstu precizitāti. Šie funkciju komplekti ir pazīstami kā BC un GMP funkcijas. Sīkāku informāciju var atrast PHP dokumentācijā, attiecīgi: http://www.php.net/bc un http://www.php.net/gmp.

Teksta virknes (strings)

Teksta virknes sastāv no simboliem. Tās var atdalīt ar parastajām vai dubultajām pēdiņām (' un ).

'PHP is cool'
"Hello, World!"

Teksta virknēs, kas atdalītas ar dubultajām pēdiņām, notiks mainīgo aizvietošana ar to vērtībām, kamēr teksta virknēs ar parastajām pēdiņām - nenotiks. Piemēram:

$a = "World";
echo "Hello\t$a\n";

Šis piemērs parādīs „Hello“, kam sekos tabulatora simbols, tad vārds „World“, kam, savukārt, sekos jaunas rindiņas simbols. Citiem vārdiem sakot, ir tikuši aizvietoti mainīgie un speciālie simboli. Kā pretpiemēru apskatīsim šādu kodu:

echo 'Hello\t$a\n';

Šajā gadījumā izvadītais teksts ir tieši Hello\t$a\n. Netiek veikta ne mainīgo ne arī speciālo simbolu aizvietošana

Vēlviens veids, kā piešķirt mainīgajam vērtību ir heredoc sintakse. Šīs metodes priekšrocība ir tāda, ka jums nav jāuztraucas par pēdiņu lietošanu un nav jālieto izvairīšanās simboli (escape characters). Sintakse ir sekojoša:

$foo = <<<EOD
    This is a "multiline" string
    assigned using the 'heredoc' syntax.
EOD;

Nākamā tabula parāda izvairīšanās simbolu (escape characters) un tiem sekojošo simbolu nozīmi un lietojumu PHP dubultajās iekavās.

Izvairīšanās virkne (escape sequence)Nozīme
\nJaunās rindiņas simbols (LF jeb 0×0A (10) ASCII kodu tabulā)
\rRakstatgriezes simbols (carriage return) (CR jeb 0×0D (13) ASCII kodu tabulā)
\tHorizontālais tabulators (HT jeb 0×09 (9) ASCII kodu tabulā)
\\Atpakaļ krītošā slīpsvītra (\)
\$Dolāra zīme
\“Dubultās pēdiņas
\123Simbola parādīšana pēc oktālā koda
\x12Simbola parādīšana pēc heksadecimālā koda

Boolean tipa mainīgie

Boolean tipa mainīgie var saturēt tikai divas vērtības true un false (attiecīgi „patiess“ un „nepatiess“). Piemēram:

$flag = true;

Boolean tipa mainīgie visbiežāk tiek lietoti, kad == vai === operatori veic salīdzināšanu un atgriež rezultātu.

Masīvi (arrays)

Masīvs ir saliktais datu tips, kas var saturēt vairākas datu vērtības, katrai no kurām ir piekārtots indekss - skaitlisks vai tekstuāls. Piemēram, teksta virkņu masīvu var uzrakstīt šādi:

$var[0]="Hello";
$var[1]="World";

Ievērojiet, ka tad, kad jūs piešķirat masīvam elementus šādā veidā, jums nav obligāti jālieto pēc kārtas ņemas masīva indeksa vērtības:

$var[0]="Hello";
$var[7]="World";

Taču šādā gadījumā jums pašiem var rasties problēmas ar šāda masīva tālāku izmantošanu, jo 6 pa vidu esošie elementi nebūs definēti.

Kā saīsinājumu, PHP ļauj pievienot arī elementu masīva beigās, nenorādot indeksu:

$var[] = "Test";

PHP paņem nākamo loģisko skaitlisko indeksu. Šajā gadījumā „Test“ elementam tiks piešķirts indekss 8. Ja masīvam nav pēc kārtas esoši elementi, PHP par jauno indeksu izvēlēsies nākamo skaitli aiz maksimālā pašreizējā indeksa. Šāda automātiskās indeksēšanas iespēja ir ļoti noderīga, kad ir jāstrādā ar vairāku izvēļu HTML <select> formu elementiem, kā mēs redzēsim nedaudz vēlāk.

Neskatoties uz to, ka teksta virknes mēs iepriekš nosaucām par parasto datu tipu, tās var uzskatīt arī par saliktu datu tipu, kurā katram teksta virknes simbolam var piekļūt atsevišķi. Citiem vārdiem sakot, mēs varam iztēloties teksta virkni kā masīvu no simboliem, kur pirmais simbols ir ar indeksu 0. Tādējādi mēs varam piekļūt teksta virknes trešajam simbolam ar šādu kodu:

$string[2]

Lai atrisinātu neskaidrības starp teksta virknēm un masīviem, ir izveidota speciāla sintakse, lai piekļūtu atsevišķiem teksta virknes simboliem:

$string{2}

Tas, protams, ir ekvivalents ar iepriekš pieminēto $string[2]

Masīvi var tikt indeksēti arī ar teksta virknēm, šādus masīvus sauc par asociatīviem masīviem:

$var["January"]=1;
$var["February"]=2;

Jūs varat lietot gan skaitliskus gan tekstuālus indeksus vienā masīvā, jo PHP uz tiem skatās kā uz heštabulām, līdz ar to hešs jeb indekss var būt jebkas.

Visi masīvi PHP programmēšanas valodā var tikt apstaigāti ar šādu mehānismu:

foreach($array as $key=>$value) {
    echo "array[$key]=$value<br/>\n";
}

Šis ir visbiežāk lietotais veids, kā apstaigāt visus masīva elementus, neatkarīgi no tā, vai tā indeksi ir skaitliski vai tekstuāli. PHP piedāvā veselu komplektu ar funkcijām, kas ir paredzētas darbam ar masīviem.

Objekti (objects)

Objekts ir saliktais datu tips, kas var saturēt jebkādu skaitu mainīgo un funkciju. PHP4 atbalsts objektiem ir savā ziņā limitēts, taču PHP5 šis atbalsts tiks jūtami uzlabots. PHP4 šī iespēja tiek piedāvāta, lai varētu vienkāršāk apkopot un veidot datu struktūras, papildināt tās ar funkcijām šo datu struktūru apstrādei. Tādējādi tiek izveidotas atkārtoti izmantojamas klases. Piemēram:

class test {
    var $str = "Hello World";
    function init($str) {
        $this->str = $str;
    }
}
 
$class = new test;
echo $class->str;
$class->init("Hello");
echo $class->str;

Šis kods izveido test objektu, izmantojot new operatoru. Tālāk tiek uzstādīts objekta mainīgais ar nosaukumu str. Ja mēs runājam objekt-orientēti, tad objekta mainīgo var uzskatīt par sava veida objekta raksturlielumu jeb atribūtu, parametru. Mūsu apskatītais test objekts definē arī savu iekšējo funkciju init(). Objektu iekšējās funkcijas parasti sauc par objekta metodēm. Šī metode savā darbībā izmanto īpašo $this mainīgo, lai izmainītu paša objekta mainīgo (atribūtu, parametru) str.

Objektu mantošana tiek realizēta ar extends atslēgas vārdu, definējot klasi. Lai paplašinātu savu iepriekšējo test klasi, varam izmantot šādu piemēru:

class more extends test {
    function more( ) {
        echo "Constructor called";
    }
}

Tas nozīmē, ka more klase manto no test klases visas metodes un atribūtus.

Ja klasē ir definēta metode ar tādu pašu nosaukumu, kā klases nosaukums, tad šo metodi sauc par konstruktoru un tā tiek izsaukta tiklīdz tiek veidots jauns objekts. Šādi ir ērti uzstādīt vajadzīgos objekta atribūtus. Kā redzam iepriekšējā piemērā, mūsu paplašinātajai klasei more ir izveidots konstruktors, tiklīdz tiks izveidots jauns objekts more klasei, tiks izvadīts teksts „Constructor called“

Papildus informāciju par objektorientēto programmēšanu varat atrast PHP dokumentācijā: http://www.php.net/oop

Tipu piešķiršana (Type casting)

Iepriekš jau tika minēts, ka PHP valodā mainīgajiem tipi nav jādefinē. Taču tas nenozīmē, ka mainīgajiem šo tipu vispār nav. Vienkārši - tie tiek piešķirti automātiski un pēc vajadzības. Jūs, protams, varat pateikt PHP, ka kādam mainīgajam vēlēsieties tieši jūsu izvēlēto tipu. Lai to panāktu, atliek tikai parastajās iekavās pirms mainīgā vērtības norādīt tā tipu:

$var = (int)"123abc";

Parasti PHP būtu veidojis teksta virknes mainīgo. Taču veicot šādu tipa piešķiršanu, PHP ir izveidojis mainīgo ar vērtību 123. Nākamajā tabulā iespējams apskatīt visus pieejamos piešķiramos tipus PHP valodā.

OperatoriFunkcijas
(int) , (integer)Pārveidot par veselu skaitli
(real) , (double) , (float)Pārveidot par decimāldaļskaitli
(string)Pārveidot par teksta virkni
(array)Pārveidot par masīvu
(object)Pārveidot par objektu
(bool) , (boolean)Pārveidot par boolean tipa mainīgo
(unset)Pārveidot par NULL; Tas pats, kas izsaukt unset() funkciju.

Lai arī parasti tas nav nepieciešams, tomēr PHP komplektā ir funkcijas, kas ir paredzētas mainīgā tipa noteikšanai:

  • gettype()
  • is_bool()
  • is_float()
  • is_string()
  • is_array()
  • is_object()

Izteiksmes

PHP programmas pamatā tiek veidotas no izteiksmēm. Par izteiksmi var uzskatīt jebko, kam ir vērtība. Piemēram

  • 5
  • 5+5
  • $a
  • $a==5
  • sqrt(9)

Kombinējot daudzas šādas pamatizteiksmes, mēs būvējam sarežģītākas.

Ievērojiet, ka echo komanda, kuru mēs jau vairākas reizes esam lietojuši nevar būt izteiksmes sastāvdaļa, jo tā neatgriež nekādu vērtību. Savukārt print komanda var tikt uzskatīta par sarežģītu izteiksmi - tā atgriež kaut kādu vērtību. Visādi citādi echo un print ir identiskas komandas - tās izvada datus.

Operatori

Izteiksmes tiek kombinētas un manipulētas ar operatoriem. Nākamajā tabulā ir parādīts operatoru saraksts, sākot ar lielāko prioritāti un beidzot ar vismazāko. Otrā kolona parāda operatora asociativitāti. Jums vajadzētu pazīt šos operatorus, ja jums ir pieredze C, Java vai Perl programmēšanā.

OperatoriAsociativitāte
!, ~, ++, –, @Labā
*, /, %Kreisā
+, -, .Kreisā
«, »Kreisā
<, ⇐, >=, >Neasociatīvs
==, !=, ===, !==Neasociatīvs
&Kreisā
^Kreisā
|Kreisā
&&Kreisā
||Kreisā
? :Kreisā
=, +=, -=, *=, /=, %=, ^=, .=, &=, |=, «=, »=Kreisā
ANDKreisā
XORKreisā
ORKreisā

Kontroles struktūras

Kontroles struktūras PHP valodā ir ļoti līdzīgas tām, kas tiek lietotas C valodā. Tās tiek izmantotas, lai kontrolētu loģisko darbību kārtību visā PHP skriptā. PHP kontroles struktūras pieļauj divus veidus, kā tās pierakstīt. Pirmais veids ir C-tipa pieraksts, ar figūriekavām atdalot komandu blokus, kamēr otrais veids ir mazliet rupjāks un prasa lietot nobeiguma komandas bloku beigās. Pirmais stils ir ieteicams, kad kontroles struktūra ietilpst tikai un vienīgi PHP koda blokā. Savukārt otrais pieraksta stils varētu būt derīgs, kad tiek veidoti lieli bloki ar jauktu PHP un HTML kodu. Abi divi veidi ir savstarpēji aizvietojami jebkurā situācijā, tāpēc katra atsevišķā stila lietošana vienā vai otrā gadījumā ir tikai un vienīgi gaumes jautājums.

Es pats personīgi vienkāršības labad lietoju tikai C-tipa pieraksta stilu ar figūriekavām, jo uzskatu to par vienkāršāku un labāk saprotamu koda lasītājam. Atliek vienīgi pareizi lietot atkāpes kodā un visas saprašanas problēmas pazūd pašas no sevis

if

If komanda ir standarta nosacījuma kontroles struktūra, kas sastopama lielākajā daļā programmēšanas valodu. Lūk abu veidu pieraksta piemēri if komandai:

if(expr) {            if(expr):
    statements            statements
} elseif(expr) {      elseif(expr):
    statements            statements
} else {              else:
    statements            statements
}                     endif;

If komanda liek izpildīties noteiktam koda blokam (piemērā tiek apzīmēts kā statements), ja izteiksme ir vienāda ar true. Pirmajā pierakstā ir atļauts nelietot figūriekavas, ja koda blokā ir tikai viena rindiņa, taču labais stils prasa lietot figūriekavas visos gadījumos.

Ja jums ir nepieciešamība lietot if kontroles struktūru, kurai atkarībā no izteiksmes vērtības (true vai false) būs jāpiešķir vienam mainīgajam kāda vērtība, tad ir iespējams lietot if īso pierakstu:

$variable = (expr ? statement1 : statement2)

Šis koda fragments nozīmē to, ka $variable vērtība būs statement1, ja expr izteiksmes vērtība būs True, un statement2, ja expr vērtība būs False

Neliels piemērs if konstrukcijas izmantošanai. Pieņemsim, ka mums ir jāizveido PHP skripts, kas noteiks, vai skaitlis ir pāra, vai nepāra un ir jāizvada atbilstošs paziņojums:

if ($skaitlis % 2 == 0) {
    echo "Skaitlis $skaitlis dalās ar divi, līdz ar to tas ir pāra skaitlis";
} else {
    echo "Skailist $skaitlis nedalās ar divi, līdz ar to tas ir nepāra skaitlis";
}

Šajā gadījumā, kā redzams, expr izteiksme satur vērtību $skaitlis % 2 == 0. % operācija nozīmē, ka skaitlis tiek dalīts un rezultātā atgriezts atlikums. Ja skaitlis dalās ar attiecīgo skaitli, tad atlikums, protams, ir 0. Savukārt == operators nodrošina abu izteiksmes pušu salīdzināšanu. Atcerieties, ka šādās vietās vienmēr ir jālieto == nevis =

switch

switch komanda var tikt lietota gadījumos, kad nepieciešams aprakstīt viena mainīgā daudzas vērtības. Līdzīgi kā if gadījumā ar divām vērtībām, šeit tādas var būt neierobežotā daudzumā. Taču nevajag arī pārāk aizrauties. Lūk divi pieraksta veidi switch komandai:

switch(expr) {              switch(expr):
    case expr:                  case expr:
        statements                  statements
        break;                      break;
    default:                    default:
        statements                  statements
        break;                      break;
}                           endswitch;

Katra case vērtība tiek salīdzināta ar switch iekavās norādīto izteiksmes vērtību, un, ja tās sakrīt, tad tiek izpildīts koda bloks aiz attiecīgās case iezīmes. break atslēgas vārds signalizē, ka attiecīgais koda bloks ir jāpārtrauc izpildīt un jāiet ārā no switch kontroles struktūras. Ja jūs nelietosiet break atslēgas vārdu, tiks izpildīti arī visi pārējie koda bloki, kas seko aiz šīs case iezīmes. Ja neviena no case izteiksmēm nav vienāda ar switch izteiksmi, tiek izsaukts koda bloks, kas atrodas aiz default iezīmes.

Triviāls piemērs, kā organizēt lapas sadaļu principu:

switch ($_REQUEST['sadala']) {
    case 'foto':
        include_once('sadalas/foto.php');
        break;
    case 'zinas':
        include_once('sadalas/zinas.php');
        break;
    default:
        include_once('sadalas/sakums.php');
        break;
}

Šajā gadījumā jūs varēsiet piekļūt sadaļām atverot caur pārlūkprogrammu savu PHP skriptu ar papildus parametru sadala: http://adrese/skripts.php?sadala=zinas ].

while

while komanda izpilda tajā iekļauto koda bloku (piemērā statements) tik ilgi, kamēr norādītā izteiksme (piemērā expr)ir satur vērtību true.

while(expr) {           while(expr):
    statements              statements
}                       endwhile;

while izteiksme tiek pārbaudīta pirms katras iterācijas (koda bloka izpildīšanas reizes) sākuma. Ja izteiksme ir vienāda ar true, koda bloks tiek izpildīts. Ja izteiksme ir vienāda ar false, PHP turpina izpildīt skriptu aiz while kontroles struktūras.

Tāpat, kā if gadījumā, ja jums ir nepieciešams izpildīt tikai vienu rindiņu koda, jūs varat nerakstīt figūriekavas, taču labais stils prasa rakstīt tās jebkurā gadījumā.

Gluži kā switch gadījumā ir iespējams jebkurā brīdī lekt ārā no kontroles struktūras, izmantojot break komandu. Ievērojiet, ka ja jūs esat salikuši vairākus ciklus vienu iekš otra, tad ar break jūs izleksiet ārā tikai no paša iekšējā cikla, nevis no visiem uzreiz. Ja tomēr ir nepieciešamība lekt ārā uzreiz no diviem cikliem (vai vairāk), iespējams break komandai norādīt parametru - ciklu skaitu(break n). Tāpat ir pieejama arī komanda continiue, kas pārtrauks koda bloka izpildi un sāks nākamo iterāciju no sākuma. Ar continiue n jūs varat pārlekt pašreizējām iterācijām n iekšējajos ciklos.

do/while

do/while kontroles struktūra ir gandrīz vienāda ar iepriekš aprakstīto while, vienīgā atšķirība ir tā, ka nosacījuma izteiksmes vērtība tiek pārbaudīta cikla beigās, kas nozīmē tikai to, ka šajā gadījumā koda bloks tiks izpildīts kā minimums vienu reizi, neatkarīgi no izteiksmes vērtības:

do {
    statements
} while(expr);

Ievērojiet, ka šai kontroles struktūrai ir tikai viena pieļaujama sintakse. Ja ir nepieciešams izpildīt tikai vienu koda rindiņu, varat nerakstīt figūriekavas, taču labais stils prasa tās rakstīt vienmēr. break un continiue komandas darbojas tāpat, kā while gadījumā.

for

for ir mazliet sarežģītāka kontroles struktūra par iepriekš apskatīto while:

for(start_expr; cond_expr; iter_expr) {
    statements
}
 
for(start_expr; cond_expr; iter_expr):
    statements
endfor;

for kontroles struktūra izmanto trīs izteiksmes. Pirmā izteiksme ir sākuma izteiksme, tā tiek izpildīta līdz ar cikla sākšanos. Tā parasti tiek lietota, lai uzdotu sākuma vērtību cikla skaitītājam. Otrā izteiksme ir nosacījuma izteiksme, kura kontrolē ciklu. Tā tiek pārbaudīta pirms katra cikla izpildīšanas. Trešā izteiksme ir cikla izteiksme, tā tiek izpildīta katru reizi pēc cikla. Parasti tā tiek izmantota, lai palielinātu cikla skaitītāju. Kā jau pierasts, varat nerakstīt figūriekavas, ja cikla koda blokā ir tikai viena koda rindiņa, taču labais stils prasa lietot figūriekavas visos gadījumos.

break un continiue komandas darbojas tāpat, kā while gadījumā, vienīgā atšķirība ir ar continiue komandu, kura liek izpildīt cikla izteiksmi pirms nosacījuma izteiksmes.

foreach

foreach kontroles struktūra tiek izmantota, lai apstaigātu visus masīva elementus. Lūk piemērs abiem pieraksta veidiem:

foreach(array_expression as $value) {
    statements
}
 
foreach(array_expression as $value):
    statements
endforeach;

Šis koda piemērs iet cauri visiem array_expression elementiem un piešķir katru masīva vērtību $value mainīgajam. Jūs varat iegūt arī masīva indeksu mainīgajā $key ar šādu sintaksi:

foreach(array_expression as $key=>$value) {
    statements
}

break un continiue komandas darbojas tāpat, kā while gadījumā.

Funkcijas

Funkcija ir programmas koda fragments, kam ir dots nosaukums, kas var saņemt parametrus un atgriezt vērtību. Funkcijas izsaukums ir izteiksme, kas satur vērtību, tā vērtība tiek atgriezta no funkcijas. PHP piedāvā ļoti lielu skaitu ar iebūvētajām funkcijām. PHP tāpat atbalsta lietotāja definējamās funkcijas. Lai definētu pats savu funkciju, ir jāizmanto function atslēgas vārds. Piemēram:

function soundcheck($a, $b, $c) {
    return "Testing, $a, $b, $c";
}

Kad jūs definējat funkciju, esiet uzmanīgi ar vārdiem, kurus jūs tām piešķirat. Patiesībā jums ir jābūt pārliecinātiem, ka vārds, kuru jūs piešķirat savai funkcijai nesakrīt ar kādu no PHP iebūvētajām funkcijām. Gadījumā, ja jūs tomēr izvēlaties funkcijai vārdu, kas ir vienāds ar kādu PHP iebūvēto funkciju, jums tiek parādīta šāda kļūda:

Fatal error: Can't redeclare already declared function in "filename" on line "N"

Pēc tam, kad jūs esat definējis savu funkciju, jūs to varat izsaukt ar atbilstošajiem argumentiem. Piemēram:

echo soundcheck(4, 5, 6);

Tāpat ir iespējams definēt funkcijas ar neobligātiem parametriem. Lai nodefinētu parametru kā neobligātu, jums ir jāuzrāda noklusētā vērtība šim parametram. Piemērs, kā pārveidot iepriekš definēto funkciju souncheck() par tādu, kurai visi parametri ir neobligāti:

function soundcheck($a=1, $b=2, $c=3) {
    return "Testing, $a, $b, $c";
}

Argumentu nodošana funkcijām

Ir divi veidi, kā jūs varat nodot argumentus funkcijai: pēc vērtības un pēc norādes. Lai nodotu argumentu pēc vērtības, jūs nododat funkcijai jebkādu korektu izteiksmi. Šī izteiksme tiek izrēķināta un vērtība tiek piešķirta attiecīgajam funkcijas parametram. Jebkuras izmaiņas, kas tiks izdarītas parametra vērtībai, neatspoguļosies ārpus jūsu definētās funkcijas. Piemēram:

function triple($x) {
    $x=$x*3;
    return $x;
}
$var=10;
$triplevar=triple($var);

Šajā gadījumā $var ir vienāds ar 10, kad tiek izsaukta funkcija triple(), tādējādi parametram $x tiek piešķirta vērtība 10 funkcijas iekšienē. Kad $x ir trīskāršots (pareizināts ar 3), tas nemaina $var vērtību ārpus funkcijas.

Pretēji, kad jūs padodat argumentu pēc norādes, visas izmaiņas parametrā, kas ir nodots, atspoguļojas arī ārpus funkcijas robežām. Tas ir tāpēc, ka jūs nododat argumentu pēc norādes. Tagad parametrs funkcijā norāda tieši uz vērtību, kas nozīmē to, ka jebkuras izmaiņas attiecībā uz parametru būs redzamas arī ārpus funkcijas. Piemēram:

function triple(&$x) {
    $x=$x*3;
    return $x;
}
$var=10;
triple($var);

&amp;, kas atrodas $x priekšā funkcijas triple() definīcijā, liek nodot argumentu pēc norādes, tādējādi beigās iegūstam, ka $var vērtība ir 30.

Mainīgo apgabals (variable scope)

Mainīgo apgabals (variable scope) ir PHP koda apgabals, kurā attiecīgais mainīgais ir pieejams. PHP valodā ir divi mainīgo apgabali. Globālie mainīgie ir pieejami tieši PHP koda izpildes laikā. Tas ir, jūs varat tiem piekļūt tik ilgi, kamēr neesat kādā funkcijas izsaukumā vai objektorientētas klases metodē. Atšķirībā no citām programmēšanas valodām, PHP funkcijām ir pašām savs mainīgo apgabals. Piemēram:

<?php
function test( ) {
    echo $a;
}
 
$a = "Hello World";
test( );
?>

Ja jūs iedarbināsiet šo skriptu, jūs redzēsiet, ka nekas netiek izvadīts (ja neskaita kļūdu paziņojumus). Tas ir tāpēc, ka mainīgais $a, kuru jūs mēģināt izmantot test() funkcijā ir pilnīgi atšķirīgs no globālā $a, kuru jūs esat izveidojis tieši pirms funkcijas izsaukšanas. Lai jūs varētu funkcijas iekšienē piekļūt globālā apgabala mainīgajiem, jums ir par to jāpaziņo funkcijai katram atsevišķam mainīgajam. Paziņošana notiek ar global atslēgas vārdu. Piemērs:

<?php
function test( ) {
    global $a;
    echo $a;
}
 
$a = "Hello World";
test( );
?>

Ievērojiet, ka nav desmit reižu jāraksta atslēgas vārds global, ja gribat pateikt, ka jums nepieciešami desmit globālie mainīgie. Tam var izmantot mainīgo atdalīšanu ar komatu:

<?php
function test( ) {
    global $a, $b, $c;
    echo $a;
    echo $b;
    echo $c;
}
 
$a = "Hello World!";
$b = "How are you?";
$c = "Bye!";
test( );
?>

Tieši tāpat jūs varat izmantot arī PHP iebūvēto globālo mainīgo masīvu. Piemērs:

<?php
function test( ) {
    echo $GLOBALS['a'];
}
 
$a = "Hello World";
test( );
?>

Pēdējā piemērā $GLOBALS masīvs ir superglobāls, kas nozīmē to, ka tas ir pieejams visos mainīgo apgabalos, bez īpašas vajadzības to definēt kā īpaši, lai varētu izmantot funkcijas iekšienē.

Statiskie mainīgie

PHP atbalsta arī funkciju mainīgo definēšanu kā statiskus mainīgos. Statisks mainīgais saglabā savu vērtību starp funkciju izsaukumiem, taču ir joprojām sasniedzams attiecīgās funkcijas iekšienē. Statiskajiem mainīgajiem var piešķirt arī sākuma vērtību. Šī sākuma vērtības piešķiršana notiek tikai pašu pirmo reizi, kad static deklarācija tiek izpildīta. Statiskie mainīgie bieži vien tiek lietoti kā skaitītāji. Gluži kā šajā piemērā:

function hitcount( ) {
    static $count = 0;
 
    if ($count == 0) {
        echo "This is the first access to this page";
    } else {
        echo "This page has been accessed $count times";
    }
    $count++;
}

Ar web saistīti mainīgie

PHP automātiski izveido mainīgos visiem datiem, kas tiek saņemti HTTP pieprasījumā. Tie var būt GET, POST, cookie un vides (environment) mainīgie. Šie mainīgie tiek ievietoti vai nu PHP globālajā simbolu tabulā vai arī vienā no varākiem superglobālajiem masīviem, atkarīgā no register_globals uzstādījuma php.ini failā.

Sākot ar PHP versiju 4.2.0, register_globals noklusētā vērtība ir off. Ar šādu vērtību visi dažādie mainīgie, kas iepriekš bija pieejami globālajā simbolu tabulā, tagad tiek sadalīti pa superglobālajiem masīviem. Ir noteikta kopa ar superglobālajiem masīviem, tie nevar tikt izveidoti ar parasta PHP skripta palīdzību. Lietojamais masīvs ir atkarīgs no mainīgā avota. Lūk arī saraksts:

$_GET

GET metodes mainīgie. Šie mainīgie parasti tiek norādīti pieprasījuma saitē (request URL). Piemēram, saite: http://www.example.com/script.php?a=1&b=2, tiks uzstādīti masīva $_GET elementi $_GET['a'] un $_GET['b'] ar attiecīgajām vērtībām 1 un 2

$_POST

POST metodes mainīgie. Parasti ar šo metodi dati tiek iegūti no parastām HTML formām ar post metodi datu nosūtīšanai.

$_COOKIE

Visi cookie, ko pārlūkprogramma atsūta līdz ar pieprasījumu. Cookie nosaukums pārtop par masīva indeksu, bet vērtība - par attiecīgajam indeksam piesaistīto vērtību.

$_REQUEST

Šis masīvs satur visas iepriekšējo trīs masīvu vērtības (GET, POST un cookie). Ja mainīgais parādās vairākos no šiem masīviem, kārtība, kādā tie tiek importēti $_REQUEST masīvā, tiek uzrādīta variables_order parametrā php.ini failā. Noklusētā vērtība šim parametram ir „GPC“, kas nozīmē to, ka vispirms tiek ielasītas vērtības no GET metodes, tad no POST metodes un visbeidzot cookie vērtības. Ievērojiet, ka gadījumā, ja jums būs vienāda nosaukuma mainīgie POST un GET metodēs, uzrādīsies tā mainīgā vērtība, kas būs POST metodē, ja vien nebūsiet nomainījuši attiecīgo php.ini vērtību.

$_SERVER

Šos mainīgos uzstāda jūsu web serveris. Parasti tiek uzstādītas tādas lietas kā DOCUMENT_ROOT, REMOTE_ADDR, REMOTE_PORT, SERVER_NAME, SERVER_PORT un daudzas citas. Lai iegūtu pilnu sarakstu, apskatieties uz savu phpinfo() izvada rezultātu, vai arī iedarbiniet šādu skriptu:

<?php
foreach($_SERVER as $key=>$val) {
    echo '$_SERVER['.$key."] = $val\n";
}
?>

$_ENV

Visi mainīgie, kas attiecas uz vidi (environment), kuri ir uzstādīti startējot jūsu web serveri, būs pieejami šajā masīvā.

$_FILES

Failu augšupielādei pēc RFC 1867 katram atsevišķajam failam atbilstošā informācija būs pieejama šajā masīvā. Piemēram, faila augšupielādes forma, kas satur:

<input name="userfile" type="file">

Pieņemsim, ka jūs augšupielādējat kādu savu bildi, $_FILES masīvs izskatīsies šādi:

$_FILES['userfile']['name'] => photo.png
$_FILES['userfile']['type'] => image/png
$_FILES['userfile']['tmp_name'] => /tmp/phpo3kdGt
$_FILES['userfile']['error'] => 0
$_FILES['userfile']['size'] => 158918

Ievērojiet, ka „error“ ir jauns lauks PHP versijām, kas jaunākas par 4.2.0 un tā vērtības ir:

  • 0 - kļūdu nav, fails tika augšupielādēts
  • 1 - augšupielādētais fails pārsniedz upload_max_filesize parametra vērtību php.ini failā
  • 2 - augšupielādētā faila izmērs pārsniedz MAX_FILE_SIZE parametru, kas norādīts HTML formā
  • 3 - baitu skaits, kas ir mazāks par norādīto augšupielādējamā faila izmēru
  • 4 - fails netika augšupielādēts

Sesijas

Sesijas tiek izmantotas, lai palīdzētu saglabāt mainīgo vērtības starp vairākām web lapām. Tas tiek paveikts, izveidojot unikālu sesijas identifikatoru, kas tiek sūtīts klienta pārlūkprogrammai. Vēlāk pārlūkprogramma sūta atpakaļ šo unikālo identifikatoru un pie katra lapas pieprasījuma PHP izmanto šo identifikatoru, lai nolasītu mainīgo vērtības, kas saistītas ar šo sesiju.

Sesijas idenfitikators tiek sūtīts uz priekšu un atpakaļ vai nu kā cookie vai arī caur pieprasījuma URL. Noklusētajā gadījumā PHP mēģina lietot cookies, taču ja pārlūkprogramma ir atslēgusi cookie atbalstu, PHP izmanto otro variantu un liek sesijas identifikatoru pieprasījuma URL. php.ini parametri, kas atbild par uzvedību šajos gadījumos ir:

session.use_cookies Kad šis ir ieslēgts, PHP mēģinās lietot cookies
session.use_trans_sid Kad šis ir ieslēgts, PHP pievienos identifikatoru pie pieprasījuma URL, ja cookies netiek lietotas

trans_sid kods PHP ir diezgan interesants. Tas patiešām caurstaigā visu HTML failu un labo katru saiti un formu, lai pievienotu unikālo sesijas identifikatoru. url_rewriter.tags parametrs failā php.ini var mainīt kā tiek nomainītas atsevišķu HTML iezīmju parametri.

Rakstīt skriptus, kas izmanto sesijas nepavisam nav sarežģīti. Jūs varat sākt sesiju lietošanu ar session_start(), tad piereģistrējiet mainīgos, kurus gribēsiet izmantot sesijā. Piemēram:

<?php
session_start( );
session_register('foo');
session_register('bar');
 
$foo = "Hello";
$bar = "World";
?>

Ja jūs ievietojat iepriekšējo piemēr failā ar nosaukumu page1.php un ielādējat to savā pārlūkprogrammā, tā aizsūta jums cookie un saglabā $foo un $bar vērtības uz servera. Ja pēc tam jūs ielādējat lapu page2.php ar šādu izejas tekstu:

<?php
session_start( );
echo "foo = " . $_SESSION['foo'] . "<br />";
echo "bar = " . $_SESSION['bar'] . "<br />";
?>

Jums būtu jāierauga $foo un $bar vērtības, kuras jūs uzstādījāt failā page1.php. Ievērojiet, ka $_SESSION masīvs ir superglobāls. Ja jums ir ieslēgts register_globals, jūs varētu piekļūt $foo un $bar vērtībām pa tiešo, neizmantojot masīvu.

Tāpat kā parastos mainīgos jūs sesijā varat saglabāt arī masīvus un objektus. Taču ievērojiet, ka šim jūsu objektam ir jābūt nodefinētam pirms jūs izsaucat session_start() funkciju.

Ļoti bieža kļūda, ko cilvēki pieļauj lietojot sesijas, ir tā, ka sesijas tiek lietotas par aizvietojumu aizsardzībai ar paroli vai dažkārt par papildinājumu šai aizsardzībai. Autorizējot lietotāju pirmo reizi, kad tas ienāk jūsu lapā un lietojot sesijas identifikatoru, lai šo lietotāju atpazītu visu viņa turpmāko darba sesiju var novest pie liela daudzuma ar problēmām. Kāpēc? Tāpēc, ka ir iespējams iegūt šo sesijas identifikatoru un uzdoties par citu lietotāju. Lūk daži piemēri:

  • Ja jūs nelietojat SSL savienojumu, sesijas identifikators var tikt nozagts (sniffed) ar speciālu programmu palīdzību, kas spēj saglabāt visas darbības, ko kāds/kādi dara tīklā
  • Ja jūsu sesijas identifikators nav pietiekoši sarežģīts, tas var tikt uzminēts
  • Ja jūs lietojat sesijas identifikatora saglabāšanu pieprasījuma URL, ļaundabīgi var tikt izmantoti proxy serveru žurnāla faili (log files).
  • Ja jūs lietojat sesijas identifikatora saglabāšanu pieprasījuma URL, šāda saite var tikt saglabāta grāmatzīmēs kādā publiski pieejamā datorā.

Likt lietot SSL savienojumu katrai lapai ir visdrošākais veids, kā izvairīties no šīs problēmas, taču tas liekas mazliet neatbilstoši. Patiesībā varētu pietikt arī ar to, ka jūs paturētu prātā šos četrus iepriekš uzskaitītos punktus, kad jūs būvējat web aplikācijas.

Piemēri

Vislabākais veids, kā sajust PHP spēku ir pārbaudīt to visu darībā. Šajā nodaļā tiks apskatīti daži PHP pielietojumi.

Lietotāja pārlūkprogrammas un IP adreses parādīšana

Te būs vienkārša lapa, kas izdrukās pārlūkprogrammas identifikatora tekstu un HTTP pieprasījuma IP adresi. Izveidojiet failu ar šādu saturu jūsu web dokumentu direktrojā un nosauciet to kaut vai par example.php, ielādējiet to jūsu pārlūkprogrammā:

<html>
    <head>
        <title>PHP Example</title>
    </head>
    <body>
        You are using <?php echo $_SERVER['HTTP_USER_AGENT'] ?> <br />
        and coming from <?php echo $_SERVER['REMOTE_ADDR'] ?>
    </body>
</html>

Jums būtu jāredz kaut kas līdzīgs šim:

You are using Mozilla/5.0 (X11; U; Linux i686; en-US;
rv:1.1b) Gecko/20020722
and coming from 127.0.0.1

Inteleģenta formu apstrāde

Šis būs mazliet sarežģītāks piemērs. Mēs izveidosim HTML formu, kas prasa lietotājam ievadīt vārdu un norādīt vienu vai vairākas intereses. Šim mērķim mēs varētu izmantot divus failus, kur vienā būtu mūsu forma datiem, bet otrā - šos datus apstrādājošais kods. Tā vietā apskatīsim piemēru, kurā viss notiek vienā failā:

<html>
    <head>
        <title>Form Example</title>
    </head>
    <body>
        <h1>Form Example</h1>
        <?php
        function show_form($first="", $last="", $interest="") {
            $options = array("Sports", "Business", "Travel", "Shopping", "Computers");
            if(!is_array($interest)) $interest = array( );
            ?>
            <form action="form.php" method="POST">
                First Name: <input type="text" name="first" value="<?php echo $first?>"/><br />
                Last Name: <input type="text" name="last" value="<?php echo $last?>"><br />
                Interests: <select multiple name="interest[ ]">
                    <?php
                        foreach($options as $option) {
                            echo "<option";
                            if(in_array($option, $interest)) {
                                echo " selected ";
                            }
                            echo "> $option</option>\n";
                        }
                        ?>
                </select><br />
                <input type=submit />
            </form>
        <?php } // end of show_form( ) function
 
        if($_SERVER['REQUEST_METHOD']!='POST') {
            show_form( );
        } else {
            if(empty($_POST['first']) ||
               empty($_POST['last'])  ||
               empty($_POST['interest'])) {
                echo "<p>You did not fill in all the fields,";
                echo "please try again</p>\n";
                show_form($_POST['first'],$_POST['last'], $_POST['interest']);
            } else {
                echo "<p>Thank you, $_POST[first] $_POST[last], you ";
                echo 'selected '.join(' and ', $_POST['interest']);
                echo " as your interests.</p>\n";
            }
        }
    ?>
    </body>
</html>

Te ir dažas lietas, kuras varētu uzmanīgāk izstudēt. Pirmkārt, mēs esam izolējuši attiecīgās formas parādīšanu ar PHP funkciju show_form(). Šī funkcija ir inteliģenta, jo prot paņemt katram formas elementam noklusēto vērtību kā neobligātu mainīgo. Ja lietotājs neaizpilda visus formas elementus, mēs izmantojam šo iespēju, lai atkārtoti parādītu formu ar tām vērtībām, ko lietotājs jau ir ievadījis. Tas nozīmē, ka lietotājam būs jāaizpilda tikai tie lauki, kurus viņš ir aizmirsis aizpildīt, kas ir daudz labāk, nekā likt viņam spiest Back pogu un no jauna aizpildīt visus laukus.

Ievērojiet, kā notiek pārslēgšanās turp un atpakaļ starp PHP un HTML kodu. Tieši pa vidu mūsu show_form() funkcijai mēs pārslēdzamies atpakaļ uz HTML kodu, lai izvairītos no neskaitāmām echo komandām, kas vienkārši izvada parastu HTML kodu. Tad, kad mums ir vajadzīgs PHP mainīgais, mēs uz laiku pārslēdzamies atpakaļ uz PHP kodu un vienkārši izdrukājam šo mainīgo.

Mēs esam iedevuši vairāku iespēju izvēles <select> elementam vārdu „interest[ ]“. [ ] pie vārda nozīmē, ka PHP šos datus uztvers kā automātiski indeksētu masīvu - PHP automātiski piešķirs katram elementam nākamo pēc kārtas ņemto indeksu, sākot ar 0 (pieņemot, ka masīvs ir tukšs).

Pēdējā lieta, kas jāievēro ir tas, kā mēs nosakām, kas ir jāparāda. Mēs pārbaudām vai SERVER mainīgais REQUEST_METHOD ir uzstādīts uz POST. Ja tas tā nav, tad mēs zinām, ka lietotājs formu vēl nav nosūtījis un mēs izsaucam show_form() funkciju bez jebkādiem argumentiem. Tiek parādīta tukša forma. Ja ir uzstādīts $first mainīgais, mēs pārliecināmies, ka $first un $last teksta lauki nav tukši un lietotājs ir izvēlējies vismaz vienu interesi.

Datubāzes integrācija ar web

Lai parādītu pilnīgu uz datubāzes balstītu programmu, mēs izveidosim nelielu web aplikāciju, kas ļaus cilvēkiem dot padomus un balsot, kā nosaukt viņu jauno bērnu. Šis piemērs izmanto MySQL (skatīt http://www.mysql.com) - ātru un vienkārši konfigurējamu datubāzu pārvaldības sistēmu.

Datubāzes shēma mūsu gadījumā izskatīsies šādi:

CREATE TABLE baby_names (
    name varchar(30) NOT NULL,
    votes int(4),
    PRIMARY KEY (name)
);

Tas ir MySQL vaicājuma formāts un var tikt izmantots, lai uzreiz izveidotu šo mums vajadzīgo tabulu. Tas vienkārši definē teksta lauku un veselo skaitļu lauku. Teksta lauks ir ieteiktais mazuļa vārds, bet veselo skaitļu lauks - par šo vārdu saņemto balsu skaits. Mēs veidosim vārda lauku par primāro atslēgu, kas nozīmē to, ka divi vienādi mazuļu vārdi datubāzē netiks atļauti, pēc vārda varēs identificēt jebkuru tabulas ierakstu.

Pirmkārt, mēs gribam, lai šī programma dara vairākas lietas. Pirmkārt, tai būtu jāveic kaut kāda nobalsojušo cilvēku pārbaude, lai kāds tā vienkārši nevarētu nobalsot neskaitāmas reizes pēc kārtas. Mēs to darīsim izmantojot cookie. Otrkārt, mēs vēlamies parādīt primitīvu grafiku, kas parādīs, cik kurš vārds ir saņēmis balsis. Šis grafiks tiks veidots izmantojot vienu 1×1 pikseli lielu GIF bildīti un izvēršot to vajadzīgajā lielumā ar HTML līdzekļiem. Ja būtu vēlme, mēs varētu izmantot arī PHP iebūvētos līdzekļus, lai izveidotu izskatīgāku grafiku. Taču tas šoreiz būtu jau par daudz.

Viss pārējais ir vienkārši formu un datubāzes sadarbības aprakstīšana. Mes varam izmantot arī dažas lietas. Piemēram, tā vietā, lai lasītu visus ierakstus no datubāzes un saskaitītu kopējo balsu skaitu (tas mums ir nepieciešams procentu iegūšanai), mēs paprasīsim to MySQL ar iebūvētās funkcijas sum() palīdzību. Koda gabals, kas parāda visus vārdus un attiecīgo balsu skaitu un procentuālo sadalījumu izskatās mazliet neglīts, taču jums būtu jāvar izsekot tam līdzi. Mēs vienkārši sūtām korektas HTML tabulas iezīmes pirms un pēc tam, kad esam savākuši datus no datubāzes.

Lūk arī pilnais piemērs:

<?php
if($vote && !$already_voted)
    SetCookie('already_voted',1);
?>
<html>
    <head>
        <title>Name the Baby</title>
    </head>
<body>
    <h3>Name the Baby</h3>
    <form action="baby.php" method="POST">
        <p>Suggestion: <input type="text" name="new_name"/></p>
        <p><input type="submit" value="Submit idea and/or vote"/></p>
        <?php
        mysql_pconnect("localhost","","");
        $db = "test";
        $table = "baby_names";
 
    if($new_name) {
        if(!mysql_db_query($db, "insert into $table values ('$new_name',0)")) {
            echo mysql_errno( ).': ' . mysql_error( )."<br />\n";
        }
    }
 
    if ($vote && $already_voted) {
        echo '<p><b>Hey, you voted already ';
        echo "Vote ignored.</b></p>\n";
    } else if ($vote) {
        if(!mysql_db_query($db, "update $table set votes=votes+1 where name='$vote'")) {
            echo mysql_errno( ).': '. mysql_error( )."<br />\n";
        }
    }
    $result=mysql_db_query($db, "select sum(votes) as sum from $table");
    if($result) {
        $sum = (int) mysql_result($result,0,"sum");
        mysql_free_result($result);
    }
 
    $result=mysql_db_query($db,"select * from $table order by votes DESC");
    echo <<<EOD
    <table border="0">
    <tr>
        <th>Vote</th>
        <th>Idea</th><th colspan="2">Votes</th>
    </tr>
    EOD;
    while($row=mysql_fetch_row($result)) {
        echo <<<FOO
        <tr>
            <td align="center">
            <input type="radio" name="vote" value="$row[0]"/></td>
            <td>$row[0]</td>
            <td align="right">$row[1]</td>
            <td>
            FOO;
        if($sum && (int)$row[1]) {
            $per = (int)(100 * $row[1]/$sum);
            echo '<img src="bline.gif" height=12 ';
            echo "width=$per> $per %</td>";
        }
        echo "</tr>\n";
    }
    echo "</table>\n";
    mysql_free_result($result);
    ?>
    <input type="submit" value="Submit idea and/or vote" />
    <input type="reset" />
    </form>
</body>
</html>

Noslēgums

Šajā grāmatā ir atspoguļotas tikai pašas pamata lietas par PHP programmēšanas valodu un tās pielietojumu. Ja jums ir nepieciešama papildus informācija, vai rodas kādi jautājumi, varat meklēt palīdzību dažādās interneta lapās. Vislabāk būtu vispirms pašam pārmeklēt PHP oficiālo dokumentāciju, kura pagaidām diemžēl nav pieejama latviešu valodā (http://lv.php.net). Tāpat iespējams izmantot Google vai kādu citu meklētājserveri (http://www.google.lv). Ja neizdodas atbildi uz savu jautājumu atrast šajās lapās, varat mēģināt uzdot savu jautājumu http://www.php.lv/f vai hackers forumā. Tāpat iespējams uzdot savu jautājumu Web vai Prog e-pasta listēs: http://lists.delfi.lv.

 
php_programmetaja_rokasgramata.txt · Labota: 2009/02/19 17:46 , labojis andrisp
 
Ja nav norādīts citādi, viki saturs pieejams ar šādas licenzes noteikumiem:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki