2009-05-19 10 views
0

Avec PHP5 en utilisant "copier sur écriture" et en passant par référence provoquant plus d'une pénalité de performance d'un gain, pourquoi devrais-je utiliser passer-par-référence? A part les fonctions de rappel qui retourneraient plus d'une valeur ou les classes dont les attributs que vous voulez modifier sans appeler une fonction set plus tard (mauvaise pratique, je sais), y a-t-il un usage qui me manque?Faut-il passer variable par référence en php5?

Répondre

3

Vous utilisez le renvoi par référence lorsque vous voulez modifier le résultat et c'est tout ce qu'il y a à faire. Rappelez-vous également que les objets PHP sont toujours passer-par-référence.

Personnellement, je trouve implicitement le système de copie de valeurs de PHP (je suppose pour me défendre contre une modification accidentelle) lourd et non intuitif mais là encore j'ai commencé dans des langages fortement typés, ce qui explique probablement cela. Mais je trouve intéressant que les objets diffèrent du fonctionnement normal de PHP et je le prends comme preuve que le mécanisme de copie implicite de PHP n'est vraiment pas un bon système

+0

Le comportement de Java est identique à celui de PHP (objets passés par référence, primitives passées ["copiées"] par valeur), comme je crois, C++. De quelles langues fortement typées parlez-vous? –

+2

Java ne * passe * pas les objets par référence; il copie la valeur d'une référence d'objet; voir http://stackoverflow.com/questions/40480/is-java-pass-by-reference. – Rob

+1

Assez juste. Sur la base de l'exemple de laurentb ci-dessous, il semblerait que vous puissiez dire la même chose à propos de PHP, ce qui ne fait que renforcer mon argument: la façon dont les arguments sont passés en PHP et Java sont presque indiscernables. J'attends toujours un exemple de "langage fortement typé" qui copie les objets passés en arguments. –

2

Une fonction récursive qui remplit un tableau Rappelez-vous d'écrire quelque chose comme ça , une fois.

Il est inutile d'avoir des centaines de copies d'un tableau partiellement rempli et la copie, l'épissage et l'assemblage de pièces à chaque tour.

0

objets Même lors du passage il y a une différence.

Try this exemple:

class Penguin { } 

$a = new Penguin(); 

function one($a) 
{ 
    $a = null; 
} 

function two(&$a) 
{ 
    $a = null; 
} 

var_dump($a); 
one($a); 
var_dump($a); 
two($a); 
var_dump($a); 

Le résultat sera:

object(Penguin)#1 (0) {} 
object(Penguin)#1 (0) {} 
NULL 

Lorsque vous passez une variable contenant une référence à un objet par référence, vous pouvez modifier la référence à l'objet.

Questions connexes