JeuWeb - Crée ton jeu par navigateur
function() passage d'arguments(que se passe t il en interne ?) - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : function() passage d'arguments(que se passe t il en interne ?) (/showthread.php?tid=4872)

Pages : 1 2


function() passage d'arguments(que se passe t il en interne ?) - php_addict - 04-06-2010

bonsoir

ma question est un peu bête peut être mais j'aimerais comprendre le fonctionnement en interne du passage d'arguments dans une function() avec php5

exemple:

Code :
$tableau=Array ('0' => 1231' , '1' => 7893' , '2' => '45654' );

traite_mon_tableau($tableau);

que se passe t il exactement? est ce que toutes les données sont transmissent à la function() ou est ce que simplement un pointeur mémoire est transmis à la fonction ?

d'après ce que j'ai pu comprendre le passage d'argument par reference n'est plus supporté dans php5 (ca tombe bien je ne savait pas que cela eu existé...)

bonne soirée Wink


RE: function() passage d'arguments(que se passe t il en interne ?) - Shudrum - 04-06-2010

Sisisi, les références existent dans php 5, et il est très conseillé de les utiliser pour gratter de la mémoire.

L'idée, si jamais tu as ton tableau :

Code PHP :
<?php 
$tableau
=Array ('0' => 1231' , '1' => 7893' , '2' => '45654' );

traite_mon_tableau($tableau);

Dans ta fonction traite_mon_tableau :

Code PHP :
<?php 
function traite_mon_tableau($tableau_recu) {

echo
$tableau_recu[0];

// Affiche 1231

}

En fait, php fait une copie de $tableau dans $tableau_recu, cela double donc l'utilisation de la mémoire.

Si tu utilises une référence (avec &, voir plus bas), cela n'envoie que le pointeur == gain de mémoire.

Par contre, si tu modifies ton tableau, il est logique que cela se répercute :

Code PHP :
<?php 
function traite_mon_tableau(&$tableau_recu) {

echo
$tableau_recu[0];

$tableau_recu[0]++;

}

$tableau=Array ('0' => 1231' , '1' => 7893' , '2' => '45654' );

traite_mon_tableau($tableau); // Affiche 1231

echo $tableau; // Affiche 1232

Alors que sans référence (sans le &) :

Code PHP :
<?php 
function traite_mon_tableau($tableau_recu) {

echo
$tableau_recu[0];

$tableau_recu[0]++;

}

$tableau=Array ('0' => 1231' , '1' => 7893' , '2' => '45654' );

traite_mon_tableau($tableau); // Affiche 1231

echo $tableau; // Affiche 1231



RE: function() passage d'arguments(que se passe t il en interne ?) - php_addict - 04-06-2010

merci pour toutes tes précisions Wink

j'avais eu ceci:

Citation :Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference,

car j'avais fait cela:

Code :
traite_mon_tableau(&$tableau)

:$


RE: function() passage d'arguments(que se passe t il en interne ?) - jo_link_noir - 04-06-2010

(04-06-2010, 09:33 PM)Shudrum a écrit : Sisisi, les références existent dans php 5, et il est très conseillé de les utiliser pour gratter de la mémoire.
Mais ça ne sert à rien de mettre une référence quand ce n'est pas nécessaire. Php optimise le passage de paramètre en vessant ‑justement‑ une référence, puis une copie si besoin lorsque la variable est modifier : copie à l'écriture.
Voir les exemple de debug_zval_dump.


RE: function() passage d'arguments(que se passe t il en interne ?) - php_addict - 04-06-2010

(04-06-2010, 11:07 PM)jo_link_noir a écrit : Mais ça ne sert à rien de mettre une référence quand ce n'est pas nécessaire. Php optimise le passage de paramètre en vessant ‑justement‑ une référence, puis une copie si besoin lorsque la variable est modifier : copie à l'écriture.
Voir les exemple de debug_zval_dump.

c'est ce que j'étais en train de tester, c'est quand même bien foutu php5, on fait n'importe quoi et php gère au mieux...


RE: function() passage d'arguments(que se passe t il en interne ?) - Shudrum - 05-06-2010

(04-06-2010, 11:07 PM)jo_link_noir a écrit :
(04-06-2010, 09:33 PM)Shudrum a écrit : Sisisi, les références existent dans php 5, et il est très conseillé de les utiliser pour gratter de la mémoire.
Mais ça ne sert à rien de mettre une référence quand ce n'est pas nécessaire. Php optimise le passage de paramètre en vessant ‑justement‑ une référence, puis une copie si besoin lorsque la variable est modifier : copie à l'écriture.
Voir les exemple de debug_zval_dump.

Merci beaucoup, tu m'apprends un truc génial là.

Grosso merdo, faut demander une ref que lorsque l'on veut modifier directement la variable ?
Cool


RE: function() passage d'arguments(que se passe t il en interne ?) - jo_link_noir - 05-06-2010

Ouaip, et quand tu voix un paramètre passé par référence c'est pars-qu'il sera modifié. En tout cas, c'est comme ça que je fonctionne Smile.


RE: function() passage d'arguments(que se passe t il en interne ?) - Argorate - 06-06-2010

(04-06-2010, 11:54 PM)php_addict a écrit : c'est quand même bien foutu php5, on fait n'importe quoi et php gère au mieux...

C'est ça qui fait que php est un bon language pour moi Smile

En tout as c'est bien pratique cette affaire ^^
merci pour linfo!


RE: function() passage d'arguments(que se passe t il en interne ?) - NicoMSEvent - 07-06-2010

c'est comique, j'ai justement transformé mon code pour utiliser des références au lieu de passer des objets (et tableau d'objets) en parametre, et ça juste avant ce post! J'ai l'impression d'etre en plein dans le bon mouvement, et de devancer d'un cheveu les idées du forum ^^

Edit : un petit lien qui m'a bien servi : http://www.siteduzero.com/tutoriel-3-91013-allez-plus-loin-avec-les-variables.html


RE: function() passage d'arguments(que se passe t il en interne ?) - php_addict - 07-06-2010

Code PHP :
<?php 
$variable
= '123456';

echo
debug_zval_dump($variable); // AFFICHE : string(6) "123456" refcount(2)
test1($variable); // (sans référence) AFFICHE : string(6) "123456" refcount(4)
test2($variable); // (par référence) AFFICHE : string(6) "123456" refcount(1)

function test1($variable)
{
echo
debug_zval_dump($variable);
}

function
test2(&$variable)
{
echo
debug_zval_dump($variable);
}
?>

- je ne suis pas certain de comprendre le refcount()
- quelle fonction bouffe le moins de mémoire?
- la doc de php dit:

http://fr.php.net/manual/fr/function.debug-zval-dump.php a écrit :Un refcount de 2, ici, est vraiment inattendu. Tout spécialement si on considère les exemples ci-dessus. Donc, que se passe-t-il ?
Lorsqu'une variable a une seule référence (faire $var1 avant qu'elle ne soit utilisée en tant qu'argument de la fonction debug_zval_dump()), le moteur PHP optimise la façon dont elle est passée à la fonction. En interne, PHP traite $var1 comme une référence (et donc, le refcount est incrémenté), et avec le cas où le passage par référence intervient, une copie est alors faite, mais uniquement au moment de l'écriture. Ceci est connu comme "la copie à l'écriture".
Donc, si debug_zval_dump() intervient pour écrire son unique paramètre (et il ne le fait pas), alors une copie est faite. Jusque-là, le paramètre demeure une référence, faisant que le refcount est incrémenté à 2 pour l'appel à la fonction.