Forum und email

Strings

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

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

Σύνταξη

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

Μονό εισαγωγικό (Single quoted)

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

Για να ορίσετε ένα απλό εισαγωγικό, θα χρειαστεί να προσθέσετε ένα backslash (\), όπως και σε πολλές άλλες γλώσσες. Αν το backslash πρέπει να εμφανιστεί πριν από ένα απλό εισαγωγικό ή στο τέλος του string, θα χρειαστεί να το διπλασιάσετε. Σημειώστε ότι αν προσπαθήσετε να αποφύγετε (escape) οποιονδήποτε άλλο χαρακτήρα, το backslash θα τυπωθεί! Συνήθως δεν υπάρχει ανάγκη να θέλουμε να αποφύγουμε (escape) την εμφάνιση του ίδιου του backslash.

Note: Στην PHP 3, όταν συμβαίνει αυτό θα εμφανιστεί μια προειδοποίηση στο επίπεδο E_NOTICE .

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

<?php
echo 'this is a simple string';

echo 
'You can also have embedded newlines in 
strings this way as it is
okay to do'
;

// Outputs: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';

// Outputs: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';

// Outputs: You deleted C:\*.*?
echo 'You deleted C:\*.*?';

// Outputs: This will not expand: \n a newline
echo 'This will not expand: \n a newline';

// Outputs: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>

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

Αν το string περικλείεται σε διπλά εισαγωγικά ("), η PHP καταλαβαίνει περισσότερες ακολουθίες από escape (escape sequences) για ειδικούς χαρακτήρες:

Χαρακτήρες που εξαιρούνται (Escaped characters)
sequence meaning
\n linefeed (LF or 0x0A (10) in ASCII)
\r carriage return (CR or 0x0D (13) in ASCII)
\t horizontal tab (HT or 0x09 (9) in ASCII)
\\ backslash
\$ dollar sign
\" double-quote
\[0-7]{1,3} η ακολουθία των χαρακτήρων που ταιριάζουν στην κανονική έκφραση είναι ένας χαρακτήρας στο οχταδικό σύστημα
\x[0-9A-Fa-f]{1,2} η ακολουθία των χαρακτήρων που ταιριάζουν στην κανονική έκφραση είναι ένας χαρακτήρας στο δεκαεξαδικό σύστημα

Επαναλαμβάνουμε ότι αν προσπαθήσετε να αποφύγετε (escape) οποιοδήποτε άλλο χαρακτήρα, το backslash θα τυπωθεί!

Αλλά το πιο σημαντικό χαρακτηριστικό των strings που ορίζονται σε διπλά εισαγωγικά είναι το γεγονός ότι τα ονόματα των μεταβλητών θα επεκταθούν. Δείτε το string parsing για λεπτομέρειες.

Heredoc

Ένας άλλος τρόπος για να ορίσουμε strings είναι χρησιμοποιώντας τη σύνταξη heredoc ("<<<"). Θα πρέπει να προσθέσουμε έναν identifier μετά τα <<<, στη συνέχεια το string, και μετά τον ίδιο identifier για να κλείσουμε την αναφορά.

Ο identifier κλεισίματος πρέπει να αρχίζει στην πρώτη στήλη της γραμμής. Επίσης, ο identifier που χρησιμοποιείται πρέπει να ακολουθεί τους ίδιους κανόνες ονοματολογίας όπως και οποιοδήποτε άλλο label στην PHP: πρέπει να περιέχει μόνο αλφαριθμητικούς χαρακτήρες και underscores, και πρέπει να αρχίζει με ένα μη αριθμητικό χαρακτήρα ή underscore.

Warning

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

Αν αυτός ο κανόνας δεν τηρείται και ο identifier κλεισίματος δεν είναι "ξεκάθαρος" τότε δεν θεωρείται ότι είναι identifier κλεισίματος και η PHP θα συνεχίσει να ψάχνει για έναν τέτοιο. Αν σ'αυτή την περίπτωση ένας κατάλληλος identifier κλεισίματος δεν βρεθεί τότε ένα parse error θα εμφανιστεί με τον αριθμό της γραμμής που τελειώνει το script.

Το Heredoc text συμπεριφέρεται ακριβώς όπως το double-quoted string, χωρίς όμως τα double-quotes. Αυτό σημαίνει πως δεν χρειάζεται να προσπαθείτε να κάνετε escape quotes στα έγγραφα σας εδώ, αλλά μπορείτε να χρησιμοποιείτε τους κώδικες για escape που αναφέρθηκαν παραπάνω. Οι μεταβλητές επεκτείνονται, αλλά η ίδια προσοχή πρέπει να δίνεται όταν εκφράζουμε σύνθετες μεταβλητές μέσα σε ένα τέτοιο έγγραφο όπως και με τα strings.

Example#1 Παράδειγμα Heredoc string quoting

<?php
$str 
= <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

/* More complex example, with variables. */
class foo
{
    var 
$foo;
    var 
$bar;

    function 
foo()
    {
        
$this->foo 'Foo';
        
$this->bar = array('Bar1''Bar2''Bar3');
    }
}

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

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some 
{$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>

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

Μεταγλώττιση Μεταβλητών

Όταν ένα string ορίζεται σε double quotes ή με heredoc, οι μεταβλητές μεταγλωττίζονται μέσα σ'αυτό.

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

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

Απλή σύνταξη

Αν το σύμβολο του δολαρίου ($) εμφανιστεί, ο parser (μεταγλωττιστής) θα πάρει όσο πιο πολλά tokens μπορεί για να σχηματίσει ένα έγκυρο όνομα μεταβλητής. Βάλτε το όνομα της μεταβλητής σε curly braces αν θέλετε να καθορίσετε ρητά το τέλος του ονόματος.

<?php
$beer 
'Heineken';
echo 
"$beer's taste is great"// works, "'" is an invalid character for varnames
echo "He drank some $beers";   // won't work, 's' is a valid character for varnames
echo "He drank some ${beer}s"// works
echo "He drank some {$beer}s"// works
?>

Ομοιώς, μπορείτε να έχετε ένα array index ή μία ιδιότητα αντικειμένου για μεταγλώττιση. Στα ευρετήρια πινάκων, η αγκύλη κλεισίματος (]) ορίζει το τέλος του ευρετηρίου. Για τις ιδιότητες αντικειμένων οι ίδιοι κανόνες εφαρμόζονται όπως και στις απλές μεταβλητές, ενώ με τις ιδιότητες αντικειμένων δεν υπάρχει τέτοιο trick όπως αυτό με τις μεταβλητές.

<?php
// These examples are specific to using arrays inside of strings.
// When outside of a string, always quote your array string keys 
// and do not use {braces} when outside of strings either.

// Let's show all errors
error_reporting(E_ALL);

$fruits = array('strawberry' => 'red''banana' => 'yellow');

// Works but note that this works differently outside string-quotes
echo "A banana is $fruits[banana].";

// Works
echo "A banana is {$fruits['banana']}.";

// Works but PHP looks for a constant named banana first
// as described below.
echo "A banana is {$fruits[banana]}.";

// Won't work, use braces.  This results in a parse error.
echo "A banana is $fruits['banana'].";

// Works
echo "A banana is " $fruits['banana'] . ".";

// Works
echo "This square is $square->width meters broad.";

// Won't work. For a solution, see the complex syntax.
echo "This square is $square->width00 centimeters broad.";
?>

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

Σύνθετη (curly) σύνταξη

Η σύνταξη αυτή δεν καλείται σύνθετη επειδή είναι η ίδια σύνθετη, αλλά επειδή μπορείτε να συμπεριλάβετε σύνθετες εκφράσεις με αυτόν τον τρόπο.

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

<?php
// Let's show all errors
error_reporting(E_ALL);

$great 'fantastic';

// Won't work, outputs: This is { fantastic}
echo "This is { $great}";

// Works, outputs: This is fantastic
echo "This is {$great}";
echo 
"This is ${great}";

// Works
echo "This square is {$square->width}00 centimeters broad."

// Works
echo "This works: {$arr[4][3]}";

// This is wrong for the same reason as $foo[bar] is wrong 
// outside a string.  In otherwords, it will still work but
// because PHP first looks for a constant named foo, it will
// throw an error of level E_NOTICE (undefined constant).
echo "This is wrong: {$arr[foo][3]}"

// Works.  When using multi-dimensional arrays, always use
// braces around arrays when inside of strings
echo "This works: {$arr['foo'][3]}";

// Works.
echo "This works: " $arr['foo'][3];

echo 
"You can even write {$obj->values[3]->name}";

echo 
"This is the value of the var named $name: {${$name}}";
?>

String που προσπελαύνονται από χαρακτήρες

Οι χαρακτήρες μέσα σε strings μπορούν να προσπελαστούν ορίζοντας το zero-based offset του επιθυμητού χαρακτήρα μετά το string σε curly braces.

Note: Για προς τα πίσω συμβατότητα, μπορείτε ακόμη να χρησιμοποιείτε array-braces για τον ίδιο σκοπό. Πάντως, αυτή η σύνταξη δεν συνίσταται στην PHP 4.

Example#2 Μερικά παραδείγματα από strings

<?php
// Get the first character of a string
$str 'This is a test.';
$first $str{0};

// Get the third character of a string
$third $str{2};

// Get the last character of a string.
$str 'This is still a test.';
$last $str{strlen($str)-1}; 
?>

Χρήσιμες συναρτήσεις και τελεστές

Τα strings μπορούν να συννενωθούν χρησιμοποιώντας τον τελεστή '.' (τελεία). Σημειώστε ότι ο '+' (συν) τελεστής δε θα δουλέψει σ'αυτή την περίπτωση. Παρακαλώ δείτε το Τελεστές για Strings για περισσότερες πληροφορίες.

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

Δείτε το τμήμα για συναρτήσεις των strings για γενικές συναρτήσεις, τις συναρτήσεις κανονικών εκφράσεων για προχωρημένη αναζήτηση&αντικατάσταση (σε δυο εκδόσεις: Perl και POSIX extended).

Υπάρχουν επίσης συναρτήσεις για URL-strings, και συναρτήσεις για κρυπτογράφηση/αποκρυπτογράφηση strings (mcrypt και mhash).

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

Μετατρέποντας σε string

Μπορείτε να μετατρέψετε μια τιμή σε string χρησιμοποιώντας την (string) cast (μεατροπή), ή τη συνάρτηση strval(). Η μετρατοπή σε String γίνεται αυτόματα για σας στην εμβέλεια της έκφρασης όταν απαιτείται ένα string. Αυτό συμβαίνει όταν χρησιμοποιείτε τις echo() ή print() συναρτήσεις, ή όταν συγκρίνετε μια μεταβλητή τιμή με ένα string. Διαβάστε στο manual τα τμήματα σχετικά με Τύπους και Type Juggling για να καταλάβετε καλύτερα. Δείτε επίσης settype().

Μια boolean TRUE τιμή μετατρέπεται στο string "1", ενώ η FALSE τιμή αναπαρίσταται από το "" (κενό string). Μ'αυτόν τον τρόπο μπορείτε να μετατρέψετε τις τιμές από boolean σε string και αντιστρόφως.

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

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

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

Τα Resources πάντα μετατρέπονται σε strings με τη δομή "Resource id #1" όπου το 1 είναι ο μοναδικός αριθμός του resource που ανατίθεται από την PHP κατά τη διάρκεια της εκτέλεσης. Αν θέλετε να πάρετε τον τύπο του resource, χρησιμοποιείστε την get_resource_type().

Το NULL μετατρέπεται πάντα σε κενό string.

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

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

Μετατροπή των Strings σε αριθμούς

Όταν ένα string υπολογίζεται σαν αριθμητική τιμή, η τιμή που προκύπτει και ο τύπος της ορίζονται ως ακολούθως.

Το string θα υπολογιστεί ως float αν περιέχει οποιοδήποτε από τους χαρακτήρες '.', 'e', or 'E'. Διαφορετικά, θα υπολογιστεί ως ακέραιος.

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

<?php
$foo 
"10.5";                // $foo is float (11.5)
$foo "-1.3e3";              // $foo is float (-1299)
$foo "bob-1.3e3";           // $foo is integer (1)
$foo "bob3";                // $foo is integer (1)
$foo "10 Small Pigs";       // $foo is integer (11)
$foo "10.2 Little Piggies"// $foo is float (14.2)
$foo "10.0 pigs " 1;          // $foo is float (11)
$foo "10.0 pigs " 1.0;        // $foo is float (11)     
?>

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

Αν θέλετε να ελένξετε κάποιο από τα παραδείγματα σ'αυτό το τμήμα, μπορείτε να κάνετε cut και paste στα παραδείγματα και να εισάγετε την ακόλουθη γραμμή για να δείτε μόνοι σας τι συμβαίνει:

<?php
echo "\$foo==$foo; type is " gettype ($foo) . "<br />\n";
?>

Μην περιμένετε να πάρετε τον κώδικα από έναν χαρακτήρα απλά μετατρέποντας τον σε ακέραιο (όπως θα κάνατε στη C για παράδειγμα). Χρησιμοποιήστε τις συναρτήσεις ord() και chr() για μετατροπές ανάμεσα σε charcodes και characters.