Forum und email

Type Juggling

Η PHP δεν απαιτεί (ή υποστηρίζει) σαφή δήλωση τύπων κατά τη δήλωση μεταβλητών. Ένας τύπος μεταβλητής καθορίζεται από το περιεχόμενο με το οποίο αυτή η μεταβλητή θα χρησιμοποιηθεί. Δηλαδή, αν ορίσετε μια τιμή string σε μια μεταβλητή $var , η $var γίνεται string. Αν στη συνέχεια αναθέσετε μια integer τιμή στη $var , τότε γίνεται integer.

Ένα παράδειγμα της αυτόματης μετατροπής τύπου στην PHP είναι ο τελεστής πρόσθεσης '+'. Αν οποιοσδήποτε από τα τελούμενα είναι float, τότε όλα υπολογίζονται ως floats, και το αποτέλεσμα θα είναι float. Διαφορετικά, τα τελούμενα θα ερμηνεύονται ως integers, και το αποτέλεσμα θα είναι επίσης integer. Σημειώστε ότι αυτό ΔΕΝ αλλάζει τους τύπους των ίδιων των τελούμενων. Η μόνη αλλαγή είναι στο πώς υπολογίζονται τα τελούμενα.

<?php
$foo 
"0";  // $foo is string (ASCII 48)
$foo += 2;   // $foo is now an integer (2)
$foo $foo 1.3;  // $foo is now a float (3.3)
$foo "10 Little Piggies"// $foo is integer (15)
$foo "10 Small Pigs";     // $foo is integer (15)
?>

Αν τα τελευταία δυο παραδείγματα σας φάνηκαν περίεργα, δείτε το Μετατροπή του String σε number.

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

Αν θέλετε να ελέγξετε οποιοδήποτε από αυτά τα παραδείγματα σ'αυτό το τμήμα, μπορείτε να χρησιμοποιήσετε τη συνάρτηση var_dump().

Note: Η συμπεριφορά μιας αυτόματης μετατροπής σε array είναι προς το παρόν απροσδιόριστη.

<?php
$a 
"1";     // $a is a string
$a[0] = "f";  // What about string offsets? What happens?
?>

Αφού η PHP (για ιστορικούς λόγους) υποστηρίζει indexing σε strings μέσω offsets χρησιμοποιώντας την ίδια σύνταξη όπως και στο indexing των arrays, το παράδειγμα παραπάνω οδηγεί σε ένα πρόβλημα: θα πρέπει το $a να γίνει array με το πρώτο στοιχείο του να είναι το "f", ή θα πρέπει το "f" να γίνει ο πρώτος χαρακτήρας του string $a?
Οι τρέχουσες εκδόσεις της PHP μεταγλωττίζουν τη δεύτερη ανάθεση ως string offset πιστοποίηση, συνεπώς η $a γίνεται "f", το αποτέλεσμα όμως αυτής της αυτόματης μετατροπής θα πρέπει να θεωρηθεί απροσδιόριστο. Η PHP 4 εισήγαγε τη νέα σύνταξη χρηιμοποιώντας curly bracket για να αποκτήσει πρόσβαση σε χαρακτήρες ενός string, συνεπώς χρησιμοποιήστε αυτή τη σύνταξη αντί αυτής που παρουσιάστηκε παραπάνω:
<?php
$a    
"abc"// $a is a string
$a{1} = "f";   // $a is now "afc"
?>
Δείτε το τμήμα με τίτλο Πρόσβαση των String με χαρακτήρες για περισσότερες πληροφορίες.

Type Casting

Η μετατροπή τύπων (ή Type casting) στην PHP δουλεύει σχεδόν όπωε και στη C: το όνομα του επιθυμητού τύπου γράφετε σε παρενθέσεις πριν από τη μεταβλητή στην οποία θα γίνει το cast.

<?php
$foo 
10;   // $foo is an integer
$bar = (boolean) $foo;   // $bar is a boolean
?>

Τα επιτρεπόμενα casts είναι τα:

  • (int), (integer) - cast σε integer
  • (bool), (boolean) - cast σε boolean
  • (float), (double), (real) - cast σε float
  • (string) - cast σε string
  • (array) - cast σε array
  • (object) - cast σε object

Σημειώστε ότι τα tabs και τα spaces επιτρέπονται μέσα στις παρενθέσεις, συνεπώς τα ακόλουθα είναι εξίσου λειτουργικά:

<?php
$foo 
= (int) $bar;
$foo = ( int ) $bar;
?>

Note: Αντί να κάνουμε cast μιας μεταβλητής σε string, μπορείτε επίσης να κλείσετε τη μεταβλητή σε διπλά εισαγωγικά.

<?php
$foo 
10;            // $foo is an integer
$str "$foo";        // $str is a string
$fst = (string) $foo// $fst is also a string

// This prints out that "they are the same"
if ($fst === $str) {
    echo 
"they are the same";
}
?>

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