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.
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.
Ir daži pamata piesardzības pasākumi, kurus vienmēr varat veikt:
Tipisks sintakses kļūdas ziņojums skan šādi:
Parsēšanas kļūda: sintakses kļūda, negaidīts T_STRING, gaidīts '
;
' in file.php on line 217. Tajā ir norādīta iespējamā sintakses kļūdas vieta. Skatiet minēto faila nosaukumu un rinķes numuru. Monikers, piemēram,T_STRING
, paskaidro, kuru simbolu analizators/tokenizators nevarēja apstrādāt. Tomēr tas nav obligāti sintakses kļūdas cēlonis. Svarīgi ir aplūkot arī priekšējās koda rindas. Bieži vien sintakses kļūdas ir tikai neveiksmes, kas notikušas agrāk. Kļūdas rindas numurs ir tikai vieta, kur analizators galīgi atteicās apstrādāt visu.Sintakses kļūdu risināšana
Ir daudzas pieejas, kā sašaurināt un novērst sintakses ķibeles.
;
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.+-*/.
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.if
paziņojumus atsevišķos vai ievietotos if
nosacījumos.? :
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šiem if
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.;
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?diff
. Tas var būt pamācošs, lai noskaidrotu, kāda ir sintakses problēma.
grep --color -P -n "\[\x80-\xFF\]" file.php
kā pirmo līdzekli, lai atrastu simbolus, kas nav ASCII.//
vai #
komentāri. Daudzrindu /*...*/
komentāri reti traucē analizētājam, ja tiek ignorēti rindu pārrāvumi.php -v
komandrindas interpretatoram<?php phpinfo();
, ja tas tiek izsaukts caur tīmekļa serveri.
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ūsu php.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
:<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.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's error.log
, kad skripts sabrūk ar HTTP 500 atbildēm.
"negaidīts T_VARIABLE
" nozīmē, ka ir burtiskais $mainīgais
nosaukums, kas neatbilst pašreizējai izteiksmes/izteikuma struktūrai.
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:
⇓
func1()
$var = 1 + 2; # analizēšanas kļūda +2 rindā
Bieži sastopama kļūda ir virknes konkatenācija ar aizmirstu .
operatoru:
⇓
print "Šeit ir vērtība: " $vērtība;
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.
Stīgu interpolācija ir skriptu valodas pamatīpašība. Nav kauns to izmantot. Ignorējiet jebkādus mikrooptimizācijas padomus par to, ka mainīgo
.
apvienošana ir ātrāka. Tā tā nav.
Protams, tāda pati problēma var rasties arī citās izteiksmēs, piemēram, aritmētiskajās operācijās:
⇓
print 4 + 7 $var;
PHP šeit nevar uzminēt, vai mainīgo vajadzēja saskaitīt, atņemt vai salīdzināt utt.
Tas pats attiecas uz sintakses sarakstiem, piemēram, masīvu populācijās, kur analizators norāda arī uz paredzamo komatu ,
, piemēram:
⇓
$var = array("1" => $val, $val2, $val3 $val4);
Vai funkciju parametru saraksti:
⇓
funkcija myfunc($param1, $param2 $param3, $param4)
Līdzīgi to var redzēt ar list
vai global
izteikumiem, vai ja for
cilpā trūkst ;
semikola.
Šī 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:
klase xyz { ⇓
var $value = $_GET["input"];
Ī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ī.
Nekādā gadījumā nedrīkst arī mainīgo pēc identifikatora likt tieši aiz identifikatora:
⇓
$this->myFunc$VAR();
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.
Paturiet prātā, ka mainīgo mainīgo izmantošanai vajadzētu būt izņēmumam. Jaunpienācēji bieži vien mēģina tos izmantot pārāk pavirši, pat tad, ja masīvi būtu vienkāršāk un piemērotāk.
Pārsteidzīga rakstīšana var novest pie tā, ka tiek aizmirsti sākuma iekavās iekavās.
if
un for
un foreach
paziņojumiem:
⇓
foreach $array as $key) {
Risinājums: pievienojiet trūkstošo sākuma (
starp izteikumu un mainīgo.
⇓
else ($var >= 0)
Risinājums: Noņemiet nosacījumus no else
vai izmantojiet elseif
.
⇓
funkcija() izmanto $var {}
Risinājums: Pievienojiet iekavās ap $var
.
Kā minēts atsauces atbildē par "Invisible stray Unicode" (piemēram, non-breaking space), šo kļūdu var redzēt arī šādos gadījumos:
<?php
⇐
$var = new PDO(...);
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.
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 gan brīvs
vārds, gan CONSTANT
vai funkciju nosaukumi, gan aizmirstas necitētas virknes, gan jebkurš vienkāršs teksts.
<?xml
galvenes PHP skriptos