Passage par référence/valeur

Eléphant du PHP | 281 Messages

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:

@+
Modifié en dernier par Ouaibou le 25 nov. 2005, 11:18, modifié 1 fois.

Mammouth du PHP | 1311 Messages

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

Mammouth du PHP | 1885 Messages

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?
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Eléphant du PHP | 281 Messages

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.

@+

Mammouth du PHP | 1311 Messages

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);
    }
?>

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 353 Messages

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 281 Messages

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é ;)

@+

Eléphant du PHP | 353 Messages

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer