Page 1 sur 1

erreur de type warning que je ne m'explique pas

Posté : 09 sept. 2007, 20:53
par BeRoots
salut à tous :)

j'ai un soucis de message d'erreur sur un grand nombre de mes classes...
Warning: Call to private brts_session_control::__destruct() from context '' during shutdown ignored in Unknown on line 0

Warning: Call to private brts_info::__destruct() from context '' during shutdown ignored in Unknown on line 0
toutes ces classes en erreur on comme similitude l'appel de leur destructeur (à private), depuis l'une de leur fonction public.

le truc c'est que cela fonctionne tres bien lorsque j'utilise ces classes dans le fichier où elles sont definit mais que j'ai cette erreur lorsque je les utilise depuis une page ou elles sont incluse via un require() :-k


si quelqu'un voit d'où peu venir le problème ;)

merci d'avance.

Posté : 09 sept. 2007, 21:28
par r3drum
Je pense que c'est parceque le destructeur est appelé a la fin du script ("during shutdown") mais qu'elle inaccessible car tu l'as déclaré comme private ;)

Posté : 09 sept. 2007, 21:36
par BeRoots
non j'appel les destructeur en interne dans mes classes depuis une fonction qui elle est public.
en plus j'ai essayer de mettre ces destructeur à public et sa n'a rien changer ;)

en plus ces classes sont pas forcement detruite en fin de script ou elles sont utilisées.
on dirai que c'est plus sur la classe elle même que ce shutdown pointe... :-k
mais vue que j'ai pas de probleme en faisant un fichier de test avec tel ou tel classe et sont utilisation. il y a peut ête bien quelque chose sur le fait que e probleme apparait lorsque ces classes sont inclusent.


quelqu'un a une autre idée ?

Posté : 09 sept. 2007, 21:50
par Cyrano
Si tu illustrais avec quelques parties pertinente du code d'une de ces classes et celui effectuant les appels de méthodes, ça aiderait à repérer une éventuelle coquille :-k

Posté : 09 sept. 2007, 21:58
par BeRoots
exemple:

voici ma classe (fichier mes_classes.php):
/**
* classe de connection aux base de données MySQL
*
* @name brts_connecteur_db
* @package brts_system
* @subpackage server_sql
*/
// CONNEXION SERVER MySQL:    $connecteur_db = new brts_connecteur_db($data_host_db, $data_user_db, $data_pass_db, $data_beroots_db, $data_client_db);
// SELECTION DB:              $connecteur_db->select_db($identifiant_db);
// REQUETE:                   $result = $connecteur_db->query($query);
// DECONNECTION SERVER MySQL: $connecteur_db->close();

class brts_connecteur_db
{
   /**
   * infos de connection au server MySQL
   *
   * @access private
   * @var array 
   */
   private $infos_server;

   /**
   * nom de db beroots
   *
   * @access private
   * @staticvar var
   */
   private $beroots_db;

   /**
   * nom de db client
   *
   * @access private
   * @staticvar var
   */
   private $client_db;

   /**
   * connection active au server MySQL
   *
   * @access private
   * @var ressource
   */
   private $link;

   /**
   * definition des propriété de la classe et connection au server MySQL
   *
	 * @name constructeur
   * @access public
   * @param var $host_db adresse du serveur MySQL
   * @param var $user_db login du server MySQL
   * @param var $pass_db mot de pass server MySQL
   * @param var $beroots_db nom de la base de données BEROOTS
   * @param var $client_db non de la base de données CLIENT
   */
   public function __construct($host_db, $user_db, $pass_db, $beroots_db, $client_db)
   {
      $this->infos_server['host_db']  = $host_db;
      $this->infos_server['user_db']  = $user_db;
      $this->infos_server['pass_db']  = $pass_db;
      $this->beroots_db = $beroots_db;
      $this->client_db  = $client_db;
      $this->connect();
   }
   /**
   * effacement des propriétés de la classe
   *
	 * @name Destructeur
   * @access private
	 * @see close()
   */
   private function __destruct()
   {
      unset($this->infos_server['host_db']);
      unset($this->infos_server['user_db']);
      unset($this->infos_server['pass_db']);
      unset($this->beroots_db);
      unset($this->client_db);
      unset($this->link);
   }
   /**
   * etablissement d'une connexion au server MySQL
   *
	 * @name connect
   * @access private
   * @see __construct()
   */
   private function connect()
   {
      $this->link = mysql_connect($this->infos_server['host_db'], $this->infos_server['user_db'], $this->infos_server['pass_db']) or die('Erreur SQL !<br />'.$this->link.'<br />'.mysql_error());
   }
   /**
   * fermeture de la connexion au server MySQL et appel du destructeur
   *
	 * @name close
   * @access public
   */
   public function close()
   {
      mysql_close($this->link);
      $this->__destruct();
   }
   /**
   * selection de base de données
   *
   * @name select_db
   * @access public
   * @param string $identifiant_db identifiant de base de données (beroots ou client)
   */
   public function select_db($identifiant_db)
   {
      if($identifiant_db == 'beroots')
      {
         $use_db = $this->beroots_db;
      }
      elseif($identifiant_db == 'client')
      {
         $use_db = $this->client_db;
      }
      $selected_db = mysql_select_db($use_db, $this->link) or die('Erreur SQL !<br />'.$selected_db.'<br />'.mysql_error());
   }
   /**
   * execution d'une requete MySQL
   *
   * @name query
   * @access public
   * @param string $query requete sql
   * @return float $result_mysql
   */
   public function query($query)
   {
      $result_mysql = mysql_query($query) or die('Erreur SQL !<br />'.$result_mysql.'<br />'.mysql_error());
      return $result_mysql;
   }
}
voici une page quelconque avec l'appel:
<?php
require(../librairies/php/mes_classes.php);
$connecteur_db = new brts_connecteur_db($data_host_db, $data_user_db, $data_pass_db, $data_beroots_db, $data_client_db);
$connecteur_db->select_db('beroots');
$result = $connecteur_db->query("SELECT * FROM `system_table_beroots` WHERE id = 1");
$connecteur_db->close();

// traitement du resultat de sql...
?>
le message d'erreur:
Warning: Call to private brts_connecteur_db::__destruct() from context '' during shutdown ignored in Unknown on line 0
voila j'espère que cela devrai suffir :)

Posté : 09 sept. 2007, 22:06
par Cyrano
En PHP5, l'appel du destructeur est automatique : si la méthode __destruct est en "private", il y a des chances pour que ce soit ça qui génère l'erreur. Met la méthode en "public" et régénère ta session pour tester à nouveau, il serait bien surprenant que l'erreur se reproduise.

Posté : 09 sept. 2007, 22:19
par BeRoots
merci Cyrano, toujour aussi perspicasse comme toujour :lol:

petite question avant de mettre resolu:

1°) j'ai du mal à saisir ce point de vue contexte sur les classes. dans quel cas utiliser self::ma_fonction et dans quel cas utiliser $this->fonction ?

2°) qu'entent tu par _destructeur automatique :-k

Posté : 09 sept. 2007, 22:52
par Sékiltoyai
Lorsque tu fais unset($objet) ou que l'exécution prend fin, le __destruct() de chaque objet est appelé.

Posté : 09 sept. 2007, 23:07
par BeRoots
donc il est totalement inutile d'avoir des appel de destructeur dans des fonction annexe ou même dans le __construct() alors? mieux vaut faire un unset ou laisser choir :-k

genre pour cette petite classe de redirection:
class brts_redirection
{
   /**
   * nom de la page cible avec extention
   *
   * @access private
   * @var float
   */
   private $page_cible;

   /**
   * definition des propriétés de la classe et execution la redirection
   *
   * @name constructeur
   * @access public
   * @param float $page_cible nom de la page vers laquelle rediriger
   */
   public function __construct($page_cible)
   {
      $this->page_cible = $page_cible;
      $this->redirection();
   }
   /**
   * effacement des propriétés de la classe
   *
   * @name destructeur
   * @access public
   * @see redirection()
   */
   public function __destruct()
   {
      unset($this->page_cible);
   }
   /**
   * redirection vers page cible
   *
   * @name redirection
   * @access private
   */
   private function redirection()
   {
      // on definit l'hôte et l'uri
      $host = $_SERVER['HTTP_HOST'];
      $uri = dirname($_SERVER['PHP_SELF']);
      header ("Location: http://$host$uri/$this->page_cible");
      $this->__destruct();
      exit;                         
   }
}
1°) est ce qu'un unset est possible malgrer la fonction header? doit on faire sans aucun appel du destructeur ou doit on faire un appel comme il est fait dans cette exemple?

2°) et pour ce qui est du contexte sous lequel utilisé self et $this, j'ai mal saisi ce que dit mon bouquin et la doc... si quelqu'un est chaud pour me l'expliquer aussi, cela m'éviterai beaucoup de problème :)

merci d'avance pour vos reponse ;)