Προς το περιεχόμενο

Αποθήκευση αντικειμένου στην $_SESSION μέσα από κλάση


digimyth

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω κάνει μια περίπλοκη κατασκευή ενός αντικειμένου (κλάσης) και προσπαθώ μέσα από την κλάση να αποθηκεύσω ένα αντικείμενο στη μεταβλητή $_SESSION αλλά δε το αποθηκεύει...frown.png

Για παράδειγμα ας υποθέσουμε ότι δημιουργώ ένα καινούργιο instance της ίδιας κλάσης και το αποθηκεύω στο $_SESSION:

>

function __construct()
{

  session_start();
  $_SESSION[ 'Session' ] = new self();
  session_write_close();
}

 

Όταν πάω να το ελέγξω έξω από την κλάση (πχ σε μια άλλη σελίδα) δε το βλέπει. και το isset παράγει false!:

>
session_start();
if (isset($_SESSION[ 'Session' ])) //FALSE
{
}
...

Είναι δηλαδή σαν να μην μπορεί να αποθηκεύσει το αντικείμενο μέσα από την κλάση.

 

Ξέρει κανείς γιατί γίνεται αυτό;

 

Ευχαριστώ

Δημοσ.

Όταν κάνω serialize() όμως και μετά κάνω μια τροποποίηση στην κλάση πρέπει να το ξαναπεράσω στο $_SESSION έτσι; Το serialize() κοστίζει στον επεξεργαστή...

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

Ευχαριστώ

Δημοσ.

Δε νομιζω πως χρειαζεσαι serialize.

Αυτο που εχεις γραψει μου φαινεται για λογικο σφαλμα...

 

function __construct(){ session_start(); $_SESSION[ 'Session' ] = new self();

 

Αυτο δεν ειναι endless loop; Το new self() , δε θα καλει παλι το construct;

Αν θες το τρεχον αντικειμενο πρπει να βαλεις αντι new self() το $this

Δημοσ.

Μάλλον το να το θέσω έτσι ήταν αποτυχία γιατί ΠαρηςΓ έχεις δίκιο, οπότε θα το θέσω όπως πραγματικά το έχω κάνει:

>

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 .

Δημοσ.

Νομιζω πως ειναι λογικο διοτι οταν καλεις

 

self :: $obj_instance = new Sessions();

 

Πάει στο construct...

 

και κανει

 

$_SESSION[ 'helloworld' ] = self :: $obj_instance;

 

Ομως το $obj_instance δεν εχει προλαβει να παρει τιμή... καλύτερα να βαλεις $this

κανε print_r($obj_instance);

 

Προσπαθεις να υλοποιήσεις κάποιο pattern;

Δημοσ.

χμμ λες ότι δε προλαβαίνει να πάρει τιμή ε...?! huh.gif

Το $this δε γίνεται να το χρησιμοποιήσω γιατί με static variables δε γίνεται...

Προσπαθώ να υλοποιήσω μια κλάση για το Session αλλά χωρίς να χρειάζεται να κάνω πολλά εκτός κλάσης για να τη δημιουργήσω και να την αποθηκεύσω στο $_SESSION.

Δηλαδή, δημιουργώ με μια μόνο γραμμή την κλάση και την αποθηκεύω στο $_SESSION χωρίς το τελευταίο να το χρησιμοποιώ εκτός κλάσης.

Εκτός κλάσης πάει μόνο αυτό:

>$mSession = Sessions :: Create_Object_Once();

Δημοσ.

$_SESSION[ 'helloworld' ] = self :: $obj_instance; //Αποτυχία εκχώρησης!

$_SESSION[ 'helloworld' ] = $this;

 

αυτό εννοώ :)δοκιμασε το

 

Αλλιως μετεφερε αυτες τις γραμμες

 

$_SESSION[ 'helloworld' ] = self :: $obj_instance; //Αποτυχία εκχώρησης!

session_write_close();

 

κατω απο το

self :: $obj_instance = new Sessions();

Δημοσ.

$_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

 

δε μου εμφανίζει ΚΑΝ τη σελίδα!! mad.png

Με το που κάνω comment τη γραμμή με το $_SESSION τρέχει κανονικά. Δε μπορώ να το καταλάβω...

Ίσως δε γίνεται να το χρησιμοποιήσω μέσα από static function frown.pngfrown.png

>

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' ];
 	}

Δημοσ.

$_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 δεν εχει οριστει το αλλο..Με τη δευτερη κλήση απο οτι φαινεται θα το πάρει ομως.

Δημοσ.

Μαλλον δεν θέλει $

$_SESSION[ 'helloworld' ] = self :: obj_instance;

 

Το this δεν ειπα να το βαλεις εκει αλλα στο _construct...

$this

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

 

self :: obj_instance = new Sessions();

Αυτο εδω καταλαβαινεις τι κάνει;; Για να γινει το instance πρώτα καλείται η construct και μετα αποθηκεύεται το reference στην Object_instance...

Oταν παει στην construct δεν εχει οριστει το αλλο..Με τη δευτερη κλήση απο οτι φαινεται θα το πάρει ομως.

Αστειεύεσαι έτσι;!! confused.png Εσύ ξέρεις τι κάνει;

Λες να έγραψα τον κώδικα και να το έβαλα τυχαία εκεί;!! Έλεος...

 

Η συνάρτηση Create_Object_Once() καλείται χωρίς να έχει δημιουργηθεί το αντικείμενο, για αυτό λέγεται και static. Οπότε θεωρητικά καλείται αυτή η συνάρτηση για να φτιάξει ένα νέο αντικείμενο.

Όταν εκτελείται η εντολή

>self :: $obj_instance = new Sessions();

τότε καλείται να δημιουργηθεί ένα νέο αντικείμενο και άρα θα κληθεί το __construct() του νέου αντικειμένου και όχι αυτό που βλέπεις παρακάτω της μεθόδου Create_Object_Once().

Έτσι όπως το έκανα στον τελευταίο κώδικα, αφαίρεσα όλο τον κώδικα του __construct και τον έβαλα στην Create_Object_Once() ώστε να μην αντιμετωπίζω λογικά προβλήματα ή οτιδήποτε άλλο. Παρόλα αυτά όμως δε το τρέχει!

Επίσης τα σφάλματα μου εμφανίζονται αλλά μόνο στο συγκεκριμένο δεν εμφανίζονται exclamation.pngexclamation.png

Μου εμφανίζει ο chrome το error:

Error 101 (net::ERR_CONNECTION_RESET): Unknown Error

 

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

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

 

Ευχαριστώ

Δημοσ.

Θα το κανω μολις παω σπιτι να δεις οτι δουλευει ετσι ..

 

συνάρτηση Create_Object_Once() καλείται χωρίς να έχει δημιουργηθεί το αντικείμενο, για αυτό λέγεται και static. Οπότε θεωρητικά καλείται αυτή η συνάρτηση για να φτιάξει ένα νέο αντικείμενο.

Όταν εκτελείται η εντολή

self :: $obj_instance = new Sessions();

 

τότε καλείται να δημιουργηθεί ένα νέο αντικείμενο και άρα θα κληθεί το __construct() του νέου αντικειμένου και όχι αυτό που βλέπεις παρακάτω της μεθόδου Create_Object_Once().

 

Μεχρι το σημειο που λες για το construct συμφωνούμε.Ναι το construct του νεου αντικειμενου θα κληθει μονο που το construct του νεου αντικειμενου θα βαλει το αντικειμενο στη session .ομως δεν εχει τι να βαλει γιατι θα ειναι null στην αρχή.

Δημοσ.

Εγώ το δοκιμασα με αυτη την αλλαγή μια χαρά δουλεύει.

 

>
<?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   
		             
                  }
			   
			   
			   
			   ?>

Αρχειοθετημένο

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

  • Δημιουργία νέου...