Όλοι αντιμετωπίζουν συντακτικά λάθη. Ακόμη και έμπειροι προγραμματιστές κάνουν τυπογραφικά λάθη. Για τους νεοεισερχόμενους, είναι απλά μέρος της διαδικασίας εκμάθησης. Ωστόσο, είναι συχνά εύκολο να ερμηνεύσουμε μηνύματα λάθους όπως: PHP Parse error: syntax error, unexpected '{' in index.php on line 20 Το απροσδόκητο σύμβολο δεν είναι'πάντα ο πραγματικός ένοχος. Αλλά ο αριθμός γραμμής δίνει μια γενική ιδέα για το πού πρέπει να αρχίσετε να ψάχνετε. Πάντα να εξετάζετε το πλαίσιο του κώδικα. Το συντακτικό λάθος συχνά κρύβεται στις αναφερόμενες ή σε προηγούμενες γραμμές κώδικα. Συγκρίνετε τον κώδικά σας με παραδείγματα σύνταξης από το εγχειρίδιο. Αν και δεν ταιριάζει κάθε περίπτωση με την άλλη. Ωστόσο, υπάρχουν κάποια γενικά βήματα για την επίλυση συντακτικών λαθών. Αυτές οι αναφορές συνοψίζουν τις συνήθεις παγίδες:
{
}
(
)
[
]
]](https://stackoverflow.com/a/29505827){
μπλοκ κώδικα `}`` είναι εσφαλμένα κλειστά ή φωλιασμένα, ίσως χρειαστεί να ερευνήσετε ακόμα πιο ψηλά στον πηγαίο κώδικα. Χρησιμοποιήστε σωστή εσοχή κώδικα για να το απλοποιήσετε αυτό.+-*/.
θα πρέπει επίσης να έχουν διαφορετικό χρωματισμό. Διαφορετικά μπορεί να βρίσκονται σε λάθος πλαίσιο."
ή '
.++
, --
, ή παρενθέσεις που ακολουθούν έναν τελεστή. Δύο συμβολοσειρές/αναγνωριστικά που ακολουθούν απευθείας το ένα το άλλο είναι λανθασμένα στα περισσότερα περιβάλλοντα.if
σε ξεχωριστές ή εμφωλευμένες συνθήκες if
.? :
μπορεί να συμπιέσει τον κώδικα και είναι πράγματι χρήσιμος. Αλλά δεν βοηθάει την αναγνωσιμότητα σε όλες τις περιπτώσεις. Προτιμήστε τις απλές δηλώσεις if
όσο δεν έχετε διαβάσει.if:
/elseif:
/endif;
) είναι κοινή για πρότυπα, αλλά αναμφισβήτητα λιγότερο εύκολη στην παρακολούθηση από τα κανονικά μπλοκ {
κώδικα }
.;
για τον τερματισμό δηλώσεων/γραμμών."
ή '
και εισαγωγικά χωρίς εισαγωγικά εντός..
.(
παρενθέσεις )
. Μετρήστε τους στην αναφερόμενη γραμμή. Υπάρχει ίσος αριθμός τους;diff
της χαλασμένης και της τελευταίας λειτουργικής έκδοσης. Το οποίο μπορεί να είναι διαφωτιστικό ως προς το ποιο είναι το συντακτικό πρόβλημα.
<br/>,grep --color -P -n "\[\x80-\xFF\]" file.php
ως πρώτο μέτρο για να βρείτε μη ASCII σύμβολα.//
ή #
. Τα πολυγραμμικά σχόλια /*...*/
σπάνια ενοχλούν τον αναλυτή όταν αγνοούνται τα linebreaks.php -v
για τον διερμηνέα γραμμής εντολών<?php phpinfo();
για αυτόν που καλείται μέσω του διακομιστή ιστού.
Εάν ο ιστότοπός σας είναι απλώς άδειος, τότε συνήθως η αιτία είναι ένα συντακτικό σφάλμα. Ενεργοποιήστε την εμφάνισή τους με:
error_reporting = E_ALL
display_errors = 1
Στο php.ini
γενικά, ή μέσω του .htaccess
για το mod_php,
ή ακόμη και στο .user.ini
με ρυθμίσεις FastCGI.
Η ενεργοποίησή του μέσα στο σπασμένο σενάριο είναι πολύ αργά, επειδή η PHP δεν μπορεί καν να ερμηνεύσει/εκτελέσει την πρώτη γραμμή. Μια γρήγορη λύση είναι η δημιουργία ενός wrapper script, ας πούμε test.php
:<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
Στη συνέχεια, καλέστε τον κώδικα που αποτυγχάνει με πρόσβαση σε αυτό το σενάριο περιτύλιξης.
Βοηθάει επίσης να ενεργοποιήσετε το error_log
της PHP's και να κοιτάξετε στο webserver's error.log
όταν ένα σενάριο καταρρέει με απαντήσεις HTTP 500.
Ένα "απροσδόκητο T_VARIABLE
" σημαίνει ότι υπάρχει ένα κυριολεκτικό όνομα $variable
, το οποίο δεν ταιριάζει στην τρέχουσα δομή της έκφρασης/διατύπωσης.
⇓
func1()
$var = 1 + 2; # σφάλμα ανάλυσης στη γραμμή +2
.
:
⇓
print "Εδώ έρχεται η τιμή: " $value,
Btw, θα πρέπει να προτιμάτε την παρεμβολή συμβολοσειρών (βασικές μεταβλητές σε διπλά εισαγωγικά) όποτε αυτό βοηθάει στην αναγνωσιμότητα. Το οποίο αποφεύγει αυτά τα συντακτικά προβλήματα.
Η παρεμβολή συμβολοσειρών είναι ένα βασικό χαρακτηριστικό της γλώσσας σεναρίων. Δεν είναι ντροπή να το χρησιμοποιείτε. Αγνοήστε κάθε συμβουλή μικρο-βελτιστοποίησης σχετικά με τη συνένωση μεταβλητών
.
που είναι γρηγορότερη. Δεν είναι.
⇓
print 4 + 7 $var,
Η PHP δεν μπορεί να μαντέψει εδώ αν η μεταβλητή θα έπρεπε να προστεθεί, να αφαιρεθεί ή να συγκριθεί κλπ.
,
για παράδειγμα:
⇓
$var = array("1" => $val, $val2, $val3 $val4),
Ή λίστες παραμέτρων συναρτήσεων:
⇓
function myfunc($param1, $param2 $param3, $param4)
Ισοδύναμα το βλέπετε αυτό με τις δηλώσεις list
ή global
, ή όταν λείπει η τελεία ;
σε ένα βρόχο for
.
class xyz { ⇓
var $value = $_GET["input"],
Οι αταίριαστες }
που κλείνουν τις καμπύλες αγκύλες μπορούν να οδηγήσουν ιδιαίτερα εδώ. Αν μια μέθοδος τερματίζεται πολύ νωρίς (χρησιμοποιήστε σωστή εσοχή!), τότε μια αδέσποτη μεταβλητή συνήθως τοποθετείται λανθασμένα στο σώμα της δήλωσης της κλάσης.
⇓
$this->myFunc$VAR(),
Btw, αυτό είναι ένα συνηθισμένο παράδειγμα όπου η πρόθεση ήταν να χρησιμοποιήσετε μεταβλητή μεταβλητές ίσως. Σε αυτή την περίπτωση μια αναζήτηση μεταβλητής ιδιότητας με $this->{"myFunc$VAR"}();
για παράδειγμα.
Λάβετε υπόψη ότι η χρήση μεταβλητών μεταβλητών θα πρέπει να αποτελεί εξαίρεση. Οι νεοεισερχόμενοι συχνά προσπαθούν να τις χρησιμοποιούν πολύ άνετα, ακόμη και όταν οι πίνακες θα ήταν απλούστεροι και καταλληλότεροι.
if
και for
και foreach
:
⇓
foreach $array as $key) {
Λύση: Προσθέστε το ελλείπον άνοιγμα (
μεταξύ της δήλωσης και της μεταβλητής.
⇓
else ($var >= 0)
Λύση: ή χρησιμοποιήστε elseif
.
⇓
function() uses $var {}
Λύση: Προσθέστε αγκύλες γύρω από την $var
.
<?php
⇐
$var = new PDO(...),
Είναι μάλλον διαδεδομένο στην αρχή των αρχείων και για αντιγραφή και επικόλληση κώδικα. Ελέγξτε με ένα hexeditor, αν ο κώδικάς σας δεν φαίνεται οπτικά να περιέχει συντακτικό πρόβλημα.
Το T_STRING
είναι λίγο λανθασμένη ονομασία. Δεν αναφέρεται σε μια συμβολοσειρά σε εισαγωγικά "string"
. Σημαίνει ότι συναντήθηκε ένα ακατέργαστο αναγνωριστικό. Αυτό μπορεί να κυμαίνεται από φθαρμένες
λέξεις μέχρι εναπομείναντα ονόματα CONSTANT
ή συναρτήσεων, ξεχασμένες μη παρατιθέμενες συμβολοσειρές ή οποιοδήποτε απλό κείμενο.
<?xml
επικεφαλίδες σε σενάρια PHP