CLASS HELPER

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 28 janv. 2006 à 10:21
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015 - 6 févr. 2006 à 12:15
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35779-class-helper

kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
6 févr. 2006 à 12:15
Les instances unique sont très utile pour des class comme les class de base de données, de débugage ou de gestion des erreurs, etc... personnellement je l'utilise énormément comme suit... .. .

function &singleInstance()
{
static $monInstanceUniqueMYSQL = null;
if(empty($monInstanceUniqueMYSQL)){
$monInstanceUniqueMYSQL =& new mysql();
}
return $monInstanceUniqueMYSQL;
}

après comme l'a dit FhX... .. .

$db =& mysql::singleInstance();

Ainsi on travail toujours à partir du même objet... et le deuxième avantage c'est coté perf... .. .

@ tchaOo°
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
31 janv. 2006 à 23:10
Ah non !

Pour passer un objet par référence, il faut utiliser le singleton (soit en francais l'instance unique) soit le multiton (soit l'instance unique multiple).

Le singleton (ou le multiton) va te permettre d'utiliser ton objet dans un contexte global. En effet, au lieu de faire :
$db = new mysql;
tu va devoir faire :
$db = mysql::NomDeLaMethodeQuiCreerLinstance();

De ce fait, c'est un peu comme si tu faisais une copie d'objet. Un clone en quelque sorte en PHP4 :)
Donc après, tu peux appeler ton objet de n'importe où sans rien perdre au niveau vitesse contrairement à un passage par référence via une méthode de classe où d'une fonction.

De plus, toutes les méthodes font passer les arguments par références Malalam, je te l'ai déja dit :) Donc le & n'a plus lieu d'être =)

D'ailleurs, un constructeur de classe quel qu'il soit n'a PAS à récupérer un objet de connection SQL dans ses arguments, ni même dans ses propriétés. Ca reste de la duplication sinon, et ca n'apporte rien mise à part une perte de mémoire :)

Voila voila !
cs_duncane Messages postés 1 Date d'inscription lundi 3 mars 2003 Statut Membre Dernière intervention 31 janvier 2006
31 janv. 2006 à 21:23
Je n'ai personnellement pas eu le temps de jetter un coup d'oeuil à la classe SQL, mais pour que tu doives utiliser des trucs pareils, il doit y avoir un ou deux truc pas très objet dans celle ci :p
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
31 janv. 2006 à 09:24
Il faudrait que tu passes ton objet $db à ta classe
public function __construct (& $db, ...)
galadriann Messages postés 84 Date d'inscription mercredi 7 mai 2003 Statut Membre Dernière intervention 12 juin 2006
31 janv. 2006 à 08:34
Merci pour les commentaires. ...

Comme je l'ai preciser, le bout de code que j'ai pose c'etais avant de me mettre vraiment a la POO... J'ai fait ce petit helper justement pour m'aider a commencer a creer des SQUELETTES de classes (m'evitant la longue et penible tache de taper tout les champs de table a la main).

Ensuite, je sais que le global $db ca fait peur mais je ne vois pas comment faire ...
$db et debug() viennent tout les 2 de la couche d'abstraction (EZ_SQL).

FhX : "Sachant que $db est un objet, utilise plutôt le singleton .."
??? peux-tu preciser ?

a+
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
30 janv. 2006 à 16:22
Moi, ce qui me fait le plus peur, c'est quand je vois ca :
"global $db;"

La dernière fois que j'ai fait ca, j'ai eu le droit à une belle erreur dans une langue totalement inconnu :)
Sachant que $db est un objet, utilise plutôt le singleton pour pouvoir récupérer ton objet plus facilement et surtout plus rapidement ! (car tu gagnes des ressources au passage).


Pareil :
if (isset($id_assettype))
{
$where='WHERE id_assettype="'.$id_assettype.'"';
}
$sql="SELECT id_assettype, partnumber, modeltype, id_class FROM assetype $where";
Que c'est bien de la ressource de perdu :)
Regarde plutot :
$sql = 'SELECT id_assettype, partnumber, modeltype, id_class FROM assetype ';
if (isset($id_assettype) ) {
$sql .= 'WHERE id_assettype="'.$id_assettype.'"';
}
$db->get_results($sql);


Au passage, si tu dois faire ce morceau de code :
if ($debug) {$db->debug();}
return($res);

}
A chaque fois que tu fais une requète, c'est que ta classe est incomplète. Tu dois faire un test d'erreur dans ta classe de DB et certainement pas à l'extérieur. Sinon tout le coté objet perd son interêt ici ! (en plus du reste).

Bref, je rentre pas dans le code car au peu que j'ai vu, je préfère m'arreter la :)
Si tu veux des idées de classes SQL, tu peux les trouver facilement. C'est certes un peu plus compliqué mais pleinement fonctionnel :)
cs_Merlin59 Messages postés 3 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 30 janvier 2006
30 janv. 2006 à 16:10
"get_assettype" devrait s'écrire "getAssetType" si on respecte les convention de nommage Objet

De plus, ton helper devrait générer automatiquement les set et les get pour chaque propriété, on ne devrait pas les passer en paramètre de la fonction.
galadriann Messages postés 84 Date d'inscription mercredi 7 mai 2003 Statut Membre Dernière intervention 12 juin 2006
28 janv. 2006 à 20:15
j'oubliais ... je fais des classes differentes car chaque table va interagir differemment avec d'autres ... certaines vont appeller un objet existant (genre asset -> asset_type) et d'autre vont etendre d'autres tables (pc -> asset ou server -> pc -> asset) ...

Si tu as le temps, je te montre le design complet de la base et tu me dis ce que tu en penses ...

a+
galadriann Messages postés 84 Date d'inscription mercredi 7 mai 2003 Statut Membre Dernière intervention 12 juin 2006
28 janv. 2006 à 20:11
Je comprend ce que tu veux dire ...
La classe d'abstraction c'est EZ_SQL .. j'ai hesite longtemps pour voir si je l'ajoutais ou pas ...
Le but ici c'etais pour moi d'avoir un squelette avec mes variables deja entree pas de faire un classe complete ... maintenant je dois encore terminer les classes a la main...

Maintenant oui il y a les memes noms pour les methodes... je ne vois pas comment faire autrement puisque je dois pouvoir acceder chaque table...

Maintenant pour la classe d'abstraction, il suffirais d'ajouter un require_once('./inc/ez_sql') dans chaque classe et c'est parti ...

Voici un extrait d'une classe que j'ai faite avant de faire ce helper :

class asset_type extends asset_class {

private $id_assettype;
private $id_class;
private $classtype;
private $modeltype;
private $partnumber;

function __construct()
{

global $db;
$db->select('assetmanagement');
$db->show_errors();

}

function get_assettype($id_assettype = null)
{
global $db;
$where='';
if (isset($id_assettype))
{
$where='WHERE id_assettype="'.$id_assettype.'"';
}
$sql="SELECT id_assettype, partnumber, modeltype, id_class FROM assetype $where";
$res=$db->get_results($sql);

if ($debug) {$db->debug();}
return($res);

}

maintenant je debute en POO ... donc si tu as des idees ... (j'ai meme un projet ou tu pourrais m'aider si tu veux ...)

a+
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 janv. 2006 à 10:24
Ensuite, sans vouloir paraître trop critique... : là, tu crées 25 classes différentes, avec 4 méthodes différéntes...qui font la même chose pour chaque classe...c'est pas très POO ça. Manque une classe d'abstraction générique, dans ce cas. Et pourquoi pas une interface. Et tes méthodes devraient avoir le même nom.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 janv. 2006 à 10:21
Hello,

manque pas un truc ? Genre la classe d'abstraction bdd...? ;-)
Rejoignez-nous