Forum und email

Serializing αντικείμενα - αντικείμενα σε session

Note: Στην PHP 3, τα αντικείμενα θα χάσουν το σύνδεσμο τους με την κλάση κατά τη διαδικασία του serialization και του unserialization. Η μεταβλητή που προκύπτει είναι τύπου αντικειμένου, αλλά δεν έχει κλάσεις και μεθόδους. Συνεπώς είναι σχετικά άχρηστη (έχει γίνει σαν πίνακας με αστεία-περίεργη σύνταξη).

Caution

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

Η serialize() επιστρέφει ένα string που περιέχει μια byte-stream αναπαράσταση οποιασδήποτε τιμής που μπορεί να αποθηκευτεί στην PHP. Η unserialize() μπορεί να χρησιμοποιήσει αυτό το string για να ξαναδημιουργήσει τις αρχικές τιμές της μεταβλητής. Χρησιμοποιώντας την serialize για να αποθηκεύσουμε ένα αντικείμενο, θα επιτύχουμε την αποθήκευση όλων των μεταβλητών σε ένα αντικείμενο. Οι συναρτήσεις ενός αντικειμένου δε θα αποθηκευτούν, μόνο το όνομα της κλάσης.

Προκειμένου να μπορούμε να unserialize() ένα αντικείμενο, η κλάση αυτού του αντικειμένου πρέπει να προσδιοριστεί. Δηλαδή, αν έχετε ένα αντικείμενο $a μια κλάσης A στην page1.php και κάνετε serialize σ'αυτό, θα πάρετε ένα string που αναφέρετε στην κλάση A και περιέχει όλες τις τιμές μεταβλητών που περιέχονται στην $a. Αν θέλετε να μπορείτε να κάνετε unserialize αυτό στην page2.php, ξαναδημιουργώντας την $a της κλάσης A, ο προσδιορισμός της κλάσης A πρέπει να υπάρχει στην page2.php. Αυτό μπορεί να γίνει για παράδειγμα αποθηκεύοντας τον ορισμό της κλάσης A σε ένα εμπεριεχόμενο αρχείο και συμπεριλαμβάνοντας το αρχείο αυτό τόσο στην page1.php όσο και στην page2.php.

<?php
// classa.inc:
  
  
class 
  
{
      var 
$one 1;
    
      function 
show_one()
      {
          echo 
$this->one;
      }
  }
  
// page1.php:

  
include("classa.inc");
  
  
$a = new A;
  
$s serialize($a);
  
// store $s somewhere where page2.php can find it.
  
$fp fopen("store""w");
  
fputs($fp$s);
  
fclose($fp);

// page2.php:
  
  // this is needed for the unserialize to work properly.
  
include("classa.inc");

  
$s implode("", @file("store"));
  
$a unserialize($s);

  
// now use the function show_one() of the $a object.  
  
$a->show_one();
?>

Αν χρησιμοποιείτε sessions και την session_register() για να κάνετε register αντικείμενα, αυτά τα αντικείμενα γίνονται serialize αυτόματα στο τέλος κάθε σελίδας PHP, και γίνονται unserialize αυτόματα σε κάθε μια από τις ακόλουθες σελίδες. Αυτό βασικά σημαίνει ότι αυτά τα αντικείμενα μπορούν να εμφανιστούν σε οποιαδήποτε από τις σελίδες σας μόλις γίνουν μέρος του session.

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

Συνεπώς, αν στο παραπάνω παράδειγμα το $a γίνει μέρος μιας session τρέχοντας την session_register("a"), θα πρέπει να συνπεριλάβετε το αρχείο classa.inc σε όλες τις σελίδες σας, όχι μόνο στην page1.php και page2.php.