Passage par référence/valeur

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Passage par référence/valeur

par zeus » 28 nov. 2005, 10:18

Donc pour faire un exemple correct à 100% :
function increment_val($val) {
  $val++;
}

function increment_ref(&$val) {
  $val++;
}

$a = 1
increment_val($a) ;
echo $a; // affiche 1
increment_ref(&$a);
echo $a // affiche 2

par nicolas » 27 nov. 2005, 19:29

Tout à fait, mais je ne donnais pas un cours sur la façon de créer les fonctions avec parmètre par référence mais plutôt une explication sur l'intérêt du passage par référence
J'avais compris mais ça me parait plus qu'important de préciser la façon corecte de faire.

par Ouaibou » 25 nov. 2005, 17:40

Jeff > Oui je suis d'accord avec toi mais justement j'essayé de voir si il y avait pas une manière pour faire autrement.

Zeus > J'avais donc mal compris le principe du passage par référence.

Merci à tous ceux qui m'ont aidé ;)

@+

par zeus » 25 nov. 2005, 15:22

Tout à fait, mais je ne donnais pas un cours sur la façon de créer les fonctions avec parmètre par référence mais plutôt une explication sur l'intérêt du passage par référence

par nicolas » 25 nov. 2005, 14:55

function increment($val) {
  $val++;
}

$a = 1
increment($a) ;
echo $a; // affiche 1
increment(&$a);
echo $a // affiche 2
Il est à noter que cette façon de faire est dépréciée:
http://fr3.php.net/manual/fr/language.r ... s.pass.php

Il faut définir la fonciton de manière explicite le fait que l'argument est passé par référence ce qui est tout de même plus logique.

par zeus » 25 nov. 2005, 14:04

Comme le dit jeff, le passage par référence permet de ne modifier qu'un seul objet et donc de récupérer l'objet modifié dans le script appellant la fonction agissant sur cette variable

Mais en aucun cas elle ne te permet d'éviter de l'enregistrer

Voilà un exemple simple d'utilisation de passage par référence.
Notes bien qu'il n'y a pas de return dans la fonction increment mais que $a est incrémenté en cas de passage par référence
function increment($val) {
  $val++;
}

$a = 1

increment($a) ;

echo $a; // affiche 1

increment(&$a);

echo $a // affiche 2

par jeff » 25 nov. 2005, 13:51

heu je vais essaye de te repondre sur le passage par reference:
le passage par reference permet a plusieur variable de pointer vers une meme addresse, ca permet d'eviter la copie des variables.

pour ton code, je verais plutot ca comme ceci
<?php
    private $server = "localhost";
    public $username = "root";
    private $password = "";
    private $db = "";

    public function __constructor($host, $login, $pass, $base)
    {
        $this->server = $host;
        $this->username = $login;
        $this->password = $pass;
        $this->db = $base;
        
}
       public function connection()
{
 $this->connexion = new mysqli($this->server, $this->username, $this->password, $this->db);
    }
?>

par Ouaibou » 25 nov. 2005, 11:17

Bonjour,

Jeff > Merci d'avoir testé, à vrai dire je sais qu'en PHP les variables sont passées par valeur (j'ai un peu cherché sur le net pour vérifier).

Xenon_54 > En fait je voulais utiliser le passage par référence pour changer la valeur des variables server, username, password, db sans avoir besoin de le faire en utilisant des variables locales à la fonction.

Le passage par référence me permettrait d'éviter d'écrire ceci (si j'ai bien compris) :
<?php
    private $server = "localhost";
    public $username = "root";
    private $password = "";
    private $db = "";

    public function __constructor($host, $login, $pass, $base)
    {
        // -- Imposé par le passage par valeur
        $this->server = $host;
        $this->username = $login;
        $this->password = $pass;
        $this->db = $base;
        
        $this->connexion = new mysqli($server, $username, $password, $db);
    }
?>
Bonne journée.

@+

par Xenon_54 » 25 nov. 2005, 02:20

Dans quel contexte utilises-tu le passage par référence? Est-ce lors de l'héritage de la classe mysqli?

par jeff » 24 nov. 2005, 22:39

salut
j'ai tester le passage par reference et j'ai obtenu les memes probleme

tout ce que je sais c'est les objet sont passer par reference implicitement,
mais pour les variables je ne sais pas

Passage par référence/valeur

par Ouaibou » 24 nov. 2005, 21:18

Bonsoir,

J'essais de passer un paramètre d'une fonction par référence. Pour cela je place une esperluette (&) devant la variable en question. Seulement quand je test mon script, il m'est retourné l'erreur suivante :
Fatal error: Cannot pass parameter 1 by reference in /home/www/geoffroy/www/index.php on line 13
J'utilise PHP 5.0.4

La partie de la classe en cause :
private $server = "localhost";
public $username = "root";
private $password = "";
private $db = "";
		
private $connexion = null; // Reference de l'objet mysqli cree

/**
* Instancifie une nouvelle connexion mysqli
*
* @param $server Adresse du serveur
* @param $username Nom d'utilisateur pour s'identifier
* @param $password Mot de passe pour s'identifier
* @param $db Nom de la base de donnnee a selectionner
*/		
				
public function __construct(&$server, &$username, &$password, &$db)
{
    $this->connexion = new mysqli($server, $username, $password, $db);
}
Quelqu'un saurait il m'expliquer pourquoi ça veut pas marcher ?

Merci d'avance :wink:

@+