Instancier à chaque fois les class

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Instancier à chaque fois les class

par LEON » 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!

par sadeq » 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.

par LEON » 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!

par sadeq » 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>";
?>


Instancier à chaque fois les class

par LEON » 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!