References et objets, bonne pratique

References et objets, bonne pratique - PHP - Programmation

Marsh Posté le 06-07-2009 à 10:29:58    

Bonjour, j'ai quelques questions sur les bonnes pratiques de PHP:
 
1.Je sais que quand on transmet une variable par fonction, celle-ci est recopiée. Est-ce qu'il en est de même pour les objets?
 

Code :
  1. class Foo{
  2.    function bar($a){
  3.        return $a++;
  4.    }
  5.     function _bar(&$a){
  6.        $a++;
  7.    }
  8. }


 
2.Existe-ils des conventions de nommages pour des fonctions travaillant avec des références?
 
J'aimerai mieux comprendre comment _bar(&$a) fonctionne.  
 
Je sais que grâces aux références & ont peut "retourner" plusieurs valeurs, contrairement au return qui est limité à une seule valeur de retour.
 
Imaginons que maintenant $a soit une image de type $a= new Imagick('image.jpg');
3.On gagne en performance si on passe la reference de $a et non sa copie ?
 
Je sais pas si j'ai été clair, mais je suis très intéressé par vos conseils et opinions!
 
Merci  :)  
 
 


---------------
http://petitjonas.blogspot.com/
Reply

Marsh Posté le 06-07-2009 à 10:29:58   

Reply

Marsh Posté le 06-07-2009 à 10:49:03    

Exemple plus précis:
 
Imaginons la classe Article suivante:

Code :
  1. Class Article{
  2. public $id;
  3. public $titre;
  4. public $contenu;
  5. public function __Construct($id,$title,$content){...}
  6. /*inserer getter/setter*/
  7. /*inserer __toString*/
  8. }


 
et deux fonctions, une "traditionnelle" et la deuxième travaillant avec une référence: (le tout serai contenu dans une classe appelé manageArticle)
 

Code :
  1. public function getLastArticle(){
  2. $request = "SELECT * FROM journal WHERE id=(SELECT MAX(id) FROM journal)";//requete à revoir :o
  3. $resultset = $this->manageDB->queryPrepared($request);
  4. if($resultset->numRows()){
  5.  $row= $resultset->fetchRow(MDB2_FETCHMODE_ASSOC); //package MDB2 de PEAR
  6.  $article = new Article($row['id'],$row['titre'],$row['contenu']);
  7. }
  8. return $article;
  9. }


 
et
 

Code :
  1. public function _getLastArticle(&$article){
  2. $request = "SELECT * FROM journal WHERE id=(SELECT MAX(id) FROM journal)";
  3. $resultset = $this->manageDB->queryPrepared($request);
  4. if($resultset->numRows()){
  5.  $row= $resultset->fetchRow(MDB2_FETCHMODE_ASSOC);
  6.  $article->id=$row['id'];
  7.  $article->titre=$row['titre'];
  8.  $article->contenu=$row['contenu'];
  9. }
  10. }


 
Donc on pourrait se servir de ces deux méthodes comme ça :
 

Code :
  1. $ArticleManager=new manageArticle();
  2. $monArticle1=$ArticleManager->getLastArticle();
  3. $monArticle2=new monArticle();
  4. $monArticle2=$ArticleManager->_getLastArticle(&$monArticle);


 
Je suis pas sur si c'est la bonne méthode pour apeler la deuxieme fonction (_getLastArticle)
 
Avons-nous un avantage à utiliser la deuxième méthode sur la première? Gain de performance etc..
 
 


---------------
http://petitjonas.blogspot.com/
Reply

Marsh Posté le 06-07-2009 à 11:13:58    

&$a -> tu passes la variable $a par référence, en gros, tu passes l'adresse mémoire de la variable, donc y'a pas de recopie/duplication de la variable.
Su tu fais  

Code :
  1. fonction test(&$a, &$b)
  2. {
  3.     $a += 1;
  4.     $b += 2;
  5.     return $a + $b;
  6. }


tu récupéreras la somme de $a +$b modifiées ainsi que les nouvelles valeurs de $a et $b (donc t'auras 3 résultats à l'issue de l'exécution de la fonction test.
 
Ca marche aussi pour les objets mais il me semble qu'il peut y avoir des pbs par ex quand tu les stockes dans des variables de session, là, faut serializer.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 06-07-2009 à 13:00:50    

J'aimerai bien votre avis sur des méthodes qui traitent avec des ressources ou variable "non négligeable", images, tableau important,objets etc


---------------
http://petitjonas.blogspot.com/
Reply

Marsh Posté le 06-07-2009 à 13:19:57    

notre avis sur quoi à propos des ressources non négligeables :??:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 06-07-2009 à 13:21:31    

Euh si il vaut mieux les traiter en tant que copie ou en reference? et est-ce qu'il y peut y avoir des problèmes de synchro entre les fonctions comme dans d'autre langage?  :)


---------------
http://petitjonas.blogspot.com/
Reply

Marsh Posté le 06-07-2009 à 13:26:01    

en référence, ça ira plus vite et ça prendra moins de mémoire mais si ton site n'a pas trop de trafic, ça n'a pas trop d'importance.
Pour les pbs de synchro, si tu fais référence à des bouts de code exécutés en parallèle qui utiliseraient la même variable passée en référence, ben forcément que ça va posé pb. Maintenant, du // en script php, j'en n'ai jamais vu...et ça doit présenter peu d'intérêt je pense.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 06-07-2009 à 13:39:43    

Okay donc en régle générale à moins d'avoir beaucoup de trafic faut pas trop s'embêter avec cette histoire de passage en référence?


---------------
http://petitjonas.blogspot.com/
Reply

Marsh Posté le 06-07-2009 à 13:49:49    

perso, j'ai développé un intranet en php/mysql/html/css/js et j'ai pas fait de passage par référence ; or y'a plusieurs dizaines de personnes en permanence dessus. C'est rarement ça qui limite les perfs d'un site : ce sont les requêtes SQL qui sont généralement le goulot d'étranglement...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 06-07-2009 à 13:50:33    

si tu veux voir du bon code php objet, regarde le soft en GPL Magento (pour faire des boutiques en ligne).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 06-07-2009 à 13:50:33   

Reply

Marsh Posté le 06-07-2009 à 13:52:27    

ok ok merci de tes reponses ça m'aide vachement. J'aime pas trop rester sur mes acquis enfait..
 
 
J'irai voir le code de Magento :)


Message édité par jonas3 le 06-07-2009 à 13:52:39

---------------
http://petitjonas.blogspot.com/
Reply

Marsh Posté le 06-07-2009 à 14:41:37    

Salut,

 

Moi j'aurais tendance à te dire de passer par référence les choses qui risquent d'être lourdes (grosses images, gros objets, ... ) et le reste tu le laisses par copie si ça t'arrange ainsi.
Ensuite, une fois que ton site web sera fini tu feras un profiling pour regarder où sont les goulots d'étranglements.

 

Edit: Dans certains cas, tu peux même te permettre de laisser un goulot d'étranglement tel quel (car complexe à changer) et simplement implémenter un système de cache... C'est notamment ce que Rails fait :o

Message cité 1 fois
Message édité par esox_ch le 06-07-2009 à 14:42:45

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 06-07-2009 à 14:56:52    

Je note, ça à l'air interessant.
 
Merci bien :)


---------------
http://petitjonas.blogspot.com/
Reply

Marsh Posté le 06-07-2009 à 16:20:20    

Notons que lorsqu'on passe par copie, une copie de la variable n'est pas automatiquement réalisée; en fait une référence est tout de même passée. Dès lors qu'on modifie la variable, alors la copie est déclenchée.

Reply

Marsh Posté le 06-07-2009 à 16:43:24    

Ah tiens, ça je le savais pas :bounce:
T'as un lien sur ça? C'est dans la doc?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 06-07-2009 à 21:34:10    

esox_ch a écrit :

Salut,
 
Moi j'aurais tendance à te dire de passer par référence les choses qui risquent d'être lourdes (grosses images, gros objets, ... ) et le reste tu le laisses par copie si ça t'arrange ainsi.


 
Hello,
 
supposons un tableau $my_array qui contienne 15000 entrées :

Code :
  1. $my_array['alpha'][0] = 'aaa';
  2. $my_array['alpha'][1] = 'bbb';
  3. ...
  4. $my_array['omega'][31337] = 'omega';


 
(peu importe ce qu'il y a dedans, qu'il soit à simple ou double indice, juste un tableau assez gros)
 
faire :

Code :
  1. function Myfunction(&$my_array)
  2. {
  3.     ...
  4. };


 
serait-il alors mieux que :

Code :
  1. function Myfunction()
  2. {
  3.     global $my_array;
  4.     ...
  5. };


?


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 06-07-2009 à 22:38:48    

Je dois admettre ne jamais avoir utilisé la deuxième syntaxe, j'ai toujours privilégié la première.
Maintenant, à en croire la doc les 2 formes seraient équivalentes parce que toutes les 2 créent une référence vers la même variable. Mais comme je l'ai dit, je n'ai jamais utilisé la seconde syntaxe, donc il y a peut-être une différence de performances.  
Reste que les 2 syntaxes utilisent le passage par référence :bounce:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed