PHP kļūdu labošana
Posted on March 3rd, 2007 in No Comments »
Kādu brīdi programmējuši un iedarbinājuši savu skriptu mēs nonākam pie secinājuma, ka skripts nedarbojas, parādās tikai šāda kļūda:
Parse error: parse error, unexpected T_ECHO, expecting ',' or ';' in /xx/xx/xx/2.php on line 5
Pieņemsim, ka mūsu rakstītais kods šajā gadījumā izskatīsies šādi:
<?php echo 'This is some code<br />'; echo 'Somewhere in here I've got a '; echo 'parse error!<br />' echo 'But where is it?<br />'; ?>
Tas, ko jūs redzat šajā gadījumā tiek saukts par sintakses kļūdu. Iesācējiem šis ir viens no visizplatītākajiem kļūdu veidiem. Līdzko jūs iegūstat pieredzi, šo kļūdu skaits strauji samazinās, to izķeršana prasa aizvien mazāk laika. Īsāk izsakoties, ir pavisam četri dažādi PHP kļūdu veidi, kurus jūs sastapsiet programmējot PHP.
Sintakses kļūdas
Gluži kā iepriekš apskatītajā piemērā, sintakses kļūdas parādās, kad jūs pārkāpjat PHP noteikto pierakstu jeb sintaksi. PHP parasti šīs kļūdas uzrādīs kā ‘Parse error’ kļūdas.
Iepriekšējā piemērā kļūda patiesībā ir ceturtajā rindiņā, nevis piektajā – ir aizmirsts semikols ceturtās rindiņas beigās. Tā kā PHP ļauj komandas sadalīt pa vairākām rindiņām, tad PHP kļūdu pamanīja tikai 5. rindiņā, ieraugot nākamo echo komandu. Secinājums, kurš būtu šobrīd jāizdara – kļūda ne vienmēr atrodas tajā rindiņā, uz kuru norāda PHP tā var būt arī iepriekšējā, vai pat vēl kādā citā rindiņā atpakaļ. Tāpēc ir vērts pie kļūdu meklēšanas pārskatīt ne tikai PHP norādīto rindiņu, bet arī iepriekšējās.
Sintakses kļūdas var kļūt diezgan mulsinošas lielu if-else vai while bloku gadījumā, kad jums ir aizmirsies aizvērt kādas iekavas vai figūriekavas. Vēl jo grūtāk ir atrast šādas kļūdas, ja jūs nepārtraukti pārslēdzaties starp PHP un HTML. Taču ar laiku jums ir cerības iegūt zināmu pieredzi un apgūt koda atdalīšanu no izskata, klašu izmantošanu, kā arī iemācīties padarīt savu kodu lasāmu. Tieši šīs lietas ir tās, kuras palīdz vieglāk izķert sintakses kļūdas.
Interesanta lieta ir PHP iezīmju lietošana. Iepriekšējā kļūdas ziņojumā, PHP sūdzējās par ‘unexpected T_ECHO’. T_ECHO ir iezīme, kas attēlo echo komandu jūsu PHP skriptā. PHP interpretators sadala jūsu kodu pa iezīimēm, lai varētu analizēt un apstrādāt skriptu. Dažas no iezīmēm, kuras jūs ieraudzīsiet būs mazāk precīzas, kā citas, tāpēc, ja jūs neesat pārliecināts par to, ko PHP jums cenšas pateikt, ir vērts ielūkoties iezīmju dokumentācijā.
Ja jūs lietojat PHP 4.3.0, jūs atradīsiet, ka tas lieto tā saukto ‘tokenizer extension’ (iezīmētāja paplašinājums), kas ļauj jums apskatīties, kā PHP interpretators redz jūsu skriptu. Neliels piemērs tam, kā jūs varētu apskatīties iezīmētāja izvadu:
<?php /* Note: This script will only work with PHP 4.3.0 or later */ // Read a PHP script as a string $script = file_get_contents('2.php'); // Fetch the tokens into an array $tokens = token_get_all($script); // Display echo '<pre>'; print_r($tokens); echo '</pre>'; ?>
Semantikas kļūdas
Semantikas kļūdas ir tādas kļūdas, kuras pakļaujas PHP noteiktajiem rakstības principiem (sintaksei), taču parādās pie programmas darbināšanas. Piemēram, foreach komanda pieņem, ka jūs tai padodat masīvu:
<?php $variable = 'This is not an array'; foreach ($variable as $key => $value) { echo $key . ' : ' . $value; } ?>
Tā kā $variable nav masīvs, tad skripts izveido aptuveni šādu kļūdas ziņojumu:
Warning: Invalid argument supplied for foreach() in /xx/xx/xx/3.php on line 4
Semantikas kļūdas parasti tiek parādītas kā ‘Warning error message’ jeb brīdinoša rakstura kļūdu paziņojums.
Vides kļūdas
Vides kļūdas parādās gadījumos, kad problēma rodas no PHP skripta ārējā vidē. Piemēram, MySQL serveris pieprasījuma brīdī ir izslēgts. Vai arī jūs neesat norādījis pareizu ceļu uz failu, kuru jūs vēlaties atvērt, līdz ar to PHP to nevar atrast.
Šādas kļūdas parādās arī gadījumos, kad notiek PHP skriptu pārcelšana no vienas sistēmas uz citu, ne vienmēr uz abām sistēmām ir viena vide. Ļoti bieži ir gadījumi, kad izstrādātāji programmē uz savām Windows darbstacijām, bet skriptu beigu variantus liek uz Linux / FreeBSD tipa serveriem. Bieži vien problēma ir tikai direktoriju struktūrā vai domēna vārdā. Šādos gadījumos parasti tiek veidoti centrālie konfigurācijas skripti, kas satur visus šos vides mainīgos.
PHP ir arī virkne ar uzstādījumiem konfigurācijas failā php.ini, kuri var likt skriptam neizpildīties uz citas sistēmas.
Loģikas kļūdas
Loģikas kļūdas ir kļūdas, kuras nekādā veidā nevar noķert ar PHP līdzekļiem, jo uzrakstītais programmas kods ir pilnīgi atbilstošss visiem programmēšanas un arī PHP sintakses likumiem. Taču programma dara nevis to, ko jūs vēlaties, bet to, ko jūs esat uzrakstījis, lai tā dara, respektīvi – kaut ko citu. Piemēram, jums ir forums, kuram esat uzrakstījis nelielu uzlabojumu, kas izsūta e-pastus dažiem foruma biedriem. Par nelaimi esat pieļāvis dažas loģikas kļūdas un skripts izsūta e-pastus nevis dažiem biedriem, bet visiem, turklāt to izdara 20 reizes.
Šāda tipa problēmas atklāt ir visgrūtāk. Tiem, kas lieto Windows XP šī situācija būs pazīstama – paskaitiet, cik daudz kļūdu labojumi nāk no Microsoft. Tas nozīmē tikai to, ka neviens nav pasargāts no šādām kļūdām – arī lielas firmas ar milzīgām investīcijām programmu testēšanā.
Lai varētu veiksmīgi atklāt šīs loģikas kļūdas, ir jāizdara ļoti stingra un precīza testēšana uz atsevišķa web servera, kurš testēšanas laikā netiek nodarbināts no citu lietotāju puses. Par laimi, PHP un līdzīgas tehnoloģijas (Apače, MySQL) ir darbināmas uz vairākām platformām, kas atļauj tās savienot kopā un vienkārši izveidot efektīvu izstrādes vidi, neskatoties uz to, ka operētājsistēmas ir dažādas.
Ir vērts arī izpētīt vienībtestēšanu, kas labāk būs pazīstama Ekstrēmās programmēšanas cienītājiem.