Instancier à chaque fois les class

Eléphant du PHP | 50 Messages

12 avr. 2006, 13:34

Bonjour à tous!

J'ai une petite question à propos de l'instanciation des classes:

J'ai un fichier de config qui est inclus dans chaque fichier php.
Dans ce fichier je crée mes objets (connection, logger, etc.).

Maintenant je voulais si c'est mieux de mettre ces objets dans une variable de session, et de controler à chaque loading du fichier si la variable de session existe, et ainsi créer ou pas l'objet. Ou alors de créer à chaque fois l'objet.

Voici le code pour plus de précision:
solution 1:
if(!isset($_SESSION['myConnection'])){
	$_SESSION['myConnection'] = new SGBD(USER, PASSWORD, HOST, BASE);
}
$myConnection = $_SESSION['myConnection'];
solution 2:
$myConnection = new SGBD(USER, PASSWORD, HOST, BASE);
Merci d'avance!
A plus!

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 avr. 2006, 14:39

Il faut savoir que les ressources (références) de type connexion à une base de données ne peuvent pas être enregistrées dans une session.

L'objet que tu sérialise dans la session ne mémorie donc pas la connexion qu'il ouvre lors d'une session.
Si tu rappelles ton objet de session "myConnection" dans un autre contexte tu n'a plus accès à la connexion qu'il a du ouvrir au-paravant.

Si tu utilise une connexion persistente, tu n'as plus besoin de mémoriser la connexion dans la session. Ceci est possible par "mysql_pconnect".

Mémoriser ton objet SGBD dans la session, te servira alors simplement à récupèrer (désérialiser) son état à la dernière session connue. L'avantage est que tous les paramètres fixés au-paravant sont mémorisés.

Autrement dit, s'il n'y a rien d'important à mémoriser pour économiser les temps de reconstruction d'un objet, ce dernier n'a pas besoin d'être sérialisé. La recréation (new) suffit dans ce cas pour économiser la mémoire de la session.

Toutefois, il faut savoir que comme on avait besoin du schèma de la classe à la création (instanciation) de l'objet, on en a toujours besoin à sa restauration à partir d'une session.

Avec cet exemple tu vas comprendre, qu'en utilisant mysql_pconnect, la connexion à la base est persistente toute session confuse.
Et que ta sérialisation de l'objet telleque tu l'as faite est purement juste mais ne fait que restaurer l'état de l'objet.
<?php
//La classe SGBD
class SGBD {
	//Propriétés
	var $myPconnect;
	var $paramètres;
	
	//Constructeur
	function SGBD ($USER, $PASSWORD, $HOST, $BASE){
		if (!session_start()) session_start();
		//ouverture d'une base de données par une connexion persistente
		$this->myPconnect = mysql_connect($HOST, $USER, $PASSWORD);
		$this->myDb = mysql_select_db($BASE, $this->myPconnect);
		//mémoriser les paramètres de connexion
		$this->paramètres = array("USER"=>$USER, "PASSWORD"=>$PASSWORD, "HOST"=>$HOST, "BASE"=>$BASE);
		//Auto mémorisation : sérialisation
		$_SESSION["myConnection"] = $this;
	}
	//une fonction qui liste les tables de la base ouverte
	function listTables(){
		$tables = mysql_list_tables($this->paramètres ["BASE"]) or die ("<p>Erreur: ".mysql_error());
		if ($tables)
			while ($table = mysql_fetch_object($tables)){
				$t[] = $table;
			}
		return $t;
	}
}

//un programme qui utilise cette classe
session_start();

//Paramètres de connexion
define ("USER", "root");
define ("PASSWORD", "");
define ("HOST", "localhost");
define ("BASE", "test");

//Construction d'un nouvel objet si absent de la session
if(!isset($_SESSION["myConnection"])){ 
    $_SESSION["myConnection"] = new SGBD(USER, PASSWORD, HOST, BASE); 
} 
//Récupèration de l'état de l'objet à partir de la session : désérialisation
$myConnection = $_SESSION["myConnection"];

//Déboggage : Espion sur l'état de l'objet
echo "<pre>"; print_r($myConnection); echo "</pre>";

//Tester si la connexion persitente est toujours active
echo "<pre>";print_r($myConnection->listTables()); echo "</pre>";
?>


Modifié en dernier par sadeq le 12 avr. 2006, 14:46, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 50 Messages

12 avr. 2006, 14:43

Ok! Je comprends bien la solution du pconnect pour mysql.

Par contre, en ce qui concerne d'autres classes?

Quelle est la meilleure solution?

Merci!

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 avr. 2006, 14:50

Comme j'ai dis tout à l'heure : mémoriser ton objet dans la session, te servira simplement à récupèrer son état précédent.

L'avantage est que toutes les valeurs de propriétés fixées au-paravant sont mémorisées que ce soit pour l'objet lui même ou pour ses sous-objets.

Autrement dit, s'il n'y a rien d'important à mémoriser et pour économiser les temps de reconstruction d'un objet, ce dernier n'a pas besoin d'être sérialisé. La recréation (new) suffit dans ce cas pour économiser la mémoire de la session.

Toutefois, il faut savoir que comme on avait besoin du schèma de la classe à la création (instanciation) de l'objet, on en a toujours besoin à sa restauration à partir d'une session.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 50 Messages

13 avr. 2006, 15:33

Je te remercie dpour ces informations!

C'est on ne peut plus clair, et merci pour l'exemple!

A plus!