Class engine / database

Eléphant du PHP | 67 Messages

10 déc. 2010, 18:15

Bonjour à tous,

Je tourne en rond depuis 1h et je n'arrive pas à trouver ce que j'écris mal dans mes classes...
J'ai que 4 fichiers tout bête j'essaye de créer une classe engine et une classe database l'objectif étant d'écrire un code le plus clair possible !

Mon index.php est pourtant simple
<?php
include("engine/engine.php");

$pEngine  = new engine();
$pEngine->getDatabase();

$sSql = "SELECT * FROM t_sld";
$pRet = mysql_query($sSql);
$aRow = mysql_fetch_array($pRet);

$pEngine->end();

?>
database.php
<?php

/****
***	 Class database
*****/

// Global variable definition
$g_isConnected = FALSE;

class database
{
	 var $pLink = null;
	 
	 public function __construct()
     {
		if ( ! $this->isConnect() ) 
		{
			$this->connect(); 
			
			echo "database connexion ok!";
		}
		$this->getDatabase();
	 }
	 
	 public function connect()
	 {
		echo "connecting to database host";
		$this->pLink = mysql_connect(DATABASE_HOSTNAME, DATABASE_USERNAME, DATABASE_PASSWORD )
					   || die("Impossible de se connecter : " . mysql_error());

		global $g_isConnected;
		$g_isConnected = TRUE;
		echo "Connexion success my pLink = " . $this->plink."<br>";
	 }
	 
	 public function isConnect()
	 {
		global $g_isConnected;
		return $g_isConnected;
	 }

	 public function getDatabase()
	 {
		 mysql_select_db(DATABASE_NAME) || die("Impossible de se connecter : " . mysql_error());
		 echo "database selected : ". DATABASE_NAME;
	 }
	 
	 public function getDatabaseName()
	 {
		return DATABASE_NAME;
	 }
	 
	 public function __destruct()  
	 {
		print " Database destruction call my pLink = " . $this->plink;
		if( $this->isConnect() )
		{
			mysql_close( $this->plink );
 			global $g_isConnected;
			$g_isConnected = FALSE;
		}
		echo "Database destruction in progress";
		unset($this);
		echo "Database destruction is ok";
	 }
}
?>
engine.php
<?php

/****
***	 Class engine
*****/

require("engine/database.php");
require("engine/engine.conf.inc");

class engine
{
	 public $pDatabase;

	 public function __construct()
     {
		 
	 }
	 
	 // This version number is flag when CVS build is make
	 public function getVersion()
	 {
		 return "1.0-0";
	 }
	 public function getDatabase()
	 {
		if ( ! $this->pDatabase ) 
		{
			$this->pDatabase = new database();
		}
		return $this->pDatabase;
	 }
	 
	 public function __destruct()
	 {
		 echo "I'm trying to destruct my database connexion handler";
		 $this->pDatabase->__destruct();
		 echo "Engine destruction in progress";
		 unset($this);
		 echo "Engine destruction is ok";
	 }
	 
	 public function end()
	 {
		 echo "Engine destruction called";
		 $this->__destruct();
	 }
}
?>
Le fichier engine.conf.inc contenant vous l'avez compris les constantes permetant la connexion...

Ma sortie écran est la suivante ... :

Code : Tout sélectionner

connecting to database hostConnexion success my pLink = database connexion ok!database selected :xxxxxx Engine destruction calledI'm trying to destruct my database connexion handler Database destruction call my pLink = [b]Warning[/b]: mysql_close(): supplied argument is not a valid MySQL-Link resource in [b]/xxxxxxxx/engine/database.php[/b] on line 60 Database destruction in progressDatabase destruction is okEngine destruction in progressEngine destruction is okI'm trying to destruct my database connexion handler Database destruction call my pLink = Database destruction in progressDatabase destruction is okEngine destruction in progressEngine destruction is ok Database destruction call my pLink = Database destruction in progressDatabase destruction is ok

Je vois pas trop pkoi... la réalité est que je viens du monde perl et que j'ai un peu de mal à me rappeler du PhP ^^ mais j'ai l'impression d'avoir tout bon pourquoi mon objet database est détruit avant même que j'essaye de le détruire ? J'ai supprimé l'héritage de database dans engine et rendu une variable global pensant que... mais je ne comprend pas trop le souci si vous aviez un coup de pouce ca m'aiderai bcp merci :-)

Eléphant du PHP | 209 Messages

10 déc. 2010, 19:13

Il faut voir qu'en PHP par construction, tous ce que tu as ouvert sera fermé à la sortie du script, que tu le fasse explicitement ou pas (connexion BD, ouverture de fichier, ...)

Je ne suis pas sur que tu es le droit d'appeller le destructeur explicitement. A mon avis, le moteur PHP va le rappeler une seconde fois au moment ou il se rend compte qu'il n'y a plus de référence sur l'objet.
Je pense également que la bonne manière de détruire un objet est :
$a = new Objet();
unset($a);
En effet :
class Objet{
	
	public function __destruct(){
		echo "arghhh";
	}
}
$a = new Objet();
affiche "arghh";

et
$a = new Objet();
$a->__destruct();
affiche "arghharghh", le destructeur semble donc appelé deux fois.
--
Eric

ViPHP
ViPHP | 5462 Messages

10 déc. 2010, 19:16

c'est quoi l'intérêt de créer une classe de ce type sachant que y'a mysqli et PDO ?

Eléphant du PHP | 67 Messages

10 déc. 2010, 19:57

Merci epommate2 ; je me suis aperçu de ca aussi... y'a un moyen de passer outre ? Car, pour détruire un objet parent:: il faut bien appeler son destructeur explicitement donc je comprend pas trop...

Sinon stealth35 l'intérêt, c'est que je suis en train de coder un CRS en fait et vue que je vais avoir pas mal de traitement j'ai envie de faire les choses proprement et je ne souhaite pas attendre que toute la page HTML soit chargée avant de casser mon engine... je vais donc m'y prendre différemment mais ca me laisse dubitatif de laisser tout ce taf a PhP vue l'apocalypse que c'est en Java (garbage collector tout pourave lol) ! Ca doit pas être bcp mieux géré en php voir moins bien...
Bref, quand à Pdo et Mysqli l'objectif c'est de gérer différents types de db, je boss avec oracle et postgres et très peut avec mysql que je trouve assez moyen niveau perf. La classe database est loin d'être terminée je vais surcharger pour que l'engine se comporte différemment en fonction de sa configuration... voilà en gros l'intérêt de penser directement objet avec la db... c'est pas juste pour faire jolie sinon je me serais pas pris la tête :D
Par exemple MySQL aime pas du tout les jointures alors que postgres il adore ca ... avec Postgres j'ai des storeproc et avec oracle j'ai l'embarra du choix une requête couteuse en ressource sur une base de données de 54Gb, qu'elle soit postgres oracle ou mysql la requête diffère les résultats eux se doivent d'être les mêmes.

Edit : Après réflexion, je vais me pencher sur la destruction manuel, et je ne vais pas créer de destructeur de classe... je vais créer une nouvelle classe qui va s'appeler instantiable! et créer une destruction manuelle de cet objet qui sera hérité par tout le monde et donc supprimer toute les methode __destruct... comme ca je gère moi la destruction de mes objets.
Modifié en dernier par haugure le 10 déc. 2010, 20:09, modifié 1 fois.

Eléphant du PHP | 209 Messages

10 déc. 2010, 20:07

y'a un moyen de passer outre ? Car, pour détruire un objet parent:: il faut bien appeler son destructeur explicitement donc je comprend pas trop...
Oui, d'après la doc, dans le destructeur de la classe fille, il faut appeler explicitement le destructeur de la mère (la situation est analogue au constructeur).

PHP est beaucoup mieux fait que Java de ce point de vue là ! Je te garantie que si tu ne ferme pas la connexion, il le fera lui même.

Mais je suis du même avis que stealth35, PDO correspond exactement à ce que tu recherches ;-)
--
Eric

Eléphant du PHP | 67 Messages

10 déc. 2010, 20:10

Oui mais PDO et oracle c'est pas encore super au point :(

ViPHP
ViPHP | 5462 Messages

10 déc. 2010, 20:24

Oui mais PDO et oracle c'est pas encore super au point :(
Pourquoi Oracle ta classe y'a un mysql_connect dedans non ?

Eléphant du PHP | 67 Messages

13 déc. 2010, 20:05

La classe n'est pas terminée en fait mais ca n'est pas grave... en réalité si tu veux Stealth la classe database sera ensuite héritée par la classe mysql.php et oracle.php, postgres.php etc. enfin c'est l'objectif...

Eléphant du PHP | 398 Messages

13 déc. 2010, 21:26

La classe n'est pas terminée en fait mais ca n'est pas grave... en réalité si tu veux Stealth la classe database sera ensuite héritée par la classe mysql.php et oracle.php, postgres.php etc. enfin c'est l'objectif...
c est un peu le principe que j'ai fait pour mon CMS :) (sauf que j ai pas encore oracle ^^)
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

ViPHP
ViPHP | 5462 Messages

14 déc. 2010, 11:38

pour se genre de chose ca va vite arriver à de l'abstraction :wink: