66 votes

Les objets PHP5 sont-ils passés par référence?

Je n'arrive pas à obtenir d'informations cohérentes à ce sujet. Différentes sources semblent dire différentes choses et le vénérable php.net lui-même ( semble ) ne pas l'indiquer explicitement - bien que, je dois l'avouer, je n'ai fait qu'un rapide coup d'œil.

Dans les cas où je passe des objets "lourds", je dois passer par référence, mais je ne veux pas continuer à taper:

 function foo(TypeName& $obj)
 

si je peux m'en sortir simplement

 function foo(TypeName $obj)
 

Alors, que dit la norme?

91voto

webbiedave Points 28781

Les objets sont passés (et affecté) par référence. Pas besoin d'utiliser l'adresse de l'exploitant.

Accordé ce que j'ai tapé est une simplification excessive, mais permettra de répondre à vos fins. La documentation états:

L'un des points clés de PHP5 POO que il est souvent mentionné est que "les objets sont passés par des références par défaut". Ce n'est pas tout à fait vrai. Cette section rectifie que la pensée générale à l'aide de quelques exemples.

Un PHP de référence est un alias, qui permet à deux variables différentes pour écrire à la même valeur. Comme de PHP5, un objet variable ne contient pas de objet lui-même en tant que valeur de plus. Il seulement contient un identificateur d'objet ce qui permet d'objet accesseurs pour trouver l'objet réel. Lorsqu'un objet est envoyé par argument, retourne ou attribuée à une autre variable, les différents les variables ne sont pas les alias: ils tiennent un copie de l'identifiant, points pour le même objet.

Pour une explication plus détaillée (explique la simplification ainsi que les identifiants) découvrez cette réponse.

8voto

Josh Points 7132

À partir du manuel PHP:

Vous pouvez passer une variable par référence à une fonction si la fonction peut modifier la variable. La syntaxe est comme suit:

<?php
function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
// $a is 6 here
?>

Remarque: Il n'y a pas de signe de référence sur un appel de fonction - seulement sur la fonction les définitions. Définitions de fonction à lui seul suffit pour passer correctement la argument par référence. Comme de PHP 5.3.0, vous obtiendrez un avertissement disant que "call-time pass-by-reference" est obsolète lorsque vous utilisez et en foo(&$a);.

Et à partir de Ce qui est Nouveau en PHP5:

En PHP 5, les infrastructures de la modèle d'objet a été réécrit pour le travail avec des poignées d'objet. À moins que vous explicitement le clonage d'un objet à l'aide de le mot-clé clone vous n'aurez plus jamais créer derrière la scène les doublons de vos objets. En PHP 5, il est ni un besoin pour passer des objets par référence ni à l'attribution par référence

Donc le seul moment où vous devez utiliser l' function foo(&$var) syntaxe est si $var pourrait ne pas être une instance d'une classe.

3voto

Abraham Vegh Points 896

Depuis PHP 5, tous les objets sont passés et assignés par référence.

En PHP 4, vous devez toujours spécifier où vous voulez que les objets soient passés par référence, en utilisant explicitement l'opérateur & .

2voto

Álvaro G. Vicario Points 57607

Bref, la réponse est oui. À partir d'Objets et références:

L'un des points clés de PHP5 POO que il est souvent mentionné est que "les objets sont passés par des références par défaut". Ce n'est pas tout à fait vrai. Cette section rectifie que la pensée générale à l'aide de quelques exemples.

Un PHP de référence est un alias, qui permet à deux variables différentes pour écrire à la même valeur. Comme de PHP5, un objet variable ne contient pas de objet lui-même en tant que valeur de plus. Il seulement contient un identificateur d'objet ce qui permet d'objet accesseurs pour trouver l'objet réel. Lorsqu'un objet est envoyé par argument, retourne ou attribuée à une autre variable, les différents les variables ne sont pas les alias: ils tiennent un copie de l'identifiant, points pour le même objet.

Ce qui importe, c'est que, dans le cas qui vous préoccupe, vous ne serez jamais en faire une copie d'un objet, sauf si vous explicitement utiliser le clone mot-clé dans l'appel de fonction. Si c'est un alias ou un identificateur ne change pas ce fait.

1voto

Sarfraz Points 168484

Oui à partir de PHP5-delà, les objets sont passés par référence. Pas besoin de le faire explicitement.

http://www.php.net/manual/en/migration5.oop.php

En PHP 5, il y a un nouveau Modèle d'Objet. PHP est de la manipulation d'objets a été complètement réécrit, permettant de meilleures performances et plus de fonctionnalités. Dans les versions précédentes de PHP, les objets ont été traitées comme des types primitifs (par exemple des entiers et des chaînes de caractères). L'inconvénient de cette méthode est que de la sémantique de l'objet entier a été copié lorsqu'une variable a été cédé ou transmis en tant que paramètre d'une méthode. Dans la nouvelle approche, les objets sont référencés par la poignée, et non par valeur (on peut penser à une poignée comme un objet d'identification).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X