En PHP, je fais souvent beaucoup de manipulation de chaînes. Est-ce que je peux diviser mon code en plusieurs fonctions, parce que si les types primitifs comme les chaînes sont passés par valeur, cela affecterait significativement les performances.Les types de données primitifs dans PHP sont-ils transmis par référence?
Répondre
Seuls les objets sont transmis par référence. Cela ne veut pas dire que vous obtiendrez une amélioration des performances en passant à des références - PHP utilise la copie sur écriture, donc une copie n'est faite que si vous modifiez la variable. Diviser votre code en fonctions ne le ralentira pas de ce point de vue. Il y a un petit surcoût pour appeler une fonction, mais à moins que vous ne soyez dans une boucle qui en appelle 10 000, ce n'est probablement pas quelque chose dont vous avez besoin.
Les objets sont transmis par référence. Tout le reste est transmis par valeur, sauf si vous utilisez explicitement pass-by-reference with the & operator. Cela étant dit, PHP utilise également copy-on-write pour éviter les copies inutiles.
Oui, les primitives sont transmises par valeur sauf si vous définissez explicitement la fonction à passer par référence (en utilisant une esperluette &
devant le paramètre) ou invoquez la fonction avec une esperluette devant l'argument. (Ce dernier est déconseillé)
Voir this part of the documentation pour plus d'informations.
EDIT
En outre, l'affirmation selon laquelle « les objets sont passés par référence » en PHP est un peu d'une simplification, mais il peut souvent penser de cette façon pour la plupart des cas. Ce chapter of the documentation explique les différences.
Par défaut, tout est passé par valeur. Si vous voulez passer quelque chose par référence, vous devez l'indiquer explicitement. Il s'agit du php documentation that explicitly states this behavior.
Le passage par référence est en fait plus lent que le passage par valeur en PHP. Je ne peux pas trouver la citation correcte pour cette réclamation; C'est quelque part dans la section "Références" du manuel PHP.
- 1. Utilisation des propriétés pour les types primitifs
- 2. Types primitifs et conteneurs IoC
- 3. Liste de fait des types primitifs utilisables en C++
- 4. Dois-je initialiser TOUS les types de données primitifs à des valeurs 'sûres' dans Obj-C?
- 5. Débogueur Xcode: Afficher l'adresse mémoire pour les types primitifs?
- 6. Types de référence dans .NET
- 7. Comment les méthodes d'objet toString(), ==, equals() fonctionnent-elles différemment ou de manière similaire sur les types de référence et les types primitifs?
- 8. Retour automatique par référence dans PHP
- 9. Quelles sont les limitations des types de caractères primitifs dans D?
- 10. Types de référence Linq2SQL
- 11. Surcharge pour l'interopérabilité native utilisant uniquement des types primitifs
- 12. php webservices et types de données
- 13. Déduction des types de référence dans les fonctions de gabarit
- 14. Types de référence de copie profonde
- 15. Surcharge d'une méthode pour prendre en charge les types de référence et les types nullables
- 16. "Réutiliser les types existants" est ignoré lors de l'ajout d'une référence de service
- 17. Linq to Sql + types de données personnalisés
- 18. PHP Comportement de référence dans VARIABLES et CLASSES (qui sont formés par référence) - sont-ils différents ou identiques?
- 19. Types de données complexes dans WCF?
- 20. Toute bibliothèque pour les types de données génériques dans C?
- 21. Passer une variable par référence dans une extension PHP
- 22. Comment classer les types MIME (PHP)
- 23. PostgreSQL et les types de données C#
- 24. Quels sont les types de données JavaScript?
- 25. Rendre mysql_fetch_assoc automatiquement détecter les types de données de retour?
- 26. Comment puis-je lister les types définis par l'utilisateur dans une base de données SQL Server?
- 27. Types de données C# et types de données MySql
- 28. Utilisation de tableaux par référence
- 29. Performances du type de référence de tri par rapport aux types de valeur
- 30. Types de données dbUnit
Les objets ne sont pas transmis par référence. Les objets sont des types de référence, mais ils sont transmis par valeur en tant que paramètres de fonction, sauf indication contraire. – Joseph
Ils ne sont pas techniquement transmis par référence mais assez proche. C'est vrai à partir de PHP 5 - PHP 4 était différent. – Greg