Διπλά εισαγωγικά σε php. Ποια είναι η διαφορά μεταξύ συμβολοσειρών μονής και διπλής εισαγωγικής στην PHP; Php που ξεφεύγει από εισαγωγικά

Αυτό το σύντομο άρθρο δείχνει πώς και πού να το χρησιμοποιήσετε εισαγωγικά στην PHP.

Μονά εισαγωγικά (απόστροφα) στην PHP

Οι συμβολοσειρές που περικλείονται σε μονά εισαγωγικά δεν υποβάλλονται σε επεξεργασία με κανέναν τρόπο από την PHP. Δηλαδή, τα μεμονωμένα εισαγωγικά αντιπροσωπεύουν το κείμενο που περικλείεται μεταξύ τους ως έχει.

// Σωστή ηχώ "Πώς είναι η ζωή;" echo "Πώς είναι η ζωή; $name"; echo "How's life?".$name; // Λανθασμένη ηχώ "Πώς είσαι; $name";

Ειδικοί χαρακτήρες σε μονά και διπλά εισαγωγικά

Για να βεβαιωθείτε ότι, για παράδειγμα, ο χαρακτήρας tab (\t) ερμηνεύεται ως χαρακτήρας tab και όχι ως κάθετο και το γράμμα t, πρέπει να περικλείσετε τη γραμμή κειμένου που περιέχει τον χαρακτήρα tab σε διπλά εισαγωγικά. Μπορείτε να χρησιμοποιήσετε τα \' και \\ μόνο σε μεμονωμένα εισαγωγικά. Όλες οι άλλες ακολουθίες διαφυγής (\n, \r, \$, κ.λπ.) δεν επιτρέπονται εντός εισαγωγικών.

// Λανθασμένη ηχώ "Πώς είσαι;\n"; // Σωστή ηχώ "Πώς είσαι;\n";

Για να αποφύγετε τα διπλά εισαγωγικά μέσα σε μια συμβολοσειρά, τοποθετήστε τα εισαγωγικά πριν από την ανάστροφη κάθετο \" .

// Λανθασμένη ηχώ "

Ποια είναι τα νέα σου?

"; // Σωστή ηχώ"

Ποια είναι τα νέα σου?

"; ηχώ "

Ποια είναι τα νέα σου?

";

Διπλά εισαγωγικά στην PHP

Το κείμενο που περικλείεται σε διπλά εισαγωγικά αντιμετωπίζεται πολύ διαφορετικά. Για παράδειγμα, οι μεταβλητές που περικλείονται σε διπλά εισαγωγικά αντικαθίστανται με τις τιμές τους. Αυτό καθιστά βολικό τη μεταγλώττιση Ερωτήματα SQLχρησιμοποιώντας διπλά εισαγωγικά.

$query = "INSERT INTO πίνακα (post,author,text,date) VALUES ("$id","$author","$text","$date"");

Τι είδους εισαγωγικά πρέπει να χρησιμοποιήσω για να μορφοποιήσω συμβολοσειρές - απόστροφα ή κλασικά διπλά εισαγωγικά;

Ας δούμε τη διαφορά μεταξύ διπλών και μεμονωμένων εισαγωγικών στην PHP και χρησιμοποιήστε παραδείγματα για να μάθετε πότε να χρησιμοποιήσετε ποια.

Μεταβλητές και ακολουθίες διαφυγής για ειδικοί χαρακτήρες, που εμφανίζονται σε συμβολοσειρές που περικλείονται σε μεμονωμένα εισαγωγικά δεν υποβάλλονται σε επεξεργασία. Οι συμβολοσειρές που περιβάλλονται από απόστροφα επεξεργάζονται πολύ πιο γρήγορα από τον διερμηνέα PHP από παρόμοιες συμβολοσειρές που περιβάλλονται από διπλά εισαγωγικά.

Ο λόγος εδώ είναι απλός: ο διερμηνέας PHP ελέγχει επιπρόσθετα τις συμβολοσειρές σε διπλά εισαγωγικά για την παρουσία μεταβλητών, και αν βρεθούν, τότε αντί για το όνομα της μεταβλητής, η τιμή της εισάγεται στη συμβολοσειρά. Αλλά μια γραμμή που περικλείεται σε απόστροφα γίνεται αντιληπτή από τον διερμηνέα ως κανονικό κείμενο και η PHP δεν πραγματοποιεί μετασχηματισμούς σε αυτές τις γραμμές. Νομίζω ότι είναι σαφές ότι η επεξεργασία των συμβολοσειρών σε μεμονωμένα εισαγωγικά θα είναι ταχύτερη σε κάθε περίπτωση.

Αρχικά, ας περιγράψουμε πώς να ορίσουμε μια συμβολοσειρά και, στη συνέχεια, ελέγξτε πόσο πιο γρήγορη θα είναι η επεξεργασία των συμβολοσειρών σε μεμονωμένα εισαγωγικά.

Ο απλούστερος τρόπος για να ορίσετε μια συμβολοσειρά είναι να την περικλείσετε σε μεμονωμένα εισαγωγικά ("). Για να χρησιμοποιήσετε μεμονωμένα εισαγωγικά σε μια συμβολοσειρά με ένα εισαγωγικό, πρέπει να προηγείται μια ανάστροφη κάθετο (\), δηλαδή να διαφύγει. Εάν η ανάστροφη κάθετο πρέπει να έρθει Πριν από ένα μεμονωμένο απόσπασμα ή να βρίσκεται στο τέλος της γραμμής, πρέπει να το αντιγράψετε. Εάν προσπαθήσετε να διαφύγετε από οποιονδήποτε άλλο χαρακτήρα, η ανάστροφη κάθετο θα εκτυπωθεί επίσης.

Ακολουθεί ένα παράδειγμα χρήσης μεμονωμένων εισαγωγικών:
// Έξοδος: Απλή συμβολοσειρά
ηχώ "Απλή συμβολοσειρά"?
// Εκτυπώσεις: Είμαι εδώ
echo "Είμαι εδώ";
// Έξοδος: Αυτό δεν θα εισαγάγει: \n νέα γραμμή
echo "Δεν θα εισαχθεί:\nnewline";
// Έξοδοι: Ούτε η μεταβλητή $example θα αντικατασταθεί
echo "Ούτε η μεταβλητή $example θα αντικατασταθεί"; Εάν η συμβολοσειρά περικλείεται σε διπλά εισαγωγικά ("), η PHP αναγνωρίζει περισσότερες ακολουθίες διαφυγής για ειδικούς χαρακτήρες και αντικαθιστά επίσης την τιμή του ονόματος της μεταβλητής στη συμβολοσειρά. εισαγωγικά, πρέπει να προηγείται ένας χαρακτήρας ανάστροφης κάθετου (\).

Ακολουθεί ένα παράδειγμα χρήσης διπλών εισαγωγικών:
// Έξοδος: Απλή συμβολοσειρά
ηχώ "Απλή συμβολοσειρά"?
// Έξοδοι: Εταιρεία "Snowdrop"
echo "Εταιρεία \"Snowdrop\"";
// Έξοδος: Αυτό θα οδηγήσει σε μια νέα γραμμή
echo "Αυτό θα αλλάξει σε μια νέα γραμμή \n";
// Έξοδος: Η μεταβλητή θα αντικατασταθεί
$example = "θα αντικατασταθεί";
echo "Μεταβλητή $example"; Θα πρέπει επίσης να θυμάστε ότι η ακολουθία "\n" (νέα γραμμή), "\r" (επιστροφή μεταφοράς) είναι για απλό κείμενο, όχι για HTML. Έτσι δεν θα βλέπετε αλλαγές στο πρόγραμμα περιήγησης (μόνο στο πηγαίος κώδικαςσελίδες).

Ας μάθουμε πόσο πιο γρήγορα είναι τα μεμονωμένα εισαγωγικά από τα διπλά εισαγωγικά. Για τις μετρήσεις, θα γράψουμε ένα σύντομο σενάριο δοκιμής και θα σημειώσουμε αμέσως ότι εάν το δοκιμάσετε μόνοι σας, τα αποτελέσματα, τα οποία εξαρτώνται από το υλικό του υπολογιστή ή του διακομιστή σας, θα είναι διαφορετικά.
// Επιστρέψτε τη χρονική σήμανση στην αρχή του βρόχου
$start = microtime(true);
// Δημιουργία βρόχου για 1 εκατομμύριο επαναλήψεις
για ($i = 0; $i< 1000000; $i++) {
$text = "Εδώ είναι μια συμβολοσειρά χαρακτήρων";
}
// Υπολογισμός του χρόνου που δαπανήθηκε
$time = (microtime(true) - $start); Αποτέλεσμα: 0,09 δευτερόλεπτα.

Αν αντικαταστήσουμε τα μονά εισαγωγικά με διπλά εισαγωγικά:
$text = "Εδώ είναι μια συμβολοσειρά χαρακτήρων"; Το αποτέλεσμα θα είναι 0,10 δευτερόλεπτα.

Όπως μπορείτε να δείτε, όταν χρησιμοποιείτε συμβολοσειρές κειμένου, η διαφορά στο χρόνο εκτέλεσης είναι πολύ μικρή, θα μπορούσε να πει κανείς ότι δεν υπάρχει καθόλου. Η διασκέδαση ξεκινά όταν προσπαθούμε να συνδυάσουμε μια συμβολοσειρά και μια μεταβλητή.
$text = "Εδώ είναι η συμβολοσειρά χαρακτήρων $i"; ή
$text = $i."Εδώ είναι μια συμβολοσειρά χαρακτήρων"; Αποτέλεσμα περίπου: 0,27 δευτερόλεπτα.

Η διαφορά είναι αρκετά αισθητή. Η συνένωση και τα διπλά εισαγωγικά επηρεάζουν σαφώς την απόδοση όταν προστίθενται μεταβλητές στη συμβολοσειρά.

Όταν ο διακομιστής επεξεργάζεται τον κώδικα, ελέγχει όλα τα περιεχόμενα των διπλών εισαγωγικών για μεταβλητές, σταθερές και άλλα. Παίρνει χρόνο. Και ο διακομιστής επεξεργάζεται ό,τι βρίσκεται ανάμεσα σε μεμονωμένα εισαγωγικά ως έτοιμο κείμενο και δεν ενδιαφέρεται για το τι υπάρχει. Η διαφορά μεταξύ της απόδοσης των μονών και των διπλών εισαγωγικών είναι πολύ μικρή, αλλά εάν αναπτύσσετε ένα έργο με μεγάλο φορτίο, τότε μερικά χιλιοστά του δευτερολέπτου που αποθηκεύονται είναι ήδη μια νίκη.

Μια συμβολοσειρά στην PHP είναι ένα σύνολο χαρακτήρων οποιουδήποτε μήκους. Σε αντίθεση με το C, οι συμβολοσειρές μπορούν επίσης να περιέχουν μηδενικούς χαρακτήρες, οι οποίοι δεν θα επηρεάσουν το πρόγραμμα με κανέναν τρόπο. Με άλλα λόγια, οι συμβολοσειρές μπορούν να χρησιμοποιηθούν για την αποθήκευση δυαδικών δεδομένων. Το μήκος της συμβολοσειράς περιορίζεται μόνο από την ποσότητα της ελεύθερης μνήμης RAM.

Στην PHP, ένας χαρακτήρας είναι ίδιος με ένα byte, πράγμα που σημαίνει ότι υπάρχουν ακριβώς 256 διαφορετικοί χαρακτήρες. Αυτό σημαίνει επίσης ότι η PHP δεν διαθέτει εγγενή υποστήριξη Unicode. Κάποια υποστήριξη Unicode παρέχεται από τις λειτουργίες utf8_encode()Και utf8_decode() .

Μπορείτε να επεξεργαστείτε εύκολα τη συμβολοσειρά χρησιμοποιώντας τυπικές συναρτήσεις και μπορείτε επίσης να έχετε απευθείας πρόσβαση σε οποιονδήποτε από τους χαρακτήρες της.

Ένα απλό παράδειγμα μεταβλητής συμβολοσειράς:

$a= "Είναι απλώς κείμενο αποθηκευμένο σε μια μεταβλητή συμβολοσειράς";
ηχώ $a ; //Έξοδοι "Αυτό είναι απλώς κείμενο γραμμένο σε μια μεταβλητή συμβολοσειράς"
?>

Τώρα ας δούμε αναλυτικά τη σύνταξη τύπου δεδομένων. σειρά.

Σύνταξη τύπου συμβολοσειράς

Μια συμβολοσειρά μπορεί να οριστεί με τρεις διαφορετικούς τρόπους.

Ο απλούστερος τρόπος για να ορίσετε μια συμβολοσειρά είναι να την περικλείσετε σε μονά εισαγωγικά (το σύμβολο " ).

Για να χρησιμοποιήσετε ένα μόνο εισαγωγικό μέσα σε μια συμβολοσειρά, όπως σε πολλές άλλες γλώσσες, πρέπει να προηγείται ένας χαρακτήρας ανάστροφης κάθετου ( \ ), δηλ. προβάλετέ το. Εάν η ανάστροφη κάθετο πρέπει να είναι πριν από ένα μεμονωμένο εισαγωγικό ή να βρίσκεται στο τέλος της γραμμής, πρέπει να το αντιγράψετε. Σημειώστε ότι αν προσπαθήσετε να ξεφύγετε από οποιονδήποτε άλλο χαρακτήρα, θα εκτυπωθεί και η ανάστροφη κάθετο! Έτσι, γενικά δεν χρειάζεται να ξεφύγουμε από την ίδια την ανάστροφη κάθετο.

Σε αντίθεση με τις άλλες δύο συντάξεις, οι μεταβλητές και οι ακολουθίες διαφυγής για ειδικούς χαρακτήρες που εμφανίζονται σε συμβολοσειρές που περικλείονται σε, Δενυπόκεινται σε επεξεργασία.

Ακολουθεί ένα παράδειγμα χρήσης μεμονωμένων εισαγωγικών:

ηχώ "αυτή είναι μια απλή συμβολοσειρά";

Ηχώ «Μπορείτε επίσης να εισάγετε σε γραμμές
χαρακτήρας νέας γραμμής επομένως,
γιατί είναι φυσιολογικό"
;

// Έξοδος: Ο Άρνολντ είπε κάποτε: "Θα επιστρέψω"
ηχώ «Μια μέρα ο Άρνολντ είπε, «Θα επιστρέψω».;

Ηχώ "Διαγράψατε το C:\\*.*;";

// Έξοδοι: Διαγράψατε το C:\*.*;
echo "Διαγράψατε το C:\*.*?" ;

// Έξοδος: Αυτό δεν θα εισαγάγει: \n νέα γραμμή
ηχώ "Δεν θα εισαχθεί:\nnewline";

// Έξοδοι: Οι μεταβλητές $expand και $either δεν αντικαθίστανται
ηχώ "Οι μεταβλητές $expand και $either δεν αντικαθίστανται";
?>

Εάν η συμβολοσειρά περικλείεται σε διπλά εισαγωγικά ( " ), Η PHP αναγνωρίζει περισσότερες ακολουθίες διαφυγής για ειδικούς χαρακτήρες:

Πίνακας ακολουθίας ελέγχου:

Ακολουθία Εννοια
\n νέα γραμμή (LF ή 0x0A (10) σε ASCII)
\r επιστροφή μεταφοράς (CR ή 0x0D (13) σε ASCII)
\ t οριζόντια καρτέλα (HT ή 0x09 (9) σε ASCII)
\\ ανάστροφη κάθετο
\$ σύμβολο δολλαρίου
\" διπλό απόσπασμα
\{1,3} μια ακολουθία χαρακτήρων που αντιστοιχεί σε μια κανονική έκφραση, έναν χαρακτήρα στο σύστημα οκταδικών αριθμών
\x(1,2) ακολουθία χαρακτήρων που αντιστοιχεί σε κανονική έκφραση, χαρακτήρας σε δεκαεξαδικό σύστημα αριθμών

Ας θυμηθούμε ξανά ότι αν θέλετε να μνημονεύσετε οποιονδήποτε άλλο χαρακτήρα, θα εκτυπωθεί και η ανάστροφη κάθετο!

Ένας άλλος τρόπος για να ορίσετε συμβολοσειρές είναι να χρησιμοποιήσετε heredoc σύνταξη ("<<< "). Μετά<<< необходимо указать идентификатор, затем идет строка, а потом этот же идентификатор, закрывающий вставку.

Το αναγνωριστικό κλεισίματος πρέπει να ξεκινά από την πρώτη στήλη της σειράς. Επιπλέον, το αναγνωριστικό πρέπει να ακολουθεί τους ίδιους κανόνες ονομασίας με όλες τις άλλες ετικέτες στην PHP: να περιέχει μόνο αλφαριθμητικούς χαρακτήρες και μια υπογράμμιση και πρέπει να ξεκινά με μη ψηφίο ή κάτω παύλα.

Προσοχή! Είναι πολύ σημαντικό να σημειωθεί ότι η γραμμή αναγνώρισης κλεισίματος δεν περιέχει άλλους χαρακτήρες, εκτός ίσως από ένα ερωτηματικό ( ; ). Αυτό σημαίνει ότι το αναγνωριστικό και ότι δεν μπορούν να υπάρχουν κενά ή καρτέλες πριν ή μετά το ερωτηματικό. Είναι επίσης σημαντικό να κατανοήσετε ότι ο πρώτος χαρακτήρας πριν από το αναγνωριστικό κλεισίματος πρέπει να είναι χαρακτήρας νέας γραμμής όπως ορίζεται από το λειτουργικό σας σύστημα. Για παράδειγμα, στα Windows® αυτό είναι \r.

Εάν αυτός ο κανόνας παραβιαστεί και το αναγνωριστικό κλεισίματος δεν είναι "καθαρό", το αναγνωριστικό κλεισίματος θεωρείται ότι λείπει και η PHP θα συνεχίσει να το αναζητά περαιτέρω. Εάν σε αυτήν την περίπτωση δεν βρεθεί ποτέ το σωστό αναγνωριστικό κλεισίματος, θα προκαλέσει σφάλμα στην επεξεργασία με τον αριθμό γραμμής στο τέλος του σεναρίου.

Heredoc-Το κείμενο συμπεριφέρεται με τον ίδιο τρόπο όπως μια συμβολοσειρά σε διπλά εισαγωγικά, χωρίς να τα έχει. Αυτό σημαίνει ότι δεν χρειάζεται να ξεφύγετε από εισαγωγικά στο heredoc, αλλά μπορείτε ακόμα να χρησιμοποιήσετε τις παραπάνω ακολουθίες διαφυγής. Οι μεταβλητές υποβάλλονται σε επεξεργασία, αλλά πρέπει να είστε τόσο προσεκτικοί όταν χρησιμοποιείτε σύνθετες μεταβλητές στο heredoc όσο και όταν εργάζεστε με συμβολοσειρές.

Παράδειγμα ορισμού συμβολοσειράς heredoc:

$str =<<Παράδειγμα γραμμής,
καλύπτοντας πολλές γραμμές,
χρησιμοποιώντας τη σύνταξη heredoc.
EOD;

/* Πιο πολύπλοκο παράδειγμα με μεταβλητές. */
τάξη foo
{
var $foo ;
var $bar ;

Λειτουργία foo()
{
$this -> foo = "Foo" ;
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
}
}

$foo = new foo();
$name = "MyName" ;

Ηχώ<<Το όνομά μου είναι "$name". Πληκτρολογώ $foo-> foo.
Τώρα συμπεραίνω
( $foo -> γραμμή [ 1 ]) .
Αυτό θα πρέπει να δώσει ένα κεφαλαίο γράμμα "A":
\x41
ΕΟΤ;
?>

Δεν είμαι ειδικός στον προγραμματισμό PHP, αλλά είμαι λίγο μπερδεμένος γιατί βλέπω κάποιο κώδικα στην PHP με μια συμβολοσειρά που περικλείεται σε μονά και μερικές φορές διπλά εισαγωγικά.

Απλώς ξέρω ότι στη γλώσσα .NET ή C, αν είναι σε μονά εισαγωγικά, σημαίνει ότι είναι χαρακτήρας και όχι συμβολοσειρά.

Λύση

Τι πρέπει να ξέρετε

$a = "όνομα"; $b = "$a μου"; == "το όνομά μου" $c = "το $a μου"; != "το όνομά μου"

Στην PHP, οι άνθρωποι χρησιμοποιούν μονά εισαγωγικά για να ορίσουν μια σταθερή συμβολοσειρά όπως "a", "my name", "abc xyz" ενώ χρησιμοποιούν διπλά εισαγωγικά για να ορίσουν μια συμβολοσειρά που περιέχει ένα αναγνωριστικό όπως "a $b $c $d" .

Και άλλο πράγμα είναι

Echo "το όνομά μου"?

ταχύτερα από

Echo "το όνομά μου"?

Ηχώ «μου» . $a;

πιο αργός από

Echo "my $a";

Αυτό ισχύει για άλλες χορδές που χρησιμοποιούνται.

Στην PHP, το κείμενο σε μεμονωμένα εισαγωγικά αντιμετωπίζεται ως τιμή συμβολοσειράς, ενώ το κείμενο σε διπλά εισαγωγικά θα αναλύει τις μεταβλητές αντικαθιστώντας και επεξεργάζοντας την τιμή τους.

$test = "μεταβλητή"; echo "Hello Mr $test"; // η έξοδος θα ήταν: Hello Mr μεταβλητή echo "Hello Mr $test"; // η έξοδος θα ήταν: Γεια σας κύριε $test

Εδώ το διπλό εισαγωγικό αναλύει την τιμή και το μεμονωμένο εισαγωγικό αντιμετωπίζεται ως τιμή συμβολοσειράς (χωρίς να αναλύεται η μεταβλητή $test.)

Και τα δύο είδη ένθετων χαρακτήρων είναι χορδές. Είναι βολικό να χρησιμοποιείτε έναν τύπο προσφοράς για να ολοκληρώσετε έναν άλλο τύπο προσφοράς. """ και """. Η μεγαλύτερη διαφορά μεταξύ των τύπων εισαγωγικών είναι ότι οι ένθετες αναφορές αναγνωριστικών αντικαθίστανται μέσα σε διπλά εισαγωγικά και όχι σε μεμονωμένα εισαγωγικά.

Μια συμβολοσειρά είναι ένα σύνολο χαρακτήρων. Στην PHP, ένας χαρακτήρας είναι ίδιος με ένα byte, πράγμα που σημαίνει ότι υπάρχουν ακριβώς 256 διαφορετικοί χαρακτήρες. Αυτό σημαίνει επίσης ότι η PHP δεν διαθέτει εγγενή υποστήριξη Unicode. Κάποια υποστήριξη Unicode παρέχεται από τις συναρτήσεις utf8_encode() και utf8_decode().

Σημείωση: Δεν υπάρχει πρόβλημα εάν η συμβολοσειρά είναι πολύ μεγάλη. Δεν υπάρχουν ουσιαστικά περιορισμοί στο μέγεθος των συμβολοσειρών που επιβάλλονται από την PHP, επομένως δεν υπάρχει κανένας απολύτως λόγος ανησυχίας για το μήκος τους.

Σύνταξη

    Μια συμβολοσειρά μπορεί να οριστεί με τρεις διαφορετικούς τρόπους.

Μονά εισαγωγικά

Ο απλούστερος τρόπος για να ορίσετε μια συμβολοσειρά είναι να την περικλείσετε σε μονά εισαγωγικά (ο χαρακτήρας ").

Για να χρησιμοποιήσετε ένα μεμονωμένο εισαγωγικό μέσα σε μια συμβολοσειρά, όπως σε πολλές άλλες γλώσσες, πρέπει να προηγείται μια ανάστροφη κάθετο (\), δηλ. διαφυγή. Εάν η ανάστροφη κάθετο πρέπει να είναι πριν από ένα μεμονωμένο εισαγωγικό ή να βρίσκεται στο τέλος της γραμμής, πρέπει να το αντιγράψετε. Σημειώστε ότι αν προσπαθήσετε να ξεφύγετε από οποιονδήποτε άλλο χαρακτήρα, θα εκτυπωθεί και η ανάστροφη κάθετο! Έτσι, γενικά δεν χρειάζεται να ξεφύγουμε από την ίδια την ανάστροφη κάθετο.

Σημείωση: Στην PHP 3, σε αυτήν την περίπτωση, θα εκδοθεί ένα μήνυμα επιπέδου E_NOTICE.

Σημείωση: Σε αντίθεση με τις άλλες δύο συντάξεις, οι μεταβλητές και οι ακολουθίες διαφυγής για ειδικούς χαρακτήρες που εμφανίζονται σε συμβολοσειρές με ένα εισαγωγικό δεν υποβάλλονται σε επεξεργασία.

Echo "αυτή είναι μια απλή χορδή"? echo "Μπορείτε επίσης να εισαγάγετε έναν χαρακτήρα νέας γραμμής σε συμβολοσειρές με αυτόν τον τρόπο, όπως είναι φυσιολογικό"; // Έξοδοι: Ο Arnold είπε κάποτε: "I"ll be back" echo "Ο Arnold είπε κάποτε: "I\"ll be back""; // Έξοδοι: Διαγράψατε το C:\*.*; echo "Διαγράψατε το C:\\*.*?"; // Έξοδοι: Διαγράψατε το C:\*.*; echo "Διαγράψατε το C:\*.*?"; // Έξοδοι: Αυτό δεν θα εισαγάγει: \n μια νέα ηχώ γραμμής "Αυτό δεν θα εισαγάγει: \n μια νέα γραμμή"; // Έξοδοι: Οι μεταβλητές $expand και $either δεν αντικαθίστανται echo "Οι μεταβλητές $expand και $either δεν αντικαθίστανται";

Διπλά εισαγωγικά

Εάν η συμβολοσειρά περικλείεται σε διπλά εισαγωγικά ("), η PHP αναγνωρίζει περισσότερες ακολουθίες διαφυγής για ειδικούς χαρακτήρες:

Πίνακας 11-1. Ακολουθίες διαφυγής

Επαναλαμβάνουμε, αν θέλετε να μνημονεύσετε οποιονδήποτε άλλο χαρακτήρα, θα τυπωθεί και η ανάστροφη κάθετο!

Αλλά η πιο σημαντική ιδιότητα των συμβολοσειρών με διπλά εισαγωγικά είναι ο χειρισμός των μεταβλητών. Δείτε περισσότερες λεπτομέρειες: Επεξεργασία συμβολοσειρών.

Heredoc

Ένας άλλος τρόπος ορισμού συμβολοσειρών είναι η χρήση της σύνταξης heredoc ("

Το αναγνωριστικό κλεισίματος πρέπει να ξεκινά από την πρώτη στήλη της σειράς. Επιπλέον, το αναγνωριστικό πρέπει να ακολουθεί τους ίδιους κανόνες ονομασίας με όλες τις άλλες ετικέτες στην PHP: να περιέχει μόνο αλφαριθμητικούς χαρακτήρες και μια υπογράμμιση και πρέπει να ξεκινά με μη ψηφίο ή κάτω παύλα.

Προσοχή

Είναι πολύ σημαντικό να σημειωθεί ότι η γραμμή αναγνώρισης κλεισίματος δεν περιέχει άλλους χαρακτήρες, εκτός από πιθανώς ένα ερωτηματικό (;). Αυτό σημαίνει ότι το αναγνωριστικό δεν πρέπει να έχει εσοχή και ότι δεν μπορεί να υπάρχουν κενά ή καρτέλες πριν ή μετά το ερωτηματικό. Είναι επίσης σημαντικό να κατανοήσετε ότι ο πρώτος χαρακτήρας πριν από το αναγνωριστικό κλεισίματος πρέπει να είναι χαρακτήρας νέας γραμμής όπως ορίζεται από το λειτουργικό σας σύστημα. Για παράδειγμα, σε Macintosh είναι \r.

Εάν αυτός ο κανόνας παραβιαστεί και το αναγνωριστικό κλεισίματος δεν είναι "καθαρό", το αναγνωριστικό κλεισίματος θεωρείται ότι λείπει και η PHP θα συνεχίσει να το αναζητά περαιτέρω. Εάν σε αυτήν την περίπτωση δεν βρεθεί ποτέ το σωστό αναγνωριστικό κλεισίματος, θα προκαλέσει σφάλμα στην επεξεργασία με τον αριθμό γραμμής στο τέλος του σεναρίου.

Το κείμενο Heredoc συμπεριφέρεται με τον ίδιο τρόπο όπως μια συμβολοσειρά σε διπλά εισαγωγικά, χωρίς να τα έχει. Αυτό σημαίνει ότι δεν χρειάζεται να ξεφύγετε από εισαγωγικά στο heredoc, αλλά μπορείτε ακόμα να χρησιμοποιήσετε τις παραπάνω ακολουθίες διαφυγής. Οι μεταβλητές υποβάλλονται σε επεξεργασία, αλλά πρέπει να είστε τόσο προσεκτικοί όταν χρησιμοποιείτε σύνθετες μεταβλητές στο heredoc όσο και όταν εργάζεστε με συμβολοσειρές.

Παράδειγμα 11-2. Παράδειγμα ορισμού συμβολοσειράς Heredoc

$str =<<foo = "Foo"; $this->bar = array("Bar1", "Bar2", "Bar3"); ) ) $foo = new foo(); $name = "MyName"; ηχώ<<foo. Τώρα βγάζω έξοδο ($foo->bar). Αυτό θα πρέπει να βγάζει ένα κεφαλαίο γράμμα "A": \x41 EOT;

Σημείωση: Η υποστήριξη Heredoc προστέθηκε στην PHP 4.

Χειρισμός μεταβλητών

Εάν μια συμβολοσειρά ορίζεται σε διπλά εισαγωγικά ή χρησιμοποιώντας heredoc, οι μεταβλητές μέσα σε αυτήν υποβάλλονται σε επεξεργασία.

Υπάρχουν δύο τύποι σύνταξης: απλή και σύνθετη. Η απλή σύνταξη είναι ευκολότερη και πιο βολική. Σας επιτρέπει να επεξεργαστείτε μια μεταβλητή, μια τιμή πίνακα ή μια ιδιότητα αντικειμένου.

Η σύνθετη σύνταξη εισήχθη στην PHP 4 και μπορεί να αναγνωριστεί από τα σγουρά άγκιστρα που περιβάλλουν την έκφραση.

Απλή σύνταξη

Εάν ο διερμηνέας συναντήσει ένα σύμβολο δολαρίου ($), αρπάζει όσο το δυνατόν περισσότερους χαρακτήρες για να σχηματίσει ένα έγκυρο όνομα μεταβλητής. Εάν θέλετε να καθορίσετε το τέλος ενός ονόματος, περικλείστε το όνομα της μεταβλητής σε σγουρά άγκιστρα.

$beer = "Heineken"; echo "Η γεύση της $beer είναι υπέροχη", // λειτουργεί, το """ δεν είναι έγκυρος χαρακτήρας για ένα όνομα μεταβλητής echo "Ήπιε μερικές $μπύρες"; // δεν λειτουργεί, το "s" είναι έγκυρο όνομα μεταβλητής echo "Έπινε μερικές $(μπύρα)"; // works echo "Ήπιε μερικές ($μπύρα)"; // έργα

Ένα στοιχείο πίνακα (πίνακας) ή μια ιδιότητα ενός αντικειμένου (αντικειμένου) μπορεί να υποβληθεί σε επεξεργασία με τον ίδιο τρόπο. Σε ευρετήρια πίνακα, μια κλειστή αγκύλη (]) σηματοδοτεί το τέλος του ορισμού του ευρετηρίου. Οι ίδιοι κανόνες ισχύουν για τις ιδιότητες των αντικειμένων όπως για τις απλές μεταβλητές, αν και δεν μπορούν να εξαπατηθούν όπως συμβαίνει με τις μεταβλητές.

// Αυτά τα παραδείγματα αφορούν συγκεκριμένα τη χρήση πινάκων μέσα σε συμβολοσειρές //. Εκτός συμβολοσειρών, να περικλείετε πάντα τα πλήκτρα συμβολοσειράς του πίνακα // σε εισαγωγικά και μην τα χρησιμοποιείτε εκτός συμβολοσειρών (παρενθέσεις). // Ας δείξουμε όλα τα σφάλματα error_reporting(E_ALL); $fruits = array("strawberry" => "κόκκινο", "banana" => "κίτρινο"); // Λειτουργεί, αλλά σημειώστε ότι λειτουργεί διαφορετικά έξω από την ηχώ συμβολοσειράς "A banana is $fruits."; //Works echo "A banana is ($fruits["banana"])."; // Λειτουργεί, αλλά η PHP, όπως περιγράφεται παρακάτω, αρχικά αναζητά // για τη σταθερά μπανάνα. echo "Μια μπανάνα είναι ($fruits)."; // Δεν λειτουργεί, χρησιμοποιήστε σγουρά σιδεράκια. Αυτό θα προκαλέσει σφάλμα επεξεργασίας. echo "Μια μπανάνα είναι $fruits["banana"]."; // Works echo "A banana is " . $fruits["μπανάνα"] . "."; // Works echo "This Square is $square->width μέτρα broad."; // Δεν δουλεύει. Δείτε σύνθετη σύνταξη για λύση. echo "Αυτό το τετράγωνο είναι $square->width00 εκατοστά πλάτος.";

Για οτιδήποτε πιο περίπλοκο, πρέπει να χρησιμοποιήσετε σύνθετη σύνταξη.

Πολύπλοκη (σγουρή) σύνταξη

Ονομάζεται σύνθετη όχι επειδή είναι δυσνόητη, αλλά επειδή επιτρέπει τη χρήση σύνθετων εκφράσεων.

Στην πραγματικότητα, μπορείτε να συμπεριλάβετε οποιαδήποτε τιμή βρίσκεται στον χώρο ονομάτων σε μια γραμμή με αυτήν τη σύνταξη. Απλώς γράφετε την έκφραση με τον ίδιο τρόπο που θα κάνατε έξω από τη γραμμή και μετά την περικλείετε στο ( και ). Εφόσον δεν μπορείτε να διαφύγετε από το "(", αυτή η σύνταξη θα αναγνωριστεί μόνο όταν ακολουθήσει αμέσως το $ (. (Χρησιμοποιήστε "(\$" ή "\($" για διαφυγή "($"). Μερικά επεξηγηματικά παραδείγματα:

// Ας δείξουμε όλα τα σφάλματα error_reporting(E_ALL); $great = "φανταστικό"; // Δεν λειτουργεί, θα βγει: This is ( fantastic) echo "This is ( $great)"; // Works, θα βγει: Αυτή είναι φανταστική ηχώ "This is ($great)"; echo "Αυτό είναι $(υπέροχο)"; // Works echo "Αυτό το τετράγωνο είναι ($square->width)00 εκατοστά πλάτος."; // Works echo "This works: ($arr)"; // Αυτό δεν είναι έγκυρο για τον ίδιο λόγο που το $foo δεν είναι έγκυρο εκτός της γραμμής //. Με άλλα λόγια, αυτό θα συνεχίσει να λειτουργεί, // αλλά επειδή η PHP αναζητά πρώτα το σταθερό foo, θα // θα στείλει ένα σφάλμα E_NOTICE (απροσδιόριστο σταθερό). echo "Αυτό είναι λάθος: ($arr)"; // Εργα. Όταν χρησιμοποιείτε πολυδιάστατους πίνακες, χρησιμοποιείτε πάντα σγουρά στηρίγματα μέσα // strings echo "This works: ($arr["foo"])"; // Εργα. echo "Αυτό λειτουργεί: " . $arr["foo"]; echo "Μπορείτε ακόμη και να γράψετε ($obj->values->name)"; echo "Αυτή είναι η τιμή της μεταβλητής με όνομα $name: ($($name))";

Πρόσβαση και αλλαγή χαρακτήρα σε μια συμβολοσειρά

Οι χαρακτήρες σε χορδές μπορούν να χρησιμοποιηθούν και να τροποποιηθούν καθορίζοντας τη μετατόπισή τους από την αρχή της συμβολοσειράς, ξεκινώντας από το μηδέν, σε σγουρά άγκιστρα μετά τη συμβολοσειρά.

Σημείωση: Για συμβατότητα προς τα πίσω, έχετε ακόμα την επιλογή να χρησιμοποιήσετε αγκύλες πίνακα για τους ίδιους σκοπούς. Ωστόσο, ξεκινώντας με την PHP 4, αυτή η σύνταξη έχει καταργηθεί.

Παράδειγμα 11-3. Μερικά παραδείγματα χορδών

// Πάρτε τον πρώτο χαρακτήρα της συμβολοσειράς $str = "Αυτό είναι δοκιμή."; $first = $str(0); // Λάβετε τον τρίτο χαρακτήρα της συμβολοσειράς $third = $str(2); // Λάβετε τον τελευταίο χαρακτήρα της συμβολοσειράς $str = "Αυτό είναι ακόμα δοκιμή."; $last = $str(strlen($str)-1); // Αλλαγή του τελευταίου χαρακτήρα της γραμμής $str = "Κοίτα τη θάλασσα"; $str(strlen($str)-1) = "εγώ";

Χρήσιμες Λειτουργίες και Χειριστές

Οι συμβολοσειρές μπορούν να συνδεθούν χρησιμοποιώντας τον τελεστή ".". (τελεία). Λάβετε υπόψη ότι ο τελεστής προσθήκης "+" δεν λειτουργεί εδώ. Για περισσότερες πληροφορίες, ανατρέξτε στην ενότητα Τελεστές συμβολοσειρών.

Υπάρχουν πολλές χρήσιμες συναρτήσεις για την τροποποίηση συμβολοσειρών.

Οι κύριες λειτουργίες περιγράφονται στην ενότητα για τις συναρτήσεις συμβολοσειρών, τις συναρτήσεις κανονικής έκφρασης για σύνθετη αναζήτηση και αντικατάσταση (σε δύο μέρη: Perl και POSIX για προχωρημένους).

Υπάρχουν επίσης συναρτήσεις για συμβολοσειρές URL και συναρτήσεις για κρυπτογράφηση/αποκρυπτογράφηση συμβολοσειρών (mcrypt και mhash).

Τέλος, αν ακόμα δεν έχετε βρει αυτό που ψάχνετε, δείτε επίσης τις λειτουργίες τύπου χαρακτήρων.

Μετατροπή σε συμβολοσειρά

Μπορείτε να μετατρέψετε μια τιμή σε μια συμβολοσειρά χρησιμοποιώντας μια cast (string) ή τη συνάρτηση strval(). Σε εκφράσεις όπου απαιτείται συμβολοσειρά, η μετατροπή πραγματοποιείται αυτόματα. Αυτό συμβαίνει όταν χρησιμοποιείτε τις συναρτήσεις echo() ή print() ή όταν συγκρίνετε την τιμή μιας μεταβλητής με μια συμβολοσειρά. Διαβάζοντας τις ενότητες Τύποι και Χειρισμός Τύπου του εγχειριδίου θα γίνουν πιο ξεκάθαρα τα ακόλουθα. Δείτε επίσης settype().

Η δυαδική τιμή TRUE μετατρέπεται στη συμβολοσειρά "1" και η τιμή FALSE αναπαρίσταται ως "" (η κενή συμβολοσειρά). Με αυτόν τον τρόπο, μπορείτε να μετατρέψετε τιμές και προς τις δύο κατευθύνσεις - από Boolean σε συμβολοσειρά και αντίστροφα.

Ένας ακέραιος ή float μετατρέπεται σε μια συμβολοσειρά, που αντιπροσωπεύεται από έναν αριθμό που αποτελείται από τα ψηφία του (συμπεριλαμβανομένου του εκθέτη για αριθμούς κινητής υποδιαστολής).

Οι πίνακες μετατρέπονται πάντα στη συμβολοσειρά "Array", επομένως δεν μπορείτε να εμφανίσετε τα περιεχόμενα ενός πίνακα χρησιμοποιώντας echo() ή print() για να δείτε τι περιέχει. Για να δείτε ένα μεμονωμένο στοιχείο, πρέπει να κάνετε κάτι σαν echo $arr["foo"]. Δείτε παρακάτω για συμβουλές σχετικά με τον τρόπο εμφάνισης/προβολής όλου του περιεχομένου.

Τα αντικείμενα μετατρέπονται πάντα στη συμβολοσειρά "Object". Εάν θέλετε να εκτυπώσετε την τιμή μιας μεταβλητής μέλους αντικειμένου για σκοπούς εντοπισμού σφαλμάτων, διαβάστε τις ακόλουθες παραγράφους. Εάν θέλετε να λάβετε το όνομα κλάσης του απαιτούμενου αντικειμένου, χρησιμοποιήστε get_class() .

Οι πόροι μετατρέπονται πάντα σε συμβολοσειρές με τη δομή "Resource id #1", όπου 1 είναι ο μοναδικός αριθμός πόρου που του έχει εκχωρηθεί από την PHP κατά το χρόνο εκτέλεσης. Εάν θέλετε να λάβετε τον τύπο πόρου, χρησιμοποιήστε το .

Το NULL μετατρέπεται πάντα στην κενή συμβολοσειρά.

Όπως μπορείτε να δείτε παραπάνω, η έξοδος πινάκων, αντικειμένων ή πόρων δεν σας παρέχει χρήσιμες πληροφορίες σχετικά με τις ίδιες τις τιμές. Ένας καλύτερος τρόπος εκτύπωσης τιμών για εντοπισμό σφαλμάτων είναι να χρησιμοποιήσετε τις συναρτήσεις print_r() και var_dump().

Μπορείτε επίσης να μετατρέψετε τις τιμές PHP σε συμβολοσειρές για μόνιμη αποθήκευση. Αυτή η μέθοδος ονομάζεται σειριοποίηση και μπορεί να γίνει χρησιμοποιώντας τη συνάρτηση serialize(). Επιπλέον, εάν η εγκατάσταση PHP σας έχει υποστήριξη WDDX, μπορείτε να σειριοποιήσετε τις τιμές PHP σε δομές XML.

Μετατροπή συμβολοσειρών σε αριθμούς

Εάν η συμβολοσειρά αναγνωρίζεται ως αριθμητική τιμή, η τιμή και ο τύπος που προκύπτει καθορίζονται ως εξής.

Μια συμβολοσειρά θα αναγνωριστεί ως float εάν περιέχει οποιονδήποτε από τους χαρακτήρες ".", "e" ή "E". Διαφορετικά θα οριστεί ως ακέραιος αριθμός.

Η τιμή καθορίζεται από την αρχή της συμβολοσειράς. Εάν η γραμμή ξεκινά με μια έγκυρη αριθμητική τιμή, αυτή η τιμή θα χρησιμοποιηθεί. Διαφορετικά η τιμή θα είναι 0 (μηδέν). Μια έγκυρη αριθμητική τιμή είναι ένα ή περισσότερα ψηφία (τα οποία μπορεί να περιέχουν μια υποδιαστολή), προαιρετικά πριν από ένα πρόσημο, ακολουθούμενο από έναν προαιρετικό εκθέτη. Ο εκθέτης είναι "e" ή "E" ακολουθούμενο από ένα ή περισσότερα ψηφία.

$foo = 1 + "10,5"; // Το $foo είναι ένα float (11.5) $foo = 1 + "-1.3e3"; // Το $foo είναι float (-1299) $foo = 1 + "bob-1.3e3"; // Το $foo είναι ένας ακέραιος αριθμός (1) $foo = 1 + "bob3"; // $foo είναι ένας ακέραιος αριθμός (1) $foo = 1 + "10 Small Pigs"; // Το $foo είναι ακέραιος αριθμός (11) $foo = 4 + "10.2 Little Piggies"; // Το $foo είναι ένας πλωτήρας (14.2) $foo = "10.0 pigs " + 1; // $foo είναι float (11) $foo = "10.0 pigs " + 1.0; // Το $foo είναι float (11)

Για περισσότερες πληροφορίες σχετικά με αυτήν τη μετατροπή, ανατρέξτε στην ενότητα για το strtod(3) στην τεκμηρίωση του Unix.

Εάν θέλετε να δοκιμάσετε οποιοδήποτε από τα παραδείγματα αυτής της ενότητας, μπορείτε να το αντιγράψετε και να επικολλήσετε και την ακόλουθη γραμμή για να δείτε τι συμβαίνει:

Echo "\$foo==$foo; type: " . gettype($foo) . "
\n";

Μην περιμένετε να λάβετε τον κωδικό ενός χαρακτήρα μετατρέποντάς τον σε ακέραιο (όπως μπορεί να κάνετε στο C, για παράδειγμα). Για να μετατρέψετε χαρακτήρες στους κωδικούς τους και πίσω, χρησιμοποιήστε το ord() και




Μπλουζα