begin process at 2012 02 09 13:11:06
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > GESTIONNAIRE DE MODÈLES SQL

GESTIONNAIRE DE MODÈLES SQL


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :model, donnée, sql, pdo, manager Niveau :Débutant Date de création :26/11/2008 Vu / téléchargé :4 303 / 205

Auteur : codefalse

Ecrire un message privé
Site perso
Commentaire sur cette source (33)
Ajouter un commentaire et/ou une note

 Description

Suite à la discussion que nous avons eue avec destinyfr sur la source http://www.phpcs.com/codes/CMS-MY-GESTION-CMS-100- OPEN-SOURCE_48285.aspx, voici comment je procède sur mes sites pour tout ce qui touche à la base de donnée.

Pour détailler, j'utilise deux classes principales suivit de n classes pour les modèles.
La première classe s'appelle PdoManager, et s'occupe de la création de l'instance de PDO et du chargement des modèles.
La deuxième classe s'appelle PdoModel, et est une classe (que j'aurai dû mettre abstraite) qui va éviter la redondance de code pour les modèles. En fait elle ne contient qu'une variable protected et une fonction, __construct, qui recoit l'instance de PDO et l'enregistre dans la variable protected.

Les classes modeles n'auront qu'à étendre PdoModel et faire mumuse avec $this->_oPdo->* !

Voici un exemple de l'implémentation de telles classes :

Source

  • <?php
  • // On défini le repertoire ou se trouvent les modeles
  • define ('MODELS_DIR', 'classes/Models/');
  • // Bien sûr, on peux agir différement (le passer en paramètre, etc)
  • // On inclut PdoManager
  • require_once ('classes/PdoManager.php');
  • // On instancie une connection vers PDO au travers de PdoManager
  • $oPdoInstance = PdoManager::init (array ('dsn' => 'mysql:host=127.0.0.1', 'username' => 'root', 'password' => 'root'));
  • // Maintenant, l'instance de PDO n'appartient qu'aux classes PdoManager et PdoModel(filles)
  • // on ne peux pas accéder à pdo depuis l'extérieur de ces classes
  • // Pour jouer avec la base de donnée, on doit charger un model, par exemple users :
  • $oUsers = $oPdoInstance->load ('Users');
  • // Puis on appele une fonction, telle que selectFromId
  • $aUser = $oUsers->selectFromId (1);
  • // On affiche son contenu vite fait
  • echo '<pre>';
  • var_dump ($aUser);
  • echo '</pre>';
  • // On modifie la valeur
  • $aUser['login'] = 'Alfred';
  • // On affiche son contenu après modification
  • echo '<pre>';
  • var_dump ($aUser);
  • echo '</pre>';
  • // Et on met à jour
  • echo '<pre>';
  • var_dump ($oUsers->update (1, $aUser));
  • echo '</pre>';
  • ?>
<?php
// On défini le repertoire ou se trouvent les modeles
define ('MODELS_DIR', 'classes/Models/');
// Bien sûr, on peux agir différement (le passer en paramètre, etc)

// On inclut PdoManager
require_once ('classes/PdoManager.php');

// On instancie une connection vers PDO au travers de PdoManager
$oPdoInstance = PdoManager::init (array ('dsn' => 'mysql:host=127.0.0.1', 'username' => 'root', 'password' => 'root'));

// Maintenant, l'instance de PDO n'appartient qu'aux classes PdoManager et PdoModel(filles)
// on ne peux pas accéder à pdo depuis l'extérieur de ces classes

// Pour jouer avec la base de donnée, on doit charger un model, par exemple users :
$oUsers = $oPdoInstance->load ('Users');

// Puis on appele une fonction, telle que selectFromId
$aUser = $oUsers->selectFromId (1);

// On affiche son contenu vite fait
echo '<pre>';
var_dump ($aUser);
echo '</pre>';

// On modifie la valeur
$aUser['login'] = 'Alfred';

// On affiche son contenu après modification
echo '<pre>';
var_dump ($aUser);
echo '</pre>';

// Et on met à jour
echo '<pre>';
var_dump ($oUsers->update (1, $aUser));
echo '</pre>';
?>

 Conclusion

Le code présent ci-haut est un code vite fait pour présenter l'usage des classes utilisées pour la gestion de models. (c'est pas très joli joli, mélange du code html/php, etc).

Juste pour vous donner une idée des possibilités que l'on as avec les classes PdoManager/PdoModel telle que je les implémentes.

N'hésitez pas à proposer des améliorations, des conseils, des optimisations et à apporter votre avis sur la chose afin d'améliorer, toujours améliorer, un code :)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

[PHP5] MULTI-THREADING : ACCÉLÉRATION DU TEMPS DE TRAVAIL D'...
Source avec Zip [PHP5] - SIMPLE CLASSE D'ENVOI D'EMAIL
Source avec Zip CATAPULT FRAMEWORK, VERSION 0.1 : "ORIGIN"
[PHP5] - CLASSE D'UPLOAD
Source avec Zip [PHP5] - CLASSE DE VÉRIFICATION DE FORMULAIRE

 Sources de la même categorie

CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter
Source avec Zip SIMPLETEMPLATE par thunderhunter
Source avec Zip Source avec une capture VOIR QUI VISITE VOTRE SITE par Dariumis
Source avec Zip CLASS SIMPLE CBASEDONNEE par smag42

 Sources en rapport avec celle ci

Source avec Zip CLASS SIMPLE CBASEDONNEE par smag42
Source avec Zip Source avec une capture CONVERTIR BASE FIREBIRD EN MYSQL par castelfrederic29
DUMP SQL AVEC SÉLECTION AUTOMATIQUE DES TABLES par theptitprince
GÉNÉRATEUR DE REQUÊTE SQL par theptitprince
Source avec une capture SQL/EXE EXECUTEUR DE REQUETTES SQL par enokbyreal

Commentaires et avis

Commentaire de destinyfr le 26/11/2008 19:15:39

Salut

Déjà merci pour l'exemple :)

J'ai regardé ta classe, et d'après moi, le gros avantage de ta classe c'est que tu déclare qu'une seul fois la connexion à la base dans une instance que tu utilise ensuite dans les autres fichiers. C'est bien pensé, le problème c'est que cette classe est plutôt faite pour les bases de type mysql, car dans le constructeur, tu vérifie que tous les champs nécessaires à la connexion existent, or si c'est du sqlite, un seul paramètre est utilisé.
Ce qui est bien, c'est le chargement de classes, tu charge la ou tu veux la classe nécessaire à ce que tu veux faire. Peut-tu par contre m'expliquer un petis poins dessus ?

$this->_aLoadedClasses[$sFile] = new $sFile ($this->_oPdo); -> A quoi cela sert t'il ?

Pour ce qui est de la différence avec ma classe, c'est que tu utilise 2 classes principales qui vont ensuite gérer les modules ce trouvant dans le dossier spécifié. C'est très pratique si tu as beaucoup de classe :)

Je vais essayer d'améliorer ma classe en me basant sur ton exemple :) (notamment pour la gestion des classes avec la fonction load).

Merci pour cette exemple, et merci de répondre à ma question ^^

Commentaire de codefalse le 26/11/2008 19:38:17 administrateur CS

Mon système doit supporter sqlite normallement, puisqu'il n'as besoin que du premier paramètre (DSN), tel que l'impose la doc de PDO. J'aurai besoin de plus de détails sur ce qui ne marche pas :p

$this->_aLoadedClasses[$sFile] = new $sFile ($this->_oPdo);
Je ne vois pas ce qui dérange ici.

En fait je stocke l'instance des modèles chargés afin d'éviter qu'ils ne se relancent une seconde fois (c'est inutile dans 99% des cas, et comme les 1% ne me concernent pas (encore) :p).

En effet, juste avant, je vérifie qu'il n'existe déjà pas une instance similaire dans ce tableau, si elle existe, je ne fait que la retourner, sinon je l'instancie.
Ca évite des traitements inutiles.
Si c'est pas ce que tu avais compris, précise, je t'expliquerai en détail :p

Sinon, de rien (;

Commentaire de destinyfr le 26/11/2008 21:00:00

Eu en faite oublie cette question débile XD je devais bader devant mon PC à ce moment (j'ai mal à la joue et des traces carré :o). Il est vrai qu'il n'y a pas de difficulté ici :)

En revanche j'étais sur que tu utilisé un variable pour rien, mais j'ai encore rêvé XD, elle est utilisé sur la ligne du dessous looooool.

Enfin merci quand même pour la réponse ^^.

Pour ce qui est de sqlite, étant donné que tu utilise isset pour vérifier si c'est existant, sqlite devrait passer. Sinon il suffisait juste de faire un petit teste : si user, password etc... faire cette action, sinon faire celle la.

Commentaire de codefalse le 26/11/2008 22:56:01 administrateur CS

je fait ces tests, directement dans le passage de parametre, en mode ternaire en fait :)

Commentaire de destinyfr le 27/11/2008 07:18:20

Eu oO à quoi sert PDO dans la fonction construct dans PdoModel.php ?

Commentaire de aKheNathOn le 27/11/2008 13:52:22 10/10

Superbe :)

Juste quelques remarques :

Sur tes fonctions mets des pointeurs car à partir de php 5.2 il clone les objets dans certains cas de figures. Déclares tes fonctions genre : public static function &init(

A partir de php 5 tu peux typer tes déclarations :
public static function init ($aServerConfig) {

Devient :
public static function &init (array $aServerConfig) {

Plus la peine de vérifier que c'est un array, d'ailleurs sur le constructeur de PdoModel tu l'avais renseigné.

D'ailleurs en parlant de pointeurs :

public function __construct (PDO &$oPdo) {
  $this->_oPdo =& $oPdo;
}

----

Sinon :
- Le code est bien fait / structuré
- Super simple d'utilisation
- Manque quelques fonctions dans le helper genre le stripslashes / le helper est en principe spécifique au driver
- Manque des notions d'ORM mais c'est déjà tellement mieux que de faire du SQL directement dans les vues.

Commentaire de codefalse le 27/11/2008 14:23:03 administrateur CS

Merci pour ton commentaire et ta notes :)

Pour ce qui est du manque de notion d'ORM, c'est volontaire. Le code présenté ici n'à que pour but de séparer le modèle du reste du code (si l'on prends une structure MVC). Un ORM serait une sorte de complément, extension au code présenté ici. La plupart des frameworks actuels proposent une séparation des différentes couches sans imposer un ORM, mais le propose en plus, si l'utilisateur le désir.

De toute facon la partie ORM doit plus te concerner d'après tes sources n'est-ce pas ;)

Cependant, ton histoire avec les pointeurs me perturbe, car à t'écouter, il faut mettre des & partout dans le code, genre une cinquantaine par lignes ;)

Pour le typage, j'avais entendu dire que php ne supportait que le typage de classes (comme PDO), pas des autres éléments (array, string, etc). D'ou une abscence de typage pour le Array et la présence pour PDO !
Va falloir que je regarde cela de plus prêt.

Tu aurais un article pour l'histoire des pointeurs, histoire que je comprenne mieux le pourquoi du comment s'il te plait ?

Merci :)

Commentaire de aKheNathOn le 27/11/2008 14:52:58

J'ai pas d'article concernant les pointeurs, juste le fait que sur un framework actuellement en cours de dév, ça va faire deux jours que j'avais un singleton permettant d'empiler des données de débug il à chaque affichage il ne contenait rien alors que j'étais certain qu'il devais être rempli ... et en rajouttant function &getInstance()... ça à fonctionné - mais y'avais d'autres clonnages un peu partout.

Du coup, du moment ou l'instance n'est pas à cloner j'en met des couches. Juste sans mettre des pointeurs, rajouttes ça dans tes classes :

  public function __clone() {
    throw new Exception('Should not clone :(');
  }

J'ai plusieurs instance de serveurs avec différentes versions et j'ai eu ce bug sous WAMP 2.0 - PHP 5.2.6

Pour le typage, essayes ça :

<pre>
<?php
function debugArray(array $arg) {
print_r($arg);
}
debugArray(array('Valeur 1', 'Valeur 2'));
debugArray('Some text !');
?>
</pre>

En retour tu auras :

Array
(
    [0] => Valeur 1
    [1] => Valeur 2
)

Catchable fatal error: Argument 1 passed to debugArray() must be an array, string given, called in C:\..\test.php on line 3

Commentaire de codefalse le 27/11/2008 15:27:11 administrateur CS

J'utilise la méthode magique __clone dans PdoManager mais pas dans PdoModel en effet, je vais regarder cela de plus prêt.

Pour ce qui est du typage, c'est une bonne nouvelle !
Merci de l'info :)

Commentaire de destinyfr le 27/11/2008 17:52:44

Salut salut :)

Tout ça m'intéresse ^^ mais bon sa semble dur à appliquer :s

Si j'ai compris, plutôt que de déclarer par exemple une variable comme ça :

$aServerConfig = array();

On fait : $aServerConfig;

et dans la fonction il devient : functionName(array $aServerConfig) {

De plus faut t-il obligatoirement rajouter & devant le nom de la fonction du coup ?

&functionName(array $aServerConfig) { ?

Peux-tu m'expliquer l'utilisation des & dans le constructeur suivant :

public function __construct (PDO &$oPdo) {
  $this->_oPdo =& $oPdo;
}

et à quoi sert PDO ? A indiquer que c'est une base ?

Merci de répondre :)

Commentaire de aKheNathOn le 27/11/2008 18:09:30

Non destiny, t'inquiettes c pas compliqué.

Déjà les variables des fonctions, la plus part du temps tu peux avoir :

function maFonction($var1, $var2) {
...
}

Mais à aucun moment tu ne dis à quoi correspond var1 ou var2 en tant que type de variable - du coup php accepterais que t'appelles ta fonction ainsi :
$resultat = maFonction(true, 10);
ou $resultat = maFonction("Salut !", new PDO(...));

Tu vois, on peut à peu près tout faire, et dans la pluspart des cas elle va planter à moins que tu tartines des tonnes de vérifications pour expliquer la vraie cause de l'erreur.

Ben sinon depuis php 5 tu peux typer tes arguments :

function maFonction(array $var1, string $var2) {
}

Si c'est un objet, tu indiques le nom de la classe, comme ...(PDO $varPDO)...

Commentaire de aKheNathOn le 27/11/2008 18:15:38

Oui, et les références c'est simple aussi. Quand t'appelles une fonction tu communiques.

Tu lui envoies des arguments et elle te renvoie un résultat.

Pour les argument tu peux lui passer une valeur genre VRAI/FAUX ou 10/-10, ou bien lui passer une référence.

La référence c'est que tu lui envoies non pas une donnée mais une variable - la nuance c'est qu'en lui envoyant la variable tu peux la modifier dans la fonction.

Exemple :

$val1 = 10;
function maFonction(int &$argument) {
  $argument = -99;
}
echo $val1.'<br />';
maFonction($val1);
echo $val1;

Ca va afficher :
10
-99

---

Les références sont importante à utiliser dans le passage d'objets, car en cas d'ommission il duplique l'objet et pour de gros objets cela est couteux en temps (exemple typique la structure dom d'un XML)

---

Autre détails, le résultat d'une fonction peut être envoyé en référence également, en utilisant :

function &maFonction() {
return new PDO(...);
}

C'est utile surtout quand tu as des classes de type singleton ou factory (design patterns)

Commentaire de destinyfr le 27/11/2008 18:32:38

Salut merci pour l'explication :) Cependant, pourquoi ne pas avoir marquer cette fonction :

function maFonction(int &$argument) {
  $argument = -99;
}

Comme ceci :

function maFonction(int &$argument) {
  $argument =& -99;
}

Comme tu la fait dans cette exemple :

public function __construct (PDO &$oPdo) {
  $this->_oPdo =& $oPdo;
}

Commentaire de malalam le 27/11/2008 19:34:40 administrateur CS

Hello,

sympa.
Ce que je ferais moi, néanmoins, c'est utiliser __call(). Pourquoi ? Pour te permettre de ne pas utiliser $oUsers.
Disons que "users" devient un "module" de pdomanager dès qu'on le charge. A ce moment, pdo manager peut implémenter une méthode magique __call() qui va chercher dans les modules chargés la méthode qu'on tente de lui faire appeler :
$pdomanager->update(bla bla);
va appeler $this->oModules['users']->update(bla bla);
L'inconvénient étant que chaque méthode de tes modules doit avoir un nom différent.
Mais c'est un confort appréciable à l'utilisation.

Rectification sur les commentaires d'Akhé : le typage dans les appels de méthodes/fonctions est disponible à partir de php5.1, pas de php5 tout court (php5.0.4 ne connait pas, par exemple).

Encore Akhé : j'aimerais bien un exemple de ce que tu dis sur php5.2 qui clonerait parfois, rendant erratique l'utilisation de méthodes statiques "non pointées"? Je n'ai jamais rencontré ce problème, et j'aimerais autant voir de quoi il retourne avant de le rencontrer :-)

Commentaire de aKheNathOn le 28/11/2008 09:49:47

Lut malalam, tj un plaisir de lire tes commentaires très précis :)

Toujours en allant dans le sens de malalam, j'aurais trouvé ça fun de pouvoir directement faire :

$oPdoInstance->Users()->Update('...');

Une vérif aurait checké si users est chargé en tant que module, dans le cas contraire il l'aurais instancié et mis en cache. Il en retournerais son instance :)

Destiny, en réalité je me suis pas mal penché sur l'optimisation de certains codes dans des frameworks et je me suis rendu compte que même si PHP gère automatiquement les pointeurs, ce n'est pas toujours fait, du coup je prends des précautions :

Exemple :
public function __construct (PDO &$oPdo) {
  $this->_oPdo =& $oPdo;
}

Dans l'argument je lui dit que j'ai besoin d'une référence à l'objet pdo et non d'une valeur clonée. Ensuite je le sauvegarde dans une variable privée de ma classe, mais toujours en tant que référence. Sinon, dans certains cas il me duplique l'objet qui est pourtant une référence.

Malalam, je ne sais pas si ça relève du bug ou bien s'il faut bien tout déclarer, la plus part du temps je ne le fais pas - du coup des fois j'ai des perfs flinguées et des résultats incohérents.

Tu peux tester, la version SVN est à cet emplacement :
https://dotview.svn.sourceforge.net/svnroot/dotview/trunk

T'as rien à installer, juste déclarer le répertoire démo en tant qu'allias demo puis aller à sa racine.

Ca va te générer une erreur normale vu que t'as pas configuré les bases de données - et à droite de l'erreur t'as le debug stack. Il est vide...

dans dotview/core/debug.class.php modifies ça :
... &getInstance()... ligne 12

dans dotview/core/core.class.php
... &debug() ... ligne 8

Ce qui est étonnant c'est que le comportement change si on utilise une version antérieur de PHP.

Commentaire de malalam le 28/11/2008 13:48:06 administrateur CS

Hello,

je lirai et testerai, merci Akhé :-)

Voilà un petit exemple de ce que j'entendais par utiliser __call() :

<?php
class A {
protected $oMods;

public function __construct() {
$this->oMods = new ArrayIterator;
}

public function __call($sMethod, $aArgs) {
foreach($this->oMods as $oMod) {
if(method_exists($oMod, $sMethod)) {
return call_user_func_array(array($oMod, $sMethod), $aArgs);
}
}
}

public function attach($oModule) {
if(!$oModule instanceof module) {
throw new Exception('Not an instance of module');
}
if(false === $this->contains($oModule)) {
$this->oMods[get_class($oModule)] = $oModule;
}
}

public function detach($mModule) {
if((is_object($mModule) && $oModule instanceof module) || is_string($mModule)) {
foreach($this->oMods as $idx => $oMod) {
if ((is_object($mModule) && $mModule === $oMod) || (is_string($mModule) && $mModule === $idx)) {
unset($this->oMods[$idx]);
$this->oMods->rewind();
return;
}
}
}
}

protected function contains($mModule) {
if (is_object($mModule)) {
foreach($this->oMods as $oMod) {
if ($oMod === $mModule) {
return true;
}
}
}
return false;
}
}

interface module {}

class modA implements module {
public function foo() {
echo 'foo';
}
}

class modB implements module {
public function bar() {
echo 'bar';
}
}

$A = new A;
$A->attach(new modA);
$A->attach(new modB);

$A->foo();
$A->bar();

$A->detach('modB');

$A->bar();
?>

Commentaire de codefalse le 28/11/2008 14:15:05 administrateur CS

Content de voir que mon code apporte de nouveaux code :p

Vos idées sont intéressantes et méritent réflexion. Je ne sais pas trop encore comment je pourrais m'y prendre, mais c'est vrai que jouer directement avec l'instance sans la retourner, ce n'est pas mal.

@Malalam : Ca faisait un moment non ? :)

Personnellement je préfère un mix de vous deux, c'est à dire un :

$o->attach ('modA');
$o->modA->getUsers ();

ou

$o->attach ('modA', 'users');
$o->users->getUsers ();

Sinon, déçu que CS ne fasse pas les balises bb ou autre pour le code :( du coup le post de malalam est dure à digérer (MALALAM ! On t'a dit quoi sur l'indentation !! RALALA !! :p)

Je vais voir pour retravailler ca ! :)

Commentaire de malalam le 28/11/2008 14:22:19 administrateur CS

C'est CS qui bouffe l'indentation, mon code est bien indenté :-)
Oui ça faisait un moment, je manque vraiment de temps là...



Commentaire de codefalse le 28/11/2008 15:52:38 administrateur CS

T'inquiète, je me doutais bien que c'était pas toi ! :)

Bon, j'espère que l'on te reverra rapidement ! :)
Bon taff à toi.

Commentaire de malalam le 28/11/2008 21:16:35 administrateur CS

Akhé, petite rectification que je n'avais pas noté :
function maFonction(array $var1, string $var2) {
}

Ca, ça ne fonctionne pas réellement. Les seuls types autorisés pour du "type hinting" dans les appels de méthodes ou de fonctions sont array et les objets.
Quand tu fais
function foo(string $bar) {
}

ta fonction attend une variable $bar de type string...mais un objet string! Bref, une instance d'une classe appelée string. Idem pour int, ou float...bref juste array et les objets.
Par exemple :
foo('toto');
renverra une erreur "catchable".
mais
class string{}
$var = new string;
foo($var);
fonctionnera.
Sauf que ce n'est pas une chaîne...ce n'est pas une variable de type "string".
Après, rien n'empêche de réécrire les types classiques sous forme de classes...évidemment.

Commentaire de malalam le 28/11/2008 21:24:58 administrateur CS

Un exemple très simple et totalement incomplet...(et franchement inutile en l'état) :
<?php
class string {
protected $sValue;
public function __construct($sString) {
if(!is_string($sString)) {
throw new Exception('argument must be a string');
}
$this->sValue = $sString;
}


public function __toString() {
return $this->sValue;
}
}

$toto = new string('toto');
echo str_replace('o', 'i', $toto);
function say(string $bar) {
echo $bar;
}
echo say($toto);
?>

Commentaire de DiGhan le 29/11/2008 01:03:15

Bonsoir à tous,

J'aimerai juste revenir sur ce qu'aKheNathOn a ecrit concernant les "pointeurs".

En PHP5 (comme en PHP4) la notion de pointeurs est inexistante, il n'y a que des références (objets) ou des copies (scalaires, array).

Le code suivant est donc obsolète (pour PHP >= 5 et pour de l'affectation) :
public function __construct (PDO &$oPdo) $this->_oPdo =& $oPdo;

Exemple à l'appui:

$a = new stdClass();
$b = $a;
$b->val = 2;
var_dump($a, $b);
// $a = $b = object(stdClass)#1 (1) {["val"]=> int(2) }

Cet exemple n'est pas toujours vrai surtout si vous travaillez avec PHP < version 5.

Commentaire de malalam le 29/11/2008 10:36:36 administrateur CS

Hello,

en fait, je vais nuancer tes propos Dighan : il y a des subtilités, j'avais lu cette remarque dans les commentaires de la doc :
<?php
class a {
public $bar = 1;
}

class b {
public $bar = 2;
}
$a = new a;
$b = new b;

$tmp = $a;
$a = $b;
$b = $tmp;

var_dump($a);
var_dump($b);

$a = new a;
$b = new b;

$tmp = $a;
$a = & $b;
$b = $tmp;

var_dump($a);
var_dump($b);
?>

Pour rester simple, de ce que j'en comprends, PHP5 utilise en fait des "copies"... : quand vous passez un objet en paramètre à une méthode/fonction, vous avez bien 2 variables distinctes. Mais ces 2 variables référencent un même identifiant (repéré par le #X dans un var_dump()), et cet identifiant POINTE vers une valeur. Etant donné qu'elles REFERENCENT le même identifiant, on parle de "références".
Avec le & (ampersand), vous créez un alias : c'est exactement la même variable, qui va posséder 2 noms différents, si vous voulez. Dans le 2ème cas de mon exemple donc, nous avons bien de vraies références. Contrairement au 1er cas.

C'est une petite subtilité qui peut amener à pas mal d'incompréhensions.

un clone effectue une copie conforme de l'objet. Une vraie copie : nous avons alors 2 identifiants.
Donc :
<?php
class a {
public $bar = 1;
}

class b {
public $bar = 2;
}

$a = new a;
$b = new b;
$a = $b;
$c = clone $a;
var_dump($a, $b, $c);

$a = new a;
$b = new b;
$a = & $b;
$c = clone $a;
var_dump($a, $b, $c);
?>

MAIS :
<?php
class a {
public $bar = 1;
}

class b {
public $bar = 2;
}

$a = new a;
$b = new b;
$c = clone $a;
$a = $b;
$b = $c;
var_dump($a, $b, $c);

$a = new a;
$b = new b;
$c = clone $a;
$a = & $b;
$b = $c;
var_dump($a, $b, $c);
?>

Bref, ce n'est pas si simple que ça...

Commentaire de codefalse le 29/11/2008 13:12:56 administrateur CS

Pour la référence de Malalam sur le type hinting, je ne m'en rappelais plus, mais c'est pour ca que je ne met que les type objets en cast pour mes fonctions, et pas string, int, float. Voila pourquoi je n'ai que PDO. Ma référence était sur un point que j'avais probablement lus dans la doc mais dont je ne me souvenais plus :p

Par ailleurs, et pour faire simple, String (l'objet) fonctionne en type hinting tout simplement car ... c'est un objet ! :)

Pour ce qui est des références, encore une fois j'avais vu ca dans la doc (que "tout" est référence en php5) mais encore une fois, je ne m'en rappelais plus ! En fait j'apprends des notions, je les appliques et j'oublie les notions ensuite, c'est pas trop pédagogue tout ca :p

Mais merci pour ces piqûres de rappel ! :)

Commentaire de vincent7766 le 01/12/2008 16:00:08

juste une ptite question facile

L'utilisation de la nomentlature
$o signifie que cette variable n'est instancié qu'une seule fois(once)?

$m signifie que cette variable est une variable membre d'une classe?

Commentaire de vincent7766 le 01/12/2008 16:01:35

et le $a, je ne sais vraiment pas qu'est ce que cela peut bien signifier

Commentaire de codefalse le 01/12/2008 16:25:22 administrateur CS

Non pas vraiment ;)

En règle générale, je nomme mes variables ainsi : typeNom, avec type la première lettre du type de variable (i pour integer, s pour string, o pour object, a pour array). Ensuite je lui donne un nom précis (genre pour pdo : oPdo).

$o, en fait c'est pour faire vite, donc c'est juste pour dire que c'est un objet, mais la variable n'a pas de nom au sens ou je lui en donne.

Ce n'est pas vraiment une nomenclature, juste une façon de procéder. Chaque personne à sa méthode, certain font pareils, ca dépend des gens :)

Commentaire de vincent7766 le 01/12/2008 17:24:32

ok merci de la précision ;)

Commentaire de destinyfr le 01/12/2008 18:11:47

As-tu essayé la classe sur un serveur web ? parce que quand je remplis les champs dans le fichier index, avec ou sans la BDD name (informations pour faire la connexion), je reçois une erreur de type uncatchable.

peut-être que cela vien de moi ?

Commentaire de codefalse le 01/12/2008 18:24:51 administrateur CS

ma source ou un des commentaires ? (si oui, préciser qui :p)

Ma source à été testé sur mon serveur, pourrais tu donner plus de détails sur l'erreur générée ?

Merci :)

Commentaire de destinyfr le 01/12/2008 20:53:50

Salut

C'est en ce qui concerne la source ^^

Désolé je pensais avoir posté l'erreur :

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1142 SELECT command denied to user '******'@'*******' for table 'Users'' in /testclass/classes/Models/Mysql/Users.php:24 Stack trace: #0 /testclass/classes/Models/Mysql/Users.php(24): PDOStatement->execute(Array) #1 /testclass/index.php(18): Users->selectFromId(1) #2 {main} thrown in /testclass/classes/Models/Mysql/Users.php on line 24

Y a du bordel ^^ (un message comme celui la jamais vu encore XD).

J'ai bien essayé de rajouter dans les dns (page index.php) le nom de la base de donnée mais rien à faire :(

Commentaire de destinyfr le 01/12/2008 20:57:07

oulalalala désolé pour l'erreur ^^' cela venait d'une erreur toute bête dans la source :

Ta table ce nom : User
Dans le code tu recherche sur : opel.Users

Voilà l'erreur ^^

Tin voilà une chose qui pourrais ce voir être rajouté :) éviter les grosses lignes comme ça dès qu'une erreur arrive :)

Encore désolé :)

Commentaire de codefalse le 01/12/2008 23:57:07 administrateur CS

Oui en effet, j'ai l'habitude de mettre la base avec la table, et donc forcément, le script ne risque pas de marcher si votre base ne s'appelle pas opel :s

Merci d'avoir relevé l'erreur, je corrigerai au plus vite ! :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

php et base de donnée sql.... HELP ;-) [ par zarzar ] je souhaite adapter en ligne (en php) un programme que j'ai créé sous excel et qui effectue des calculs de moyennes (avec des coeff, des matières), je copie de donnée sql [ par Alpha911 ] j'ai une base avec comme table PREVALID contenant ident, nom, prenom, compteftpj'ai une autre table COMPTE contenant id, repertoire et je voudrais que LA taille d'une base de donnée sql [ par FleX ] ba en fait je suis sur Free et j'ai une base de donnée que je manipule en php.J'aimerai savoir comment c'est ty qu'on peut bien faire pour obtenir la existence de donnée dans base de donnée [ par gabs77 ] Bonjour, j'ai 2 pb dans un premier temps, j'aimerais enregistrer dans une base de donn&#233;e un champet pour une meme donn&#233;e g 2 possibilit&#233 Problème affichage [ par ChucklaPuck ] Bonjour,J'ai présentement une base de donnée qui comporte plusieurs champs, dont 1 qui est idNouvelle qui a comme attribut auto_increment...Dans une d Driver PDO sql server [ par dorian91 ] Bonjours a tous,Voila j'ai un petit probleme avec la connexion a sql server avec PDOMessage erreur : "Could not find driver"Ma configuration PHP5 : ex [PDO]Compter le nombre de requêtes SQL [ par Zead2000 ] Bonjour, Je voudrais savoir s'il existe un moyen en PDO pour compter le nombre de requêtes SQL effectuer dans un script.Si oui, est-ce que vous pouvez sql dans un array [ par Alpha911 ] Bonjour, J'ai parcouru les aides sur les forums mais ce n'est pas tres clair pour moi. Je dispose d'une base de donnée dans laquelle se trouve des ad Lier une base de donnée SQL et Excel [ par maktist ] Bonjour, j'ai une basse de donnée créé par MySQL et intégré dans un site web et j'ai aussi une feuille excel je voudrais faire une requette sue le s Accès donnée sur SQL server [ par thekingsky38 ] Bonjour à tous Voilà près de 6heures que je chercher déséspérément à acceder à mes données sur un serveur SQL server. J'ai un serveur web IIS4, qui pr


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,196 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales