Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1680 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  References et objets, bonne pratique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

References et objets, bonne pratique

n°1902540
jonas3
Posté le 06-07-2009 à 10:29:58  profilanswer
 

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/
mood
Publicité
Posté le 06-07-2009 à 10:29:58  profilanswer
 

n°1902554
jonas3
Posté le 06-07-2009 à 10:49:03  profilanswer
 

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/
n°1902573
rufo
Pas me confondre avec Lycos!
Posté le 06-07-2009 à 11:13:58  profilanswer
 

&$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
n°1902661
jonas3
Posté le 06-07-2009 à 13:00:50  profilanswer
 

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/
n°1902675
rufo
Pas me confondre avec Lycos!
Posté le 06-07-2009 à 13:19:57  profilanswer
 

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
n°1902676
jonas3
Posté le 06-07-2009 à 13:21:31  profilanswer
 

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/
n°1902679
rufo
Pas me confondre avec Lycos!
Posté le 06-07-2009 à 13:26:01  profilanswer
 

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
n°1902685
jonas3
Posté le 06-07-2009 à 13:39:43  profilanswer
 

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/
n°1902687
rufo
Pas me confondre avec Lycos!
Posté le 06-07-2009 à 13:49:49  profilanswer
 

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
n°1902689
rufo
Pas me confondre avec Lycos!
Posté le 06-07-2009 à 13:50:33  profilanswer
 

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
mood
Publicité
Posté le 06-07-2009 à 13:50:33  profilanswer
 

n°1902690
jonas3
Posté le 06-07-2009 à 13:52:27  profilanswer
 

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/
n°1902708
esox_ch
Posté le 06-07-2009 à 14:41:37  profilanswer
 

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
n°1902718
jonas3
Posté le 06-07-2009 à 14:56:52  profilanswer
 

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


---------------
http://petitjonas.blogspot.com/
n°1902750
FlorentG
Posté le 06-07-2009 à 16:20:20  profilanswer
 

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.

n°1902764
esox_ch
Posté le 06-07-2009 à 16:43:24  profilanswer
 

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
n°1902902
NewsletTux
<Insérez ici votre vie />
Posté le 06-07-2009 à 21:34:10  profilanswer
 

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
n°1902927
esox_ch
Posté le 06-07-2009 à 22:38:48  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  References et objets, bonne pratique

 

Sujets relatifs
Templates: bonne chose ou mauvais chose ?liste d'objets remplie manuellement
Reprendre la bonne valeur dans une fonction anonymeComment un simple exécutable peut accéder des objets COM+
Petit problème avec un hash, des tableaux et des références[resolu]n'arrive pas a supprimer la bonne ligne de ma bdd
aide au niveau pratiqueune bonne librairie pour generer de gros pdf ?
Constructeur d'objets immutable & PatternDéplacement d'objets en ajax
Plus de sujets relatifs à : References et objets, bonne pratique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR