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

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

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

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

Εάν χρειάζεται να χρησιμοποιήσουμε ένα μόνο εισαγωγικό σε κείμενο, πρέπει να το ξεφύγουμε με κάθετο (\).

Οι ακολουθίες διαφυγής μέσα σε μεμονωμένα εισαγωγικά δεν λειτουργούν.

Παραδείγματα χρήσης μεμονωμένων εισαγωγικών:

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

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

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

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

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

Παραδείγματα χρήσης διπλών εισαγωγικών:

Ας εστιάσουμε στο γεγονός ότι οι συμβολοσειρές με διπλά εισαγωγικά χειρίζονται μεταβλητές.

Τι συμβαίνει όταν γίνεται επεξεργασία μιας συμβολοσειράς; Διερμηνέας ελέγξτε κάθε συμβολοσειρά με διπλά εισαγωγικά για μεταβλητές, δηλ. λαμβάνει χώρα αναγκαστική ανάλυση, η οποία απαιτεί επιπλέον χρόνο. Ναι, συχνά αυτό είναι ένα κλάσμα του δευτερολέπτου, αλλά το ίδιο το γεγονός πρέπει να γίνει κατανοητό. Δηλαδή, αν συγκρίνετε την επεξεργασία μιας συμβολοσειράς με διαφορετικά εισαγωγικά (χωρίς μεταβλητές, φυσικά), τότε σίγουρα μια συμβολοσειρά με μονά εισαγωγικά θα επεξεργαστεί πιο γρήγορα.

Υπολογισμοί

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

Αυτό το σύντομο άρθρο δείχνει πώς και πού να το χρησιμοποιήσετε αποσπάσματα στην 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 με μια συμβολοσειρά που περικλείεται σε μονά και μερικές φορές διπλά εισαγωγικά.

Απλώς ξέρω ότι στη γλώσσα .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.)

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

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

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

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

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

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

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

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

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

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

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

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

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

Όπως και με μια συμβολοσειρά που περικλείεται σε μεμονωμένα εισαγωγικά, η διαφυγή οποιουδήποτε χαρακτήρα θα δώσει επίσης την ίδια την ανάστροφη κάθετο. Πριν από την PHP 5.1.1, κάντε ανάστροφη κάθετο \($var)δεν δημοσιεύτηκε.

Heredoc

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

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

Προσοχή

Είναι πολύ σημαντικό να σημειωθεί ότι η γραμμή αναγνώρισης κλεισίματος δεν πρέπει να περιέχει άλλους χαρακτήρες εκτός από ένα ερωτηματικό ( ; ). Αυτό σημαίνει ότι το id δεν πρέπει να έχει εσοχήκαι ότι δεν μπορούν να υπάρχουν κενά ή καρτέλες πριν ή μετά το ερωτηματικό. Είναι επίσης σημαντικό να κατανοήσετε ότι ο πρώτος χαρακτήρας πριν από το αναγνωριστικό κλεισίματος πρέπει να είναι χαρακτήρας νέας γραμμής όπως ορίζεται από το λειτουργικό σας σύστημα. Για παράδειγμα, σε συστήματα UNIX, συμπεριλαμβανομένου του Mac OS X, αυτό \n. Μια νέα γραμμή πρέπει επίσης να ξεκινά αμέσως μετά το αναγνωριστικό κλεισίματος.

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

Το Heredoc δεν μπορεί να χρησιμοποιηθεί για την προετοιμασία πεδίων κλάσης. Ξεκινώντας από την PHP 5.3, αυτός ο περιορισμός ισχύει μόνο για heredoc που περιέχουν μεταβλητές.

Παράδειγμα #1 Λάθος παράδειγμα

τάξη foo (
δημόσιο $bar =<<μπαρ
ΕΟΤ;
}
?>

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

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

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

Class foo
{
var $foo ;
var $bar ;

Λειτουργία foo()
{
$this -> foo = "Foo" ;
$αυτό ->
}
}

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

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

Το όνομά μου είναι "MyName". Πληκτρολογώ Foo. Τώρα, βγάζω το Bar2. Αυτό θα πρέπει να δίνει ένα κεφαλαίο γράμμα "A": A

Είναι επίσης δυνατό να χρησιμοποιηθεί η σύνταξη heredoc για τη μετάδοση δεδομένων μέσω ορισμάτων συνάρτησης:

Από την έκδοση 5.3.0, κατέστη δυνατή η προετοιμασία στατικών μεταβλητών και ιδιοτήτων/σταθερών κλάσης χρησιμοποιώντας τη σύνταξη heredoc:

Παράδειγμα #4 Χρήση heredoc για την προετοιμασία στατικών μεταβλητών

// Στατικές μεταβλητές
function foo()
{
στατικό $bar =<<Δεν υπάρχει τίποτα εδώ...
ΕΠΙΓΡΑΦΗ;
}

// Ιδιότητες/σταθερές κλάσης
τάξη foo
{
const BAR =<<Παράδειγμα χρήσης σταθεράς
FOOBAR;

Δημόσιο $baz =<<Παράδειγμα χρήσης πεδίου
FOOBAR;
}
?>

Από την PHP 5.3.0, μπορείτε επίσης να περιβάλετε το αναγνωριστικό Heredoc με διπλά εισαγωγικά:

Nowdoc

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

Το Nowdoc υποδεικνύεται με την ίδια σειρά <<< , το οποίο χρησιμοποιείται στο heredoc, αλλά το ακόλουθο αναγνωριστικό περικλείεται σε μονά εισαγωγικά, για παράδειγμα, <<<"EOT" . Όλες οι προϋποθέσεις που ισχύουν για τα αναγνωριστικά heredoc ισχύουν και για το nowdoc, ειδικά αυτές που ισχύουν για το αναγνωριστικό κλεισίματος.

Παράδειγμα #6 Παράδειγμα Nowdoc

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

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

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

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

ηχώ<<<"EOT"
Το όνομά μου είναι "$name". Εκτυπώνω $foo->foo.
Τώρα εκτυπώνω ($foo->bar).
Αυτό δεν πρέπει να δίνει κεφαλαίο "A": \x41
ΕΟΤ;
?>

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος:

Το όνομά μου είναι "$name". Εκτυπώνω $foo->foo. Τώρα εκτυπώνω ($foo->bar). Αυτό δεν πρέπει να δίνει κεφαλαίο "A": \x41

Σχόλιο:

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

Παράδειγμα #7 Παράδειγμα χρήσης στατικών δεδομένων

τάξη foo (
δημόσιο $bar =<<<"EOT"
μπαρ
ΕΟΤ;
}
?>

Σχόλιο:

Η υποστήριξη nowdoc προστέθηκε στην PHP 5.3.0.

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

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

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

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

Απλή σύνταξη

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

$juice = "μήλο" ;

echo "Ήπιε λίγο χυμό $χυμού." . PHP_EOL ;
// δεν λειτουργεί, το "s" είναι ένας έγκυρος χαρακτήρας για ένα όνομα μεταβλητής,
// αλλά η μεταβλητή μας ονομάζεται $juice.
echo "Ήπιε λίγο χυμό από $χυμούς." ;
?>

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος:

Ήπιε λίγο χυμό μήλου. Ήπιε λίγο χυμό από .

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

Παράδειγμα #8 Παράδειγμα απλής σύνταξης

$juices = array("μήλο" , "πορτοκαλί" , "koolaid1" => "μωβ" );

echo "Ήπιε λίγο $juices [ 0 ] juice." . PHP_EOL ;
echo "Ήπιε μερικούς χυμούς $χυμούς [ 1 ]." . PHP_EOL ;
echo "Ήπιε λίγο $juices [ koolaid1 ] juice." . PHP_EOL ;

άνθρωποι της τάξης (
public $john = "Τζον Σμιθ" ;
public $jane = "Jane Smith" ;
public $robert = " Robert Paulsen " ;

Public $smith = "Smith" ;
}

$people = νέα άτομα();

echo "$people -> ο Γιάννης ήπιε λίγο χυμό $juices [ 0 ]." . PHP_EOL ;
echo " $people -> ο john είπε γεια στον $people -> jane ." . PHP_EOL ;
echo "$people -> η σύζυγος του Γιάννη χαιρέτησε τον $people -> Robert." . PHP_EOL;
echo " $people -> robert χαιρέτησε τους δύο $people -> smiths ." ; // Δεν θα λειτουργήσει
?>

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος:

Ήπιε λίγο χυμό μήλου. Ήπιε λίγο χυμό πορτοκαλιού. Ήπιε λίγο μοβ χυμό. Ο Τζον Σμιθ ήπιε λίγο χυμό μήλου. Ο Τζον Σμιθ είπε τότε ένα γεια στην Τζέιν Σμιθ. Η σύζυγος του John Smith χαιρέτησε τον Robert Paulsen.Ο Robert Paulsen χαιρέτησε τους δύο.

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

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

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

Οποιαδήποτε βαθμωτή μεταβλητή, στοιχείο πίνακα ή ιδιότητα αντικειμένου που αντιστοιχίζεται σε μια συμβολοσειρά μπορεί να αναπαρασταθεί σε μια συμβολοσειρά χρησιμοποιώντας αυτήν τη σύνταξη. Απλώς γράψτε την έκφραση με τον ίδιο τρόπο που θα κάνατε έξω από τη γραμμή και στη συνέχεια τυλίξτε την μέσα { Και } . Επειδή η { δεν είναι δυνατή η διαφυγή, αυτή η σύνταξη θα αναγνωριστεί μόνο όταν $ ακολουθεί άμεσα { . Χρήση {\$ για εκτύπωση {$ . Μερικά ενδεικτικά παραδείγματα:

// Εμφάνιση όλων των σφαλμάτων
error_reporting(E_ALL);

$great = " υπέροχο " ;

// Δεν λειτουργεί, βγάζει: Αυτό είναι (υπέροχο)
echo "This is ( $great )" ;

// Works, outputs: Αυτό είναι υπέροχο
echo "This is ( $great ) " ;
echo "This is $( great ) " ;

// Εργα
ηχώ «Αυτή η πλατεία είναι φαρδιά( $τετράγωνο -> πλάτος ) 00 εκατοστά." ;

// Works, οι λέξεις-κλειδιά που αναφέρονται λειτουργούν μόνο με τη σύνταξη σγουρής αγκύλης
echo "Αυτό λειτουργεί: ( $arr [ "key" ]) " ;

// Εργα
echo "Αυτό λειτουργεί: ( $arr [ 4 ][ 3 ]) " ;

// Αυτό δεν είναι έγκυρο για τον ίδιο λόγο με το $foo έξω
// γραμμές. Με άλλα λόγια, θα εξακολουθεί να λειτουργεί,
// αλλά εφόσον η PHP αναζητά πρώτα το σταθερό foo, αυτό θα προκαλέσει
// σφάλμα επιπέδου E_NOTICE (απροσδιόριστη σταθερά).
ηχώ "Δεν είναι σωστό:( $arr [ foo ][ 3 ]) " ;

// Εργα. Όταν χρησιμοποιείτε εσωτερικά πολυδιάστατους πίνακες
// οι γραμμές χρησιμοποιούν πάντα σγουρά τιράντες
echo "Αυτό λειτουργεί: ( $arr [ "foo" ][ 3 ]) " ;

// Εργα.
echo "Αυτό λειτουργεί: " . $arr [ "foo" ][ 3 ];

ηχώ «Λειτουργεί και αυτό:( $obj -> τιμές [ 3 ]-> όνομα ) " ;

ηχώ "Αυτή είναι η τιμή της μεταβλητής που ονομάζεται$name : ($( $name )) " ;

ηχώ "Αυτή είναι η τιμή της μεταβλητής που ονομάζεται όπως επιστρέφεται από τη συνάρτηση getName():($( getName ())) " ;

ηχώ "Αυτή είναι η τιμή της μεταβλητής κατά όνομα που επιστρέφει το \$object->getName():($( $object -> getName ())) " ;

// Δεν λειτουργεί, βγάζει: Αυτό επιστρέφει η getName(): (getName())
ηχώ "Αυτό επιστρέφει η getName(): (getName())";
?>

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

τάξη foo (
var $bar = "Είμαι μπαρ." ;
}

$foo = new foo();
$bar = "bar" ;
$baz = array("foo" , "bar" , "baz" , "quux" );
echo " ( $foo -> $bar ) \n" ;
echo " ( $foo -> $baz [ 1 ]) \n" ;
?>

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος:

Είμαι μπαρ. Είμαι μπαρ.

Σχόλιο:

Οι συναρτήσεις, οι κλήσεις μεθόδων, οι στατικές μεταβλητές κλάσης και οι σταθερές κλάσεων λειτουργούν εσωτερικά {$} , ξεκινώντας με την PHP 5. Ωστόσο, η παρεχόμενη τιμή θα αντιμετωπίζεται ως όνομα μεταβλητής στο ίδιο πλαίσιο με τη γραμμή στην οποία ορίζεται. Χρήση μονών σγουρά τιράντες ( {} ) δεν θα λειτουργήσει για την πρόσβαση στις τιμές των συναρτήσεων, των μεθόδων, των σταθερών κλάσης ή των στατικών μεταβλητών κλάσης.

// Εμφάνιση όλων των σφαλμάτων
error_reporting(E_ALL);

μπύρες κατηγορίας (
const softdrink = "rootbeer" ;
public static $ale = "ipa" ;
}

$rootbeer = "A & W" ;
$ipa = " Alexander Keith\"s " ;

// Αυτό λειτουργεί, βγάζει: Θα ήθελα A & W
echo "I'd like ($( beers :: softdrink )) \n" ;

// Αυτό λειτουργεί επίσης, βγάζει: Θα ήθελα του Alexander Keith
echo "I'd like ($( beers :: $ale )) \n" ;
?>

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

Οι χαρακτήρες σε συμβολοσειρές μπορούν να χρησιμοποιηθούν και να τροποποιηθούν καθορίζοντας τη μετατόπισή τους από την αρχή της συμβολοσειράς, ξεκινώντας από το μηδέν, σε αγκύλες μετά τη συμβολοσειρά, για παράδειγμα, $str . Σκεφτείτε μια συμβολοσειρά για αυτόν τον σκοπό ως μια σειρά χαρακτήρων. Εάν πρέπει να λάβετε ή να αντικαταστήσετε περισσότερους από 1 χαρακτήρες, μπορείτε να χρησιμοποιήσετε τις λειτουργίες substr()Και substr_replace().

Σχόλιο: Ένας χαρακτήρας σε μια συμβολοσειρά μπορεί επίσης να προσπελαστεί χρησιμοποιώντας σγουρά άγκιστρα, για παράδειγμα $str(42) .

Προσοχή

Η προσπάθεια εγγραφής σε μια μετατόπιση πέρα ​​από τα όρια της γραμμής θα συμπληρώσει τη συμβολοσειρά με κενά μέχρι αυτή τη μετατόπιση. Οι μη ακέραιοι τύποι θα μετατραπούν σε ακέραιους τύπους. Ο λάθος τύπος μετατόπισης θα προκαλέσει σφάλμα επιπέδου E_ΣΗΜΕΙΩΣΗ. Η εγγραφή σε αρνητική μετατόπιση θα προκαλέσει σφάλμα επιπέδου E_ΣΗΜΕΙΩΣΗ, και όταν διαβαστεί θα επιστρέψει μια κενή συμβολοσειρά. Χρησιμοποιείται μόνο ο πρώτος χαρακτήρας της αντιστοιχισμένης συμβολοσειράς. Η αντιστοίχιση σε μια κενή συμβολοσειρά εκχωρεί ένα null byte (NULL).

Προσοχή

Οι συμβολοσειρές στην PHP είναι εσωτερικά πίνακες byte. Ως αποτέλεσμα, η πρόσβαση ή η τροποποίηση μιας συμβολοσειράς σε μετατόπιση δεν είναι ασφαλής κωδικοποίηση πολλών byte και θα πρέπει να γίνεται μόνο με συμβολοσειρές σε κωδικοποιήσεις ενός byte, όπως το ISO-8859-1.

Παράδειγμα #9 Ορισμένα παραδείγματα συμβολοσειρών

// Λάβετε τον πρώτο χαρακτήρα της συμβολοσειράς
$str = "Αυτό είναι μια δοκιμή." ;
$first = $str [ 0 ];

// Λάβετε τον τρίτο χαρακτήρα της συμβολοσειράς
$τρίτο = $str [ 2 ];

// Λάβετε τον τελευταίο χαρακτήρα της συμβολοσειράς
$str = "Αυτό είναι ακόμα μια δοκιμή." ;
$last = $str [strlen ($str ) - 1 ];

// Αλλάξτε τον τελευταίο χαρακτήρα της γραμμής
$str = " Κοιτάξτε τη θάλασσα " ;
$str [ strlen ($str )- 1 ] = "e" ;

?>

Από την PHP 5.4, η μετατόπιση στη συμβολοσειρά πρέπει να προσδιορίζεται είτε ως ακέραιος είτε ως συμβολοσειρά που περιέχει ψηφία, διαφορετικά θα εκδοθεί μια προειδοποίηση. Προηγουμένως μετατόπιση δόθηκε από μια συμβολοσειρά όπως "foo", χωρίς προειδοποίηση μετατράπηκε σε 0 .

Παράδειγμα #10 Διαφορές μεταξύ PHP 5.3 και PHP 5.4

$str = "abc" ;

Var_dump($str["1"]);
var_dump (isset($str [ "1" ]));

Var_dump($str["1.0"]);
var_dump (isset($str [ "1.0" ]));

Var_dump($str["x"]);
var_dump (isset($str [ "x" ]));

Var_dump($str["1x"]);
var_dump (isset($str [ "1x" ]));
?>

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος στην PHP 5.3:

string(1) "b" bool(true) string(1) "b" bool(true) string(1) "a" bool(true) string(1) "b" bool(true)

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος στην PHP 5.4:

string(1) "b" bool(true) Προειδοποίηση: Παράνομη μετατόπιση συμβολοσειράς "1.0" σε /tmp/t.php στη γραμμή 7 string(1) "b" bool(false) Προειδοποίηση: Παράνομη μετατόπιση συμβολοσειράς "x" σε / tmp/t.php στη γραμμή 9 συμβολοσειρά (1) "a" bool(false) string(1) "b" bool(false)

Σχόλιο:

Προσπάθεια πρόσβασης σε μεταβλητές άλλων τύπων (εκτός από πίνακες ή αντικείμενα που υλοποιούν ορισμένες διεπαφές) χρησιμοποιώντας ή {} θα επιστρέψει σιωπηλά ΜΗΔΕΝΙΚΟ.

Σχόλιο:

Η PHP 5.5 πρόσθεσε υποστήριξη για την πρόσβαση σε χαρακτήρες σε γράμματα συμβολοσειρών χρησιμοποιώντας τη σύνταξη ή {} .

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

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

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

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

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

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

ΜΗΔΕΝΙΚΟμετατρέπεται πάντα στην κενή συμβολοσειρά.

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

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

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

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

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

Η τιμή καθορίζεται από την αρχή της συμβολοσειράς. Εάν η γραμμή ξεκινά με μια έγκυρη αριθμητική τιμή, αυτή η τιμή θα χρησιμοποιηθεί. Διαφορετικά η τιμή θα είναι 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 μικρά γουρούνια" ; // Το $foo είναι ακέραιος αριθμός (11)
$foo = 4 + "10.2 Little Piggies" ; // Το $foo είναι float (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). Για να μετατρέψετε χαρακτήρες στους κωδικούς ASCII και πίσω, χρησιμοποιήστε τις συναρτήσεις ord()Και chr().

Λεπτομέρειες υλοποίησης τύπου συμβολοσειράς

Τύπος συμβολοσειράς ( σειρά) στην PHP υλοποιείται ως ένας πίνακας byte και ένας ακέραιος που περιέχει το μήκος του buffer. Δεν περιέχει πληροφορίες σχετικά με τον τρόπο μετατροπής αυτών των byte σε χαρακτήρες, αφήνοντας αυτήν την εργασία στον προγραμματιστή. Δεν υπάρχουν περιορισμοί στα περιεχόμενα μιας συμβολοσειράς, όπως ένα byte με μια τιμή 0 ("NUL" byte) μπορεί να βρίσκεται οπουδήποτε (ωστόσο, να γνωρίζετε ότι ορισμένες λειτουργίες, όπως αναφέρεται σε αυτό το εγχειρίδιο, δεν είναι "δυαδικά ασφαλείς", δηλαδή μπορούν να περάσουν συμβολοσειρές σε βιβλιοθήκες που αγνοούν δεδομένα μετά το NUL -byte).

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

Λαμβάνοντας υπόψη το γεγονός ότι η PHP δεν υπαγορεύει μια συγκεκριμένη κωδικοποίηση για συμβολοσειρές, θα μπορούσε κανείς να αναρωτηθεί πώς κωδικοποιούνται στη συνέχεια οι κυριολεκτικές συμβολοσειρές. Για παράδειγμα, η γραμμή "á" ισοδύναμος "\xE1"(ISO-8859-1), "\xC3\xA1"(UTF-8, μορφή κανονικοποίησης C), "\x61\xCC\x81"(UTF-8, φόρμα κανονικοποίησης D) ή κάποια άλλη πιθανή αναπαράσταση; Η απάντηση είναι ότι η συμβολοσειρά θα κωδικοποιηθεί όπως είναι γραμμένη στο αρχείο του σεναρίου. Έτσι, εάν το σενάριο είναι γραμμένο σε κωδικοποίηση ISO-8859-1, τότε η συμβολοσειρά θα κωδικοποιηθεί σε ISO-8859-1, κ.λπ. Ωστόσο, αυτός ο κανόνας δεν ισχύει όταν είναι ενεργοποιημένη η λειτουργία Zend Multibyte: σε αυτήν την περίπτωση, το σενάριο μπορεί να γραφτεί σε οποιαδήποτε κωδικοποίηση (είτε ρητά καθορίζεται είτε καθορίζεται αυτόματα) και στη συνέχεια να μετατραπεί σε μια συγκεκριμένη εσωτερική κωδικοποίηση, η οποία στη συνέχεια θα χρησιμοποιηθεί για κυριολεκτικά χορδών. Λάβετε υπόψη ότι η κωδικοποίηση σεναρίου (ή η εσωτερική κωδικοποίηση εάν το Zend Multibyte είναι ενεργοποιημένο) έχει ορισμένους περιορισμούς: η κωδικοποίηση πρέπει σχεδόν πάντα να είναι υπερσύνολο του ASCII, όπως το UTF-8 ή το ISO-8859-1. Σημειώστε επίσης ότι οι κωδικοποιήσεις που εξαρτώνται από την κατάσταση, όπου μπορούν να χρησιμοποιηθούν οι ίδιες τιμές byte στην αρχική και στη μη αρχική κατάσταση μετατόπισης, μπορεί να προκαλέσουν προβλήματα.

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

  • Ορισμένες συναρτήσεις υποθέτουν ότι η συμβολοσειρά είναι κωδικοποιημένη σε κάποια κωδικοποίηση ενός byte, αλλά δεν χρειάζεται να ερμηνεύσουν τα byte ως συγκεκριμένους χαρακτήρες για να λειτουργήσουν σωστά. Αυτή η κατηγορία περιλαμβάνει, για παράδειγμα, substr(), strpos(), strlen()Και strcmp(). Ένας άλλος τρόπος σκέψης για αυτές τις λειτουργίες είναι ότι λειτουργούν σε buffer μνήμης, δηλ. εργάζονται απευθείας με τα byte και τις μετατοπίσεις τους. αντισταθμίσεις.
  • Άλλες συναρτήσεις αναμένουν ότι μια κωδικοποίηση θα μεταβιβαστεί ως παράμετρος, ίσως υποθέτοντας κάποια προεπιλεγμένη κωδικοποίηση εάν δεν είχε καθοριστεί μια παράμετρος κωδικοποίησης. Αυτή η λειτουργία είναι
  • Τέλος, υπάρχουν συναρτήσεις που υποθέτουν ότι μια συμβολοσειρά χρησιμοποιεί μια συγκεκριμένη κωδικοποίηση, συνήθως UTF-8. Οι περισσότερες συναρτήσεις από τις επεκτάσεις intl και PCRE εμπίπτουν εδώ (στην τελευταία περίπτωση, μόνο κατά τον καθορισμό του τροποποιητή u). Αν και αυτό γίνεται επίτηδες, η λειτουργία utf8_decode()υπονοεί κωδικοποίηση UTF-8 και utf8_encode()- ISO-8859-1.

Τελικά, η σύνταξη σωστών προγραμμάτων που λειτουργούν με Unicode σημαίνει να αποφεύγετε προσεκτικά τις λειτουργίες που δεν λειτουργούν με το Unicode και είναι πιθανό να καταστρέψουν δεδομένα και να χρησιμοποιείτε έγκυρες συναρτήσεις, συνήθως από τις επεκτάσεις intl και mbstring. Ωστόσο, η χρήση λειτουργιών με δυνατότητα Unicode είναι μια καλή αρχή. Ανεξάρτητα από τις δυνατότητες που παρέχει μια γλώσσα, είναι απαραίτητο να γνωρίζετε την ίδια την προδιαγραφή Unicode. Για παράδειγμα, εάν ένα πρόγραμμα υποθέσει ότι υπάρχουν μόνο πεζά και κεφαλαία γράμματα σε μια γλώσσα, τότε κάνει μεγάλο λάθος.

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

Ας δούμε τη διαφορά μεταξύ διπλών και μεμονωμένων εισαγωγικών στην 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 δευτερόλεπτα.

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

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