Page 1 sur 1

Besoin d'explication sur les classes PHP

Posté : 22 juin 2008, 15:38
par djtec
Voilà pour mon site j'ai créé une classe sql.

Voici le fichier de la classe:
<?php
/***************************************************************************
 *
 *                              class_mysql.php
 *
 ***************************************************************************/
 
 
// Cette classe permet la connexion à la base de données 
// et éxécute des requêtes par l'intermédiaire des fonctions mysql.
Class Sql
{

	// Fonction de connexion
	function sql_connect($host, $login_host, $pass_host, $hostname) 
	{ 

		$c = mysql_connect($host, $login_host, $pass_host) or die("Erreur de connexion au serveur SQL");
		mysql_select_db($hostname, $c) or die("Impossible de se connecter à la base de données");
				
		return $c;

	} 

}
?>
Et cette classe fonctionne parfaitement, mais en surfant je viens de tomber sur une classe sql.

Voici la classe que j'ai trouvé:
<?php
 
class Mysql
{
	private
		$Serveur = '',
		$Bdd = '',
		$Identifiant = '',
		$Mdp = '',
		$Lien = '',
		$Debogue = true,
		$NbRequetes = 0;
 
		 /*
 		  * Constructeur de la classe
 		  * Connexion aux serveur de base de donnée et sélection de la base
  		  *
  		  * $Serveur = L'hôte (ordinateur sur lequel Mysql est installé)
  		  * $Bdd = Le nom de la base de données
  		  * $Identifiant = Le nom d'utilisateur
  		  * $Mdp = Le mot de passe
  		  */
			public function __construct($Serveur = 'localhost', $Bdd = 'base', $Identifiant = 'root', $Mdp = '')
			{
				$this->Serveur = $Serveur;
				$this->Bdd = $Bdd;
				$this->Identifiant = $Identifiant;
				$this->Mdp = $Mdp;
				$this->Lien=mysql_connect($this->Serveur, $this->Identifiant, $this->Mdp);
 
				if(!$this->Lien && $this->Debogue)
				throw new MySQLExeption('Erreur de connexion au serveur MySql!!!');
 
				$Base = mysql_select_db($this->Bdd,$this->Lien);
 
				if (!$Base && $this->Debogue)
				throw new MySQLExeption('Erreur de connexion à la base de donnees!!!');
			}
}
?>
Et ma question est: A quoi serve les définitions private et public et à quoi sa sert de transformer les variables $variables en $this->Variables???

Merci d'avance

Posté : 22 juin 2008, 15:59
par momox
En POO, chaque fonction et variable dispose de trois attributs quant a sa visibilité.
Ces trois attributs sont private, public et protected.
"private" rend ladite fonction ou variable uniquement accessible depuis l'intérieur de la classe. Tout accès depuis l'extérieur de la classe (a partir de l'instance donc) retournerait une erreur.
"public" rend la variable ou fonction accessible depuis l'intérieur ou l'extérieur de la classe, donc possibilité de faire $instance->fonction(); ou $instance->variable;

Cas spécifiques aux classes étendues:
"protected", alors la, c'est spécifique dira t'on aux classes étendues.
Exemple, tu as une classe qui contient une fonction de type protected, si tu étend cette classe, la fonction dans la nouvelle classe qui étend la première sera de type private.
Si tu as une fonction private définie dans cette classe que tu vas étendre a partir d'une autre, tu ne pourras y accèder qu'a partir des fonctions définies dans la première classe.

En résumé:
"public" : fonction ou variable visible de tous
"private" : fonction ou variable visible uniquement dans la classe parente et pas dans les enfants
"protected" fonction ou variable visible uniquement dans la classe parente et les classes enfants.

Concernant les variables:
Les variables liées a une classe auxquelles tu accèdes grace a $this->variable dans le cas d'une instance ou class::$variable en statique permettent de stocker une information qui sera liée a l'instance de la classe ou a la classe elle même dans le cas d'une classe statique ;)
Voila ;)

Posté : 22 juin 2008, 16:05
par Calimero
Hello,

à travers tes questions, je devine que tu connais les classes mais que tu n'as pas encore bien assimilé le concept de POO. Je te recommande la lecture de ce sujet qu'on a eu récemment : http://www.phpfrance.com/forums/voir_sujet-241153.php

Pour résumer, un des points forts qui en ressort est qu'il ne faut pas croire que classe==POO. La classe que tu nous présentes n'utilise aucune fonctionnalité objet (et pourtant c'est une classe tout à fait valide). Il va te falloir lire sur le vaste sujet de la POO pour comprendre la différence.

Un bon départ pour cela est le manuel php ;-)

Posté : 22 juin 2008, 16:16
par djtec
Donc en faites la classe que j'ai codé est bonne et je n'est pas besoin des objets, du moins les objets ne me servirait à rien.

Posté : 22 juin 2008, 16:17
par Ryle
Un peu de rigueur je vous prie Mr Momox |(X

Un objet est constitué d'attributs et de méthodes, et non point de vulgaires "variables" ou de précaires "fonctions" comme n'importe quel archaïque bout de code non objet ;) Les niveaux de visibilités (public, protected, private, ...) d'un attribut ou d'une méthode d'une classe sont effectivement liés au concept d'encapsulation de la POO :)

(Ouais, je sais, je pinaille et on dit exactement la même chose, mais pour l'avoir vu faire, je vous promet que c'est bête de se faire jeter d'un entretien parce qu'on a pas le bon vocabulaire, alors qu'on a les compétences et qu'on parle bien de la même chose, mais pas avec les bons mots... :))

Posté : 22 juin 2008, 17:16
par momox
Ah, on est pas dans le cas des moultes exceptions de la langue française ? :P

Pour répondre a DjTec, dans le cas de ce que tu as codé, ca ne sert a rien, vu que ca connecte a la base de données et retorne la ressource mysql, et ca s'arrête la.
Partant de cette classe, tu peux constituer un ensemble de fonctions très pratiques qui te permettrait de gérer des cas prècis qui te seraient utiles. ;)

Posté : 22 juin 2008, 17:27
par djtec
Moi mes autres fonctions sont codé comme ceci
<?php
/***************************************************************************
 *
 *                              class_mysql.php
 *
 ***************************************************************************/
 
 
// Cette classe permet la connexion à la base de données 
// et éxécute des requêtes par l'intermédiaire des fonctions mysql.
Class Sql
{

	// Fonction de connexion
	function sql_connect($host, $login_host, $pass_host, $hostname) 
	{ 

		$c = mysql_connect($host, $login_host, $pass_host) or die("Erreur de connexion au serveur SQL");
		mysql_select_db($hostname, $c) or die("Impossible de se connecter à la base de données");
				
		return $c;

	} 
				
	// Fonction mysql_query
	function sql_query($query) 
	{	

		$mysql = mysql_query($query);

		return $mysql;

	}

	// Fonction mysql_fetch_row
	function sql_fetch_row($query) 
	{	

		$mysql = mysql_fetch_row($query);
	
		return $mysql;

	}

	// Fonction mysql_num_rows
	function sql_num_rows($query) 
	{	

		$mysql = mysql_num_rows($query);
		
		return $mysql;

	}

	// Fonction mysql_fetch_array
	function sql_fetch_array($query) 
	{	

		$mysql = mysql_fetch_array($query);

		return $mysql;

	}

	// Fonction mysql_fetch_assoc
	function sql_fetch_assoc($query) 
	{	

		$mysql = mysql_fetch_assoc($query);

		return $mysql;

	}

	// Fonction mysql_result
	function sql_result($query, $nb, $type) 
	{	

		$mysql = mysql_result($query, $nb, $type);

		return $mysql;

	}

	// Fonction mysql_close
	function sql_close() 
	{	

		mysql_close();
	
		return;

	}

} 

?>

Posté : 22 juin 2008, 22:01
par momox
Pour tes fonctions, je ne peux que te suggerer d'enlever le préfixe "sql_" étant donné que celui-ci fait presque doublon avec le nom de ta classe ;)
@++

Posté : 22 juin 2008, 22:47
par djtec
C'est vrai que je pourrai l'enlever mais celà fonctionne très bien comme ça donc voilà.

Ben merci à tous pour toutes c'est précision.

++