programmation POO

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 : programmation POO

par Vaedan » 11 sept. 2005, 12:15

je te conseille de passer ton argument SQL en référence afin de ne pas multiplier les objets :
public function __construct
(
    $&sql,    // resource    Référence à la connexion SQL
    ...       // mixed       Tes arguments
)
{
    // Ta fonction
}

par jeff » 11 sept. 2005, 12:02

salut
j'ai bien etudier le post(dans la mesure de mes connaissance) mais un truc me choque, la table et les champs sont definit en dur dans la class
donc comment fair des requettes avec jointure ou meme faire une requette sur une autre table
moi j'aurai fait ca
class SiteDAO extends AbstractDAO{
    
    function __construct(ISgbd $db,$table,$champs){
        $this->db = $db;
        $this->nomTable = $table;
        $this->arrayChamp = $champs;
        $this->arrayType = array("int", "text", "text");//je sais pas ce que c'est
    }
}
mais bon je n'est pas le niveau de daoud

par Invité » 04 sept. 2005, 18:02

j'ai pas trop compris l'histoire des instructions trop longues.
ensuite tu me parle de php5 mais tu gardes l'ancienne syntaxe, je trouve ça un peu dommage d'autant plus que tu pourrais utiliser utoload.
essaie aussi de mettre des majuscules à tes classes c'est toujours mieux pour la relecture.

sinon ta méthode display_menu n'a rien à faire dans ta classe mysql(déja que je ne suis pas trop pour de gérer la connection à l'intérieur de classes gérant les accès bases).
cette méthode aurrait plus sa place à l'intérieur de ta classe menu.

ta classe mysql s'occupe de gérer les accès bases, donc elle n'en a rien à faire de savoir qu'un menu existe.
ça concerne uniquement ta classe menu qui elle s'occupe de gérer les menus.
pour résumer ta classe menu sais afficher un menu, en revanche elle ne sais pas accéder aux infos pour remplir ce menu.
donc elle fera appel à ta classe mysql qui s'occupera de ça.
donc chacun son boulot.
un exemple de classe pour sgbd histoire que tu ais une idée:
http://phpfrance.com/forums/voir_sujet-3080.php

par jeff » 04 sept. 2005, 17:19

merci de tes reponses
prenons un exemple
j'ai deux class une our construire un menu et une autre pour dialoguer avec un base
<?php
class menu
{
	var $id_page;
	var $id_enf;
	var $nom;
	
	function __construct($id_page=null,$id_enf=null,$nom=null)
	{
		$this->id_page=$id_page;
		$this->id_enf=$id_enf;
		$this->nom=$nom;
	}
	
	function display_menu($array)
	{
		$menu='<ul id="menu_gauche">'."\n";
		while(false!=$array)
		{
			$menu.='<li><a href="?id_page='.$array['id_page'].'">'.$info['nom'].'</a></li>'."\n";
		}
		$menu.='</ul>'."\n";
		echo $menu;
	}
}

?>

et
class mysql
{
	var $serveur;
	var $login;
	var $pass;
	var $base;
	
	function __construct($serveur,$login,$pass,$db)
	{
		$this->serveur=$serveur;
		$this->login=$login;
		$this->pass=$pass;
		$this->base=$db;
	}
	
	function connexion()
	{
		$conn=@mysql_connect($this->serveur,$this->login,$this->pass);
		if(!isset($conn))
		{
			echo 'connexion impossible';
		}
		else
		{
			@mysql_select_db($this->base,$conn);
		}
	}
	
	function select_menu($idpage)
	{
		$query='SELECT id_page,nom FROM page WHERE id_enf="'.$idpage.'"';
		$result=mysql_query($query);
		return mysql_fetch_array($result);
	}
}
voici l'utilisation
require_once 'parametre.ini.php';
require_once 'mysql.php';
require_once 'menu_class.php';
$dbb= new mysql(SERVEUR,LOGIN,PASS,BASE);
$dbb->connexion();
$menu_gauche= new menu();
isset($_GET['id_page'])?$id_p=$_GET['id_page']:$id_p=0;
	
$menu_gauche->display_menu($dbb->select_menu($id_p));
ceci dans l'etat actuelle des choses ne fonctionne pas(instruction trop longue) cela vient du tableau passer un argument apparament

la methode select_menu doit renvoyé un tableau ou un objet ?

par Invité » 04 sept. 2005, 16:56

comment faire dialoguer c'est deux classes pour savoir si un utilisateur a les droits ou non sur un page?
t'as dû voir qu'il existe plusieurs manières de permettre à deux objets de dialoguer.
en voila trois.
$toto=new obj_un();
$tutu=new obj_deux();

//tu passes en paramètre un objet
//cela correspond à une aggrégation
//les deux objets gardent une certaine indépendance, tu pourras te resservir de $tutu pour d'autres choses dans ton script
$toto->une_methode($tutu);
//tu crés un objet à l'intérieur d'une méthode d'un autre objet
//cela correspond à une composition
//pour schématiser l'objet $tutu n'existe que si l'objet $toto existe, et les deux objets meurent en même temps

//une méthode de l'objet $toto
function une_methode()
{
    $tutu=new obj_deux();
}
//tu estimes que ta classe ne mérite pas d'être instancier et tu utilise la propriétée static(ce qui peut être aussi appelé classe utilitaire)

//une méthode de l'objet $toto
function une_methode()
{
    class_static::une_méthode_de_class_static();
}
pour revenir à ton problème, ta classe user fabriquera un objet métier, c'est à dire un objet qui contient des données présentes dans ta base de donnée, et qui représente par le biais de ces attributs une table de ta base(enfin je schématise mais c'est souvent comme ça).
ta classe mysql par contre est une classe qui t'apporte des fonctionnalités, qui servira ici à tes objets métiers à établir le dialogue vers la base.
donc ta classe user pourrait avoir une méthode qui s'occupe de vérifier les droits grace à un objet de ta classe mysql qui te permettra d'interroger la base.

après ça dépend de ton appli, à mon sens il y a plusieurs façon d'implémenter ce que tu veux.
si tu renseignes tes attributs à un moment donné, tu n'aurais plus qu'à vérifier 'level' pour savoir ce que tu veux, comme tu pourrais ne pas te servir de ta class user pour ça, comme d'autres choses encore...
mais en gros ta classe user se servira de ta classe mysql(qui à mon sens porte un mauvais nom vu que l'intérêt de créer une classe pour les accès bases est de pouvoir changer de type de base en changeant le minimum de code possible, l'ideal étant de toucher seulement à la classe s'occupant de tels accès) pour interroger la base.
serait t'il idioit de faire une mere des ces 2 classes avec comme attribut le login et le mdp?
un petit peu quand même :wink:
l'héritage sert à spécialiser une classe, donc la classe fille doit appartenir à la même famille que la classe mère.
ce qui n'est pas le cas ici(ta class user ne sert pas à accéder aux bases de donnée, et ta classe mysql n'est pas une sorte d'user).

en espérant avoir répondu à ta question sans avoir dit trop de bétises.

programmation POO

par jeff » 04 sept. 2005, 14:43

salut
j'aimerai me mettre a la POO avec php5 mais les objet ca a toujours fait 2
je voudrai faire un site developper en POO mais je n'arrive pas a faire un decoupage en objet (en fait a modeliser le site malgres l'achat et les nombreuse relectures de "modeliser un site de e-commerce")

par exemple j'ai une class mysql (attribut hote,login, mdp ,base)qui se preocupe de faire un faire les requete SQL et un class user(login, mdp,level) qui regarde si l'utilisateur a les droit neccessaire pour acceder a un page

comment faire dialoguer c'est deux classes pour savoir si un utilisateur a les droits ou non sur un page?

serait t'il idioit de faire une mere des ces 2 classes avec comme attribut le login et le mdp?

est -il prevu dans un futur proche un salon dedier a la modelisation d'objet ou de site sur le forum?