digimyth Δημοσ. 11 Φεβρουαρίου 2011 Δημοσ. 11 Φεβρουαρίου 2011 Έχω κάνει μια περίπλοκη κατασκευή ενός αντικειμένου (κλάσης) και προσπαθώ μέσα από την κλάση να αποθηκεύσω ένα αντικείμενο στη μεταβλητή $_SESSION αλλά δε το αποθηκεύει... Για παράδειγμα ας υποθέσουμε ότι δημιουργώ ένα καινούργιο instance της ίδιας κλάσης και το αποθηκεύω στο $_SESSION: > function __construct() { session_start(); $_SESSION[ 'Session' ] = new self(); session_write_close(); } Όταν πάω να το ελέγξω έξω από την κλάση (πχ σε μια άλλη σελίδα) δε το βλέπει. και το isset παράγει false!: > session_start(); if (isset($_SESSION[ 'Session' ])) //FALSE { } ... Είναι δηλαδή σαν να μην μπορεί να αποθηκεύσει το αντικείμενο μέσα από την κλάση. Ξέρει κανείς γιατί γίνεται αυτό; Ευχαριστώ
hkosmidi Δημοσ. 11 Φεβρουαρίου 2011 Δημοσ. 11 Φεβρουαρίου 2011 Θα κάνεις: > $self = new self(); $_SESSION['lala'] = serialize($self) αντίστοιχα μετά θα χρησιμοποιήσεις την deserialize
digimyth Δημοσ. 11 Φεβρουαρίου 2011 Μέλος Δημοσ. 11 Φεβρουαρίου 2011 Όταν κάνω serialize() όμως και μετά κάνω μια τροποποίηση στην κλάση πρέπει να το ξαναπεράσω στο $_SESSION έτσι; Το serialize() κοστίζει στον επεξεργαστή... Μπορεί να γίνει να το κάνω μόνο μια φορά ή να περνάω ίσως το δείκτη του αντικειμένου; Ευχαριστώ
ΠάρηςΓ Δημοσ. 12 Φεβρουαρίου 2011 Δημοσ. 12 Φεβρουαρίου 2011 Δε νομιζω πως χρειαζεσαι serialize. Αυτο που εχεις γραψει μου φαινεται για λογικο σφαλμα... function __construct(){ session_start(); $_SESSION[ 'Session' ] = new self(); Αυτο δεν ειναι endless loop; Το new self() , δε θα καλει παλι το construct; Αν θες το τρεχον αντικειμενο πρπει να βαλεις αντι new self() το $this
digimyth Δημοσ. 12 Φεβρουαρίου 2011 Μέλος Δημοσ. 12 Φεβρουαρίου 2011 Μάλλον το να το θέσω έτσι ήταν αποτυχία γιατί ΠαρηςΓ έχεις δίκιο, οπότε θα το θέσω όπως πραγματικά το έχω κάνει: > final class Sessions { private static $obj_instance; private static $obj_created = false; static public function Create_Object_Once()//Once per session { if ( !self :: $obj_created ) { self :: $obj_instance = new Sessions(); self :: $obj_created = true; } return self :: $obj_instance; } function __construct() { session_start(); $_SESSION[ 'helloworld' ] = self :: $obj_instance; //Αποτυχία εκχώρησης! session_write_close(); } } Σε άλλη σελίδα καλώ: > require_once( 'Sessions.php' ); session_start(); if ( isset( $_SESSION[ 'helloworld' ] ) ) { $mSession = $_SESSION[ 'helloworld' ]; session_write_close(); } else { session_write_close(); $mSession = Sessions :: Create_Object_Once();//Once per session } Αυτό που κάνει ο παραπάνω κώδικας θεωρητικά είναι να δημιουργεί το αντικείμενο κλάσης Session μέσα από την ίδια την κλάση και έπειτα να το βάζει στο $_SESSION. Το κομμάτι της δημιουργίας δουλεύει μια χαρά αλλά το κομμάτι της αποθήκευσης στο $_SESSION δε δουλεύει. Επίσης έχω τη στατική μεταβλητή $obj_instance που θεωρητικά κρατάει το αντικείμενο που έχω δημιουργήσει και μετά το περνάει στη μεταβλητή $_SESSION .
ΠάρηςΓ Δημοσ. 12 Φεβρουαρίου 2011 Δημοσ. 12 Φεβρουαρίου 2011 Νομιζω πως ειναι λογικο διοτι οταν καλεις self :: $obj_instance = new Sessions(); Πάει στο construct... και κανει $_SESSION[ 'helloworld' ] = self :: $obj_instance; Ομως το $obj_instance δεν εχει προλαβει να παρει τιμή... καλύτερα να βαλεις $this κανε print_r($obj_instance); Προσπαθεις να υλοποιήσεις κάποιο pattern;
digimyth Δημοσ. 12 Φεβρουαρίου 2011 Μέλος Δημοσ. 12 Φεβρουαρίου 2011 χμμ λες ότι δε προλαβαίνει να πάρει τιμή ε...?! Το $this δε γίνεται να το χρησιμοποιήσω γιατί με static variables δε γίνεται... Προσπαθώ να υλοποιήσω μια κλάση για το Session αλλά χωρίς να χρειάζεται να κάνω πολλά εκτός κλάσης για να τη δημιουργήσω και να την αποθηκεύσω στο $_SESSION. Δηλαδή, δημιουργώ με μια μόνο γραμμή την κλάση και την αποθηκεύω στο $_SESSION χωρίς το τελευταίο να το χρησιμοποιώ εκτός κλάσης. Εκτός κλάσης πάει μόνο αυτό: >$mSession = Sessions :: Create_Object_Once();
ΠάρηςΓ Δημοσ. 12 Φεβρουαρίου 2011 Δημοσ. 12 Φεβρουαρίου 2011 $_SESSION[ 'helloworld' ] = self :: $obj_instance; //Αποτυχία εκχώρησης! $_SESSION[ 'helloworld' ] = $this; αυτό εννοώ δοκιμασε το Αλλιως μετεφερε αυτες τις γραμμες $_SESSION[ 'helloworld' ] = self :: $obj_instance; //Αποτυχία εκχώρησης! session_write_close(); κατω απο το self :: $obj_instance = new Sessions();
digimyth Δημοσ. 12 Φεβρουαρίου 2011 Μέλος Δημοσ. 12 Φεβρουαρίου 2011 $_SESSION[ 'helloworld' ] = self :: $obj_instance; //Αποτυχία εκχώρησης! $_SESSION[ 'helloworld' ] = $this; αυτό εννοώ δοκιμασε το Το να βάλω το $this σκέτο τι θα κάνει; Το παρακάτω δεν ισχύει γιατί με το new δημιουργείται ένα νέο instance της κλάσης οπότε φαντάσου ότι τρέχει η συνάρτηση static public function Create_Object_Once() και παράγει ένα νέο __construct. Οπότε δεν πηγαίνει στο παρακάτω που λες αλλά σε ένα διαφορετικό. Αλλιως μετεφερε αυτες τις γραμμες $_SESSION[ 'helloworld' ] = self :: $obj_instance; //Αποτυχία εκχώρησης! session_write_close(); κατω απο το self :: $obj_instance = new Sessions(); Έχω μια μικρή υποψία ότι μπορεί να φταίει το private της $obj_instance το οποίο λογικά δε μπορεί να εκχωρηθεί στο $_SESSION γιατί αυτόματα ακυρώνεται. Θα το δοκιμάσω και θα απαντήσω... Edit Ότι και να κάνω όταν στη συνάρτηση Create_Object_Once() πάω να χρησιμοποιήσω το: $_SESSION[ 'helloworld' ] = self :: $obj_instance; ή οτιδήποτε παραπλήσιο όπως: $_SESSION[ 'helloworld' ] = $this; $_SESSION[ 'helloworld' ] = new static(); //php 5.3 δε μου εμφανίζει ΚΑΝ τη σελίδα!! Με το που κάνω comment τη γραμμή με το $_SESSION τρέχει κανονικά. Δε μπορώ να το καταλάβω... Ίσως δε γίνεται να το χρησιμοποιήσω μέσα από static function > static public function Create_Object_Once() { if ( !self :: $obj_created ) { session_start(); $_SESSION[ 'helloworld' ] = new static();//php 5.3 session_write_close(); self :: $obj_created = true; } return $_SESSION[ 'helloworld' ]; }
ΠάρηςΓ Δημοσ. 13 Φεβρουαρίου 2011 Δημοσ. 13 Φεβρουαρίου 2011 $_SESSION[ 'helloworld' ] = self :: $obj_instance; ή οτιδήποτε παραπλήσιο όπως: $_SESSION[ 'helloworld' ] = $this; $_SESSION[ 'helloworld' ] = new static(); //php 5.3 Μαλλον δεν θέλει $ $_SESSION[ 'helloworld' ] = self :: obj_instance; Το this δεν ειπα να το βαλεις εκει αλλα στο _construct... $this Αν δε σου εμφανίζει καν τη σελίδα σημαινει πως υπαρχει ερορ .. πρεπει να ρυθμισεις να φαινεται. Οσο για το this > function __construct() { session_start(); $_SESSION[ 'helloworld' ] = $this; session_write_close(); } Θα αποθηκεύσει το τρεχον αντικειμενο. self :: obj_instance = new Sessions(); Αυτο εδω καταλαβαινεις τι κάνει;; Για να γινει το instance πρώτα καλείται η construct και μετα αποθηκεύεται το reference στην Object_instance... Oταν παει στην construct δεν εχει οριστει το αλλο..Με τη δευτερη κλήση απο οτι φαινεται θα το πάρει ομως.
digimyth Δημοσ. 13 Φεβρουαρίου 2011 Μέλος Δημοσ. 13 Φεβρουαρίου 2011 Μαλλον δεν θέλει $ $_SESSION[ 'helloworld' ] = self :: obj_instance; Το this δεν ειπα να το βαλεις εκει αλλα στο _construct... $this Τον παραπάνω κώδικα τον έκανα με άλλο τρόπο για να το δοκιμάσω... Ούτως η άλλως απαγορεύεται να χρησιμοποιήσεις το $this σε στατικές μεταβλητές αλλά και το αντικείμενο δεν είναι δημιουργημένο για να μπορεί να πάρει το $this. self :: obj_instance = new Sessions(); Αυτο εδω καταλαβαινεις τι κάνει;; Για να γινει το instance πρώτα καλείται η construct και μετα αποθηκεύεται το reference στην Object_instance... Oταν παει στην construct δεν εχει οριστει το αλλο..Με τη δευτερη κλήση απο οτι φαινεται θα το πάρει ομως. Αστειεύεσαι έτσι;!! Εσύ ξέρεις τι κάνει; Λες να έγραψα τον κώδικα και να το έβαλα τυχαία εκεί;!! Έλεος... Η συνάρτηση Create_Object_Once() καλείται χωρίς να έχει δημιουργηθεί το αντικείμενο, για αυτό λέγεται και static. Οπότε θεωρητικά καλείται αυτή η συνάρτηση για να φτιάξει ένα νέο αντικείμενο. Όταν εκτελείται η εντολή >self :: $obj_instance = new Sessions(); τότε καλείται να δημιουργηθεί ένα νέο αντικείμενο και άρα θα κληθεί το __construct() του νέου αντικειμένου και όχι αυτό που βλέπεις παρακάτω της μεθόδου Create_Object_Once(). Έτσι όπως το έκανα στον τελευταίο κώδικα, αφαίρεσα όλο τον κώδικα του __construct και τον έβαλα στην Create_Object_Once() ώστε να μην αντιμετωπίζω λογικά προβλήματα ή οτιδήποτε άλλο. Παρόλα αυτά όμως δε το τρέχει! Επίσης τα σφάλματα μου εμφανίζονται αλλά μόνο στο συγκεκριμένο δεν εμφανίζονται Μου εμφανίζει ο chrome το error: Error 101 (net::ERR_CONNECTION_RESET): Unknown Error Μάλλον είναι λογικό το λάθος. Δε βλέπω άλλη εξήγηση. Το πρώτο αντικείμενο που καλείται να δημιουργήσει τον ίδιο του τον εαυτό και να τον αποθηκεύσει κιόλας, δεν είναι δημιουργημένο οπότε είναι κάτι σαν ζόμπι... Ίσως αυτό να φταίει. Τέσπα αφαίρεσα όλο αυτό το σκεπτικό και απλά θα δημιουργώ το αντικείμενο έξω από την κλάση και θα βάζω έξω από την κλάση το αντικείμενο στο $_SESSION. Ευχαριστώ
ΠάρηςΓ Δημοσ. 13 Φεβρουαρίου 2011 Δημοσ. 13 Φεβρουαρίου 2011 Θα το κανω μολις παω σπιτι να δεις οτι δουλευει ετσι .. συνάρτηση Create_Object_Once() καλείται χωρίς να έχει δημιουργηθεί το αντικείμενο, για αυτό λέγεται και static. Οπότε θεωρητικά καλείται αυτή η συνάρτηση για να φτιάξει ένα νέο αντικείμενο. Όταν εκτελείται η εντολή self :: $obj_instance = new Sessions(); τότε καλείται να δημιουργηθεί ένα νέο αντικείμενο και άρα θα κληθεί το __construct() του νέου αντικειμένου και όχι αυτό που βλέπεις παρακάτω της μεθόδου Create_Object_Once(). Μεχρι το σημειο που λες για το construct συμφωνούμε.Ναι το construct του νεου αντικειμενου θα κληθει μονο που το construct του νεου αντικειμενου θα βαλει το αντικειμενο στη session .ομως δεν εχει τι να βαλει γιατι θα ειναι null στην αρχή.
ΠάρηςΓ Δημοσ. 13 Φεβρουαρίου 2011 Δημοσ. 13 Φεβρουαρίου 2011 Εγώ το δοκιμασα με αυτη την αλλαγή μια χαρά δουλεύει. > <?php final class Sessions{ private static $obj_instance; private static $obj_created = false; static public function Create_Object_Once()//Once per session { if ( !self :: $obj_created ) { self :: $obj_instance = new Sessions(); self :: $obj_created = true; } return self :: $obj_instance; } function __construct() { session_start(); $_SESSION[ 'helloworld' ] = $this;//self :: $obj_instance; //Αποτυχία εκχώρησης! session_write_close(); } } ?> Sessions.php > <?php require_once( 'Sessions.php' ); session_start(); if ( isset( $_SESSION[ 'helloworld' ] ) ) { $mSession = $_SESSION[ 'helloworld' ]; echo "iparhei"; session_write_close(); } else { echo "iparheiOHI"; session_write_close(); $mSession = Sessions :: Create_Object_Once();//Once per session } ?>
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.