PHP parse/sintakses kļūdas; un kā tās novērst?
Ikvienam rodas sintakses kļūdas. Pat pieredzējuši programmētāji pieļauj pārrakstīšanās kļūdas. Jaunpienācējiem tā ir tikai daļa no mācīšanās procesa. Tomēr bieži vien ir viegli interpretēt kļūdu ziņojumus, piemēram:
PHP sintakses kļūda: sintakses kļūda, negaidīta '{' in index.php on line 20. Negaidītais simbols ne vienmēr ir īstais vaininieks. Taču rindas numurs sniedz aptuvenu priekšstatu par to, kur sākt meklēšanu. Vienmēr aplūkojiet koda kontekstu. Sintakses kļūda bieži vien slēpjas minētajā vai priekšējās koda rindās. Salīdziniet savu kodu ar sintakses piemēriem rokasgrāmatā. Lai gan ne katrs gadījums atbilst otram. Tomēr ir daži vispārīgi soļi, kā atrisināt sintakses kļūdas. Šajā atsaucē ir apkopotas biežāk sastopamās kļūdas:
- Negaidīts T_STRING.
- Negaidīts T_VARIABLE
Negaidīts '$vārds' (T_VARIABLE).- Unexpected T_CONSTANT_ENCAPSED_STRING
Unexpected T_ENCAPSED_AND_WHITESPACE- Negaidīts $end
- Negaidīts T_FUNCTION...
- Negaidīts
{{
Negaidīts}}
Negaidīts(
Negaidīts)
- Negaidīts
[
[<br>Negaidīts
]`]- Neparedzēts T_IF
Neparedzēts T_FOREACH
Neparedzēts T_FOR
Neparedzēts T_WHILE
Neparedzēts T_DO
Neparedzēts T_PRINT
Neparedzēts T_ECHO- Negaidīts T_LNUMBER
- Negaidīts ?
- Negaidīts turpinājums (T_CONTINUE)
Negaidīts turpinājums (T_BREAK)
Negaidīts turpinājums (T_RETURN)- Unexpected '='
- Negaidīts T_INLINE_HTML...
- Neparedzēts T_PAAMAYIM_NEKUDOTAYIM...
- Neparedzēts T_OBJECT_OPERATOR...
- Negaidīts T_DOUBLE_ARROW...
- Negaidīts T_SL...
- Negaidīts T_BOOLEAN_OR...
Negaidīts T_BOOLEAN_AND...- Negaidīts T_IS_EQUAL
Negaidīts T_IS_GREATER_OR_EQUAL
Negaidīts T_IS_IDENTISKAI
Negaidīts T_IS_NOT_EQUAL
Negaidīts T_IS_NOT_IDENTICAL
Negaidīts T_IS_SMALLER_OR_EQUAL
Negaidīts<
Negaidīts>
- Negaidīts T_NS_SEPARATOR...
- Ievadā neparedzēts raksturs: '
\
' (ASCII=92) state=1- Neparedzēts 'public' (T_PUBLIC)
Neparedzēts 'private' (T_PRIVATE)
Neparedzēts 'protected' (T_PROTECTED)
Neparedzēts 'final' (T_FINAL)...- Negaidīts T_STATIC...
- Negaidīts T_CLASS...
- Negaidīts T_DNUMBER
- Negaidīts
,
(komats)- neparedzēts
.
(punkts)- neparedzēts
;
(semikols)- Negaidīts
*
(zvaigznīte)- neparedzēts
:
(divkājis) Ciešāk saistītas atsauces:- Ko šī kļūda nozīmē PHP? (izpildes laika kļūdas).
- Parse error: sintakses kļūda, negaidīts T_XXX
- Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE
- Parse error: syntax error, unexpected T_VARIABLE
- Ko šis simbols nozīmē PHP? (valodas žetoni)
- Šīs
""
gudrās''
pēdiņas PHP neko nenozīmē Un:
- PHP rokasgrāmata vietnē php.net un tās dažādie valodas žetoni.
- Vai Vikipēdijas sintakses ievads par PHP.
- Un visbeidzot, protams, mūsu php tag-wiki. Lai gan Stack Overflow ir laipni gaidīti arī iesācēji programmētāji, tā galvenokārt ir orientēta uz profesionāliem programmēšanas jautājumiem.
- Atbildes uz ikviena lietotāja kodēšanas kļūdām un šaurām pārrakstīšanās kļūdām lielākoties tiek uzskatītas par ārpus tēmas.
- Tāpēc, lūdzu, veltiet laiku, lai izpildītu [pamata soļus] (https://stackoverflow.com/a/18050072), pirms rakstīt sintakses labošanas pieprasījumus.
Ja jums tas tomēr ir jādara, lūdzu, parādiet savu risināšanas iniciatīvu, labojumu mēģinājumus un savu domāšanas procesu par to, kas izskatās vai varētu būt nepareizi. Ja jūsu pārlūka rāda kļūdu ziņojumus, piemēram, "SyntaxError: illegal character", tad tas patiesībā nav saistīts ar [tag:php]-, bet gan ar [tag:javascript]-sintakses kļūdu.
Sintakses kļūdas, kas radušās piegādātāja kodā: Visbeidzot, ja sintakses kļūda nav radusies, rediģējot jūsu kodu bāzi, bet gan pēc ārējās piegādātāja pakotnes instalēšanas vai atjaunināšanas, tā varētu būt saistīta ar PHP versijas nesavietojamību, tāpēc pārbaudiet piegādātāja prasības un savas platformas iestatījumus.
Kādas ir sintakses kļūdas?
PHP pieder C stila un imperatīvo programmēšanas valodām. Tai ir stingri gramatikas noteikumi, no kuriem tā nevar atgūties, sastopoties ar nepareizi izvietotiem simboliem vai identifikatoriem. Tā nevar uzminēt jūsu kodēšanas nodomus.
Svarīgākie padomi
Ir daži pamata piesardzības pasākumi, kurus vienmēr varat veikt:
Lietojiet pareizu koda atkāpi vai pieņemiet kādu cildenu kodēšanas stilu. Lasāmība novērš pārkāpumus.
Izmantojiet IDE vai PHP redaktoru ar sintakses izcelšanu. Tas palīdz arī ar iekavām/uzkavju līdzsvarošanu.
Izlasiet valodas atsauces un piemērus rokasgrāmatā. Divas reizes, lai kļūtu nedaudz lietpratējs.
Kā interpretēt analizatora kļūdas
Tipisks sintakses kļūdas ziņojums skan šādi:
Atveriet minēto avota failu. Aplūkojiet minēto koda rindu.
Regulārāk jums jāskatās arī uz priekšējām rindiņām.
;
semikolu punkti trūkst iepriekšējo rindu galos/izteikumos. (Vismaz no stilistiskā viedokļa. ){{
koda bloki}
ir nepareizi slēgti vai ielikti, iespējams, ka jums būs nepieciešams izpētīt vēl dziļāk avota kodā. Izmantojiet pareizu koda atkāpi, lai to vienkāršotu.Aplūkojiet sintakses krāsojumu!
+-*/.
vajadzētu būt atšķirīgi iekrāsotiem. Pretējā gadījumā tie var atrasties nepareizā kontekstā."
vai'
virknes marķieris.++
,--
vai iekavās, kas seko operatoram. Divas virknes/identifikatori, kas atrodas tieši viens aiz otra, vairumā gadījumu ir nepareizi.Belta atstarpe ir jūsu draugs. Ievērojiet vienu kodēšanas stilu.
Uz laiku sadaliet garas rindas.
if
paziņojumus atsevišķos vai ievietotosif
nosacījumos.Garu koda bloku sadalīšana pa daļām reāli palīdz atrast sintakses kļūdu izcelsmi.
Komentējiet kļūdaino kodu.
Ja esat iesācējs, izvairieties no dažām mulsinošām sintakses konstrukcijām.
? :
nosacījumu operators var sablīvēt kodu un ir patiešām noderīgs. Taču ne visos gadījumos tas palīdz lasāmībai. Dodiet priekšroku vienkāršiemif
izteikumiem, kamēr tie ir nepārvērsti.if:
/elseif:
/endif;
) ir izplatīta šabloniem, bet, iespējams, ir mazāk saprotama nekā parastie{
kods}
bloki.Visbiežāk sastopamās kļūdas jaunpienācējiem ir šādas:
;
izteikumu/rindu pabeigšanai."
vai'
un neizceltas pēdiņas..
apvienošanai.(``nosaites iekavās
)`. Saskaitiet tos ziņotajā rindā. Vai to ir vienāds skaits?Neaizmirstiet, ka vienas sintakses problēmas atrisināšana var atklāt nākamo.
Atjaunojiet iepriekš darbojošā koda rezerves kopiju, ja nevarat to novērst.
diff
. Tas var būt pamācošs, lai noskaidrotu, kāda ir sintakses problēma.Neredzamas klaiņojošas Unicode zīmes: Dažos gadījumos ir nepieciešams izmantot hexeditoru vai citu redaktoru/skatītāju savam avotam. Dažas problēmas nevar atrast, vienkārši apskatot jūsu kodu.
grep --color -P -n "\[\x80-\xFF\]" file.php
kā pirmo līdzekli, lai atrastu simbolus, kas nav ASCII.Pievērsiet uzmanību tam, kāda tipa rindu lauzumi tiek saglabāti failos.
//
vai#
komentāri. Daudzrindu/*...*/
komentāri reti traucē analizētājam, ja tiek ignorēti rindu pārrāvumi.Ja jūsu sintakses kļūda netiek pārraidīta tīmeklī: gadās, ka jūsu datorā ir sintakses kļūda. Taču, publicējot to pašu failu tiešsaistē, tā vairs netiek konstatēta. Tas var nozīmēt tikai vienu no divām lietām:
Pārbaudiet savu PHP versiju. Ne visas sintakses konstrukcijas ir pieejamas visos serveros.
php -v
komandrindas interpretatoram<?php phpinfo();
, ja tas tiek izsaukts caur tīmekļa serveri.Tie ne vienmēr ir vienādi. Jo īpaši, strādājot ar karkasiem, jums tie būs jāsaskaņo.
Neizmantojiet PHP'rezervētos atslēgvārdus kā funkciju/metožu, klašu vai konstantu identifikatorus.
Izmēģinājumu un kļūdu metode ir pēdējais līdzeklis. Ja viss pārējais neizdodas, vienmēr varat gūglēt savu kļūdas ziņojumu. Sintakses simbolus nav tik viegli meklēt (tomēr pats Stack Overflow tiek indeksēts ar SymbolHound). Tāpēc var nākties pārlūkot vēl dažas lapas, pirms atradīsiet kaut ko atbilstošu. Papildu norādījumi:
PHP atkļūdošanas pamati, autors: David Sklar
PHP kļūdu labošana - Jason McCreary
PHP kļūdas - 10 biežāk pieļautās kļūdas - Mario Lurig
Biežāk sastopamās PHP kļūdas un to risinājumi
Kā novērst problēmas un salabot savu WordPress tīmekļa vietni
PHP kļūdu ziņojumu ceļvedis dizaineriem - Smashing Magazine
Baltais nāves ekrāns
Ja jūsu tīmekļa vietne ir tukša, parasti iemesls ir sintakses kļūda. Atļaujiet to parādīšanu ar:
error_reporting = E_ALL
display_errors = 1
Jūsuphp.ini
parasti vai izmantojot.htaccess
mod_php, vai pat.user.ini
ar FastCGI iestatījumiem. Ieslēgt to bojātā skripta ietvaros ir par vēlu, jo PHP nevar interpretēt/izpildīt pat pirmo rindu. Ātrs risinājums ir izveidot ietinamo skriptu, piemēram,test.php
:Pēc tam izsauciet kļūdaino kodu, piekļūstot šim ietinošajam skripturam. Palīdz arī ieslēgt PHP
error_log
un ieskatīties savā webserver'serror.log
, kad skripts sabrūk ar HTTP 500 atbildēm.Negaidīts T_VARIABLE
"negaidīts
T_VARIABLE
" nozīmē, ka ir burtiskais$mainīgais
nosaukums, kas neatbilst pašreizējai izteiksmes/izteikuma struktūrai.Trūkst semikola
Tas visbiežāk norāda uz iztrūkstošu semikolu iepriekšējā rindā. Mainīgo piešķīrumi, kas seko pēc apgalvojuma, ir labs rādītājs, kur meklēt:
Virknes savienošana
Bieži sastopama kļūda ir virknes konkatenācija ar aizmirstu
.
operatoru:Btw, jums vajadzētu dot priekšroku virknes interpolācijai (pamata mainīgie dubultās pēdiņās), kad vien tas palīdz lasāmībai. Tas ļauj izvairīties no šīm sintakses problēmām.
Trūkst izteiksmes operatoru
Protams, tāda pati problēma var rasties arī citās izteiksmēs, piemēram, aritmētiskajās operācijās:
PHP šeit nevar uzminēt, vai mainīgo vajadzēja saskaitīt, atņemt vai salīdzināt utt.
Saraksti
Tas pats attiecas uz sintakses sarakstiem, piemēram, masīvu populācijās, kur analizators norāda arī uz paredzamo komatu
,
, piemēram:Vai funkciju parametru saraksti:
Līdzīgi to var redzēt ar
list
vaiglobal
izteikumiem, vai jafor
cilpā trūkst;
semikola.Klases deklarācijas
Šī analizatora kļūda rodas arī klases deklarācijās. Varat piešķirt tikai statiskas konstantes, nevis izteiksmes. Tādējādi parseris sūdzas par mainīgajiem kā piešķirtiem datiem:
Īpaši šeit var izraisīt nesaskaņoti
}
aizverošie loka iekavās. Ja metode tiek pārlieku agri pabeigta (lietojiet pareizu atkāpi!), tad klaiņojošais mainīgais parasti tiek nepareizi ievietots klases deklarācijas ķermenī.Mainīgie pēc identifikatoriem
Nekādā gadījumā nedrīkst arī mainīgo pēc identifikatora likt tieši aiz identifikatora:
Btw, šis ir biežs piemērs, kurā, iespējams, bija paredzēts izmantot mainīgais mainīgais. Šajā gadījumā mainīgo īpašību meklēšana ar
$this->{"myFunc$VAR"}();
, piemēram.Trūkst parensu pēc valodas konstrukcijām
Pārsteidzīga rakstīšana var novest pie tā, ka tiek aizmirsti sākuma iekavās iekavās.
if
unfor
unforeach
paziņojumiem:Risinājums: pievienojiet trūkstošo sākuma
(
starp izteikumu un mainīgo.Else nesagaida nosacījumus
Risinājums: Noņemiet nosacījumus no
else
vai izmantojietelseif
.Nepieciešamas iekavās slēgšanai
Risinājums: Pievienojiet iekavās ap
$var
.Neredzams baltais laukums
Kā minēts atsauces atbildē par "Invisible stray Unicode" (piemēram, non-breaking space), šo kļūdu var redzēt arī šādos gadījumos:
Tas ir diezgan izplatīts failu sākumā un kopētajā un ielīmētajā kodā. Pārbaudiet ar hekseditoru, vai jūsu kods vizuāli neizskatās pēc sintakses problēmas.
Skatīt arī
Negaidīts T_STRING
T_STRING
ir mazliet nepareizs nosaukums. Tas neattiecas uz citātu"string"
. Tas nozīmē, ka ir sastapts neapstrādāts identifikators. Tas var būt ganbrīvs
vārds, ganCONSTANT
vai funkciju nosaukumi, gan aizmirstas necitētas virknes, gan jebkurš vienkāršs teksts.Nepareizi citētas virknes
Tomēr šī sintakses kļūda visbiežāk sastopama nepareizi citētām virknes vērtībām. Jebkurš neierakstīts un apmaldījies `"` vai `'` citāts veido nederīgu izteiksmi: ⇓ ⇓ echo "noklikšķiniet šeit"; Sintakses izcelšana šādas kļūdas padarīs ļoti acīmredzamas. Svarīgi ir atcerēties, ka dubultiekavīšu vai vienkāršo pēdiņu izkļūšanai ir jāizmanto atpakaļsvītras - atkarībā no tā, kura no tām tika izmantota kā [virknes norobežojums][1]. - Ērtības labad, izvadot vienkāršu HTML ar dubultajām pēdiņām iekšpusē, dodiet priekšroku ārējām vienpēdiņām. - Ja vēlaties interpolēt mainīgos lielumus, izmantojiet virknes ar dubultajām pēdiņām, bet tad jāuzmanās no burtisko `"` dubultiekavīšu izvadīšanas. - Garākām izvadām dodiet priekšroku vairākām `echo`/`print` rindiņām, nevis izkļūšanai no ievades un izvades. Vēl labāk apsveriet [HEREDOC][2] sadaļu. Skatīt arī *https://stackoverflow.com/questions/3446216/what-is-the-difference-between-single-quoted-and-double-quoted-strings-in-php*.Neaizvērtas virknes
Ja [izlaižat aizvēršanas `"`][3], tad sintakses kļūda parasti parādās vēlāk. Neaizvērtā virkne bieži vien patērē mazliet koda līdz nākamajai paredzētajai virknes vērtībai: ⇓ echo "Kāds teksts", $a_mainīgais, "un kāda aizbēgusi virkne ; success("finished"); ⇯ Tas'nav tikai burtiskais `T_STRING`s, pret kuru analizators var protestēt. Vēl viens bieži sastopams variants ir [`Neparedzēts '>'`](https://stackoverflow.com/questions/6507796/troubleshooting-parse-error-unexpected-error), ja nav citēts burtiskais HTML.Neprogrammētas virknes pēdiņas
Ja *kopējat un ielīmējat* kodu no bloga vai tīmekļa vietnes, dažkārt tiek iegūts nederīgs kods. [Tipogrāfiskās pēdiņas nav][4] tas, ko PHP sagaida: $text = 'Kaut kas kaut kas..' + "these ain't quotes"; Tipogrāfiskās/izprotamās pēdiņas ir Unicode simboli. PHP tās uzskata par daļu no blakus esošā burtciparu teksta. Piemēram, `"šie` tiek interpretēts kā konstantas identifikators. Bet jebkuru nākamo teksta literālu analizators uzskata par tukšu vārdu/T_STRING.Trūkst semikolu; atkal
Ja iepriekšējās rindiņās ir izteiksme bez semikola, tad jebkurš nākamais izteikums vai valodas konstrukcija tiek uztverta kā neapstrādāts identifikators: ⇓ func1() function2(); PHP vienkārši nevar zināt, vai jūs gribējāt palaist divas funkcijas vienu pēc otras, vai arī gribējāt to rezultātus reizināt, saskaitīt, salīdzināt vai palaist tikai vienu `|||` vai otru.Īsās atvērtās birkas un
Tas ir diezgan neparasts gadījums. Bet, ja ir iespējotas short_open_tags, tad jūs nevarat sākt savus PHP skriptus [ar XML deklarāciju][5]: ⇓ <?xml version="1.0"?> PHP redzēs `<?` un atgūs to sev. Tas nesapratīs, kam bija domāts šis `xml`. Tas tiks interpretēts kā konstanta. Bet `versija` tiks uzskatīta par citu literālu/konstantu. Un tā kā analizators nevar saprast divus secīgus literālus/vērtības bez izteiksmes operatora starp tiem, tas būs analizatora kļūda.<?xml
galvenes PHP skriptosNeredzamas Unicode zīmes
Sintakses kļūdu visbriesmīgākais cēlonis ir Unicode simboli, piemēram,[6][6][6][7][8][9][9][10][11][12][13][14][14]. PHP atļauj izmantot Unicode simbolus kā identifikatoru nosaukumus. Ja saņemat T_STRING analizatora sūdzību par pilnīgi neiedomājamu kodu, piemēram: <?php print 123; Jums ir jāizmanto cits teksta redaktors. Vai pat hekseditoru. Tas, kas šeit izskatās kā vienkāršas atstarpes un jaunas rindiņas, var saturēt neredzamas konstantes. Uz Java bāzētās IDE dažkārt neņem vērā UTF-8 BOM, kas ir sajaukts iekšpusē, nulles platuma atstarpes, rindkopas atdalītājus u. tml. Mēģiniet visu rediģēt no jauna, noņemt baltās atstarpes un atkal pievienot normālas atstarpes. To var sašaurināt, pievienojot liekus `;` paziņojumu atdalītājus katras rindas sākumā: <?php ;print 123; Papildu `;` semikols šeit pārveidos iepriekšējo neredzamo rakstzīmi par nenoteiktu konstantas atsauci (izteiksme kā paziņojums). Tas savukārt liek PHP radīt noderīgu paziņojumu.Trūkst `$` zīmes mainīgo nosaukumu priekšā
[Mainīgie PHP][7] tiek attēloti ar dolāra zīmi, kurai seko mainīgā vārds. Dolāra zīme (`$`) ir [zīme][8], kas apzīmē identifikatoru kā mainīgā nosaukumu. Bez šīs zīmes identifikators varētu būt [valodas atslēgvārds][9] vai [konstante][10]. Šī ir bieži sastopama kļūda, ja PHP kods ir ["tulkots" no citas valodas][11] (C, Java, JavaScript utt.). Šādos gadījumos mainīgā tipa deklarācija (ja oriģinālais kods rakstīts valodā, kas izmanto tipizētus mainīgos) arī var izkļūt un radīt šo kļūdu.Izbēgušas pēdiņas
Ja rindā lietojat `\`, tam ir īpaša nozīme. To sauc par "[Escape Character][12]", un parasti tas liek analizatoram nākamo rakstzīmi uztvert burtiski. Piemērs: `echo 'Jim said \'Hello\''';` izdrukās `Jim said 'hello'`. Ja izvairīsieties no virknes noslēdzošās pēdiņas, tā tiks uztverta burtiski, nevis tā, kā paredzēts, t. i., kā drukājamā pēdiņa, kas ir virknes daļa, nevis aizver virkni. Tas parādīsies kā analizēšanas kļūda parasti pēc nākamās virknes atvēršanas vai skripta beigās. Ļoti bieži sastopama kļūda, norādot ceļus Windows: `"C:\xampp\htdocs\"` ir nepareizi. Jums ir nepieciešams `"C:\\xampp\\\htdocs\\"`.