Précédent   Forum des professionnels en informatique > PHP > Langage > Formulaires
Formulaires Forum d'entraide sur les formulaires avec PHP. Avant de poster -> FAQ formulaires, Cours de formulaires et Sources de formulaires
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/04/2008, 16h23   #1
Membre régulier
 
Avatar de FrontLine
 
Nicolas
Webmaster
Inscription : janvier 2008
Messages : 172
Détails du profil
Informations personnelles :
Nom : Nicolas
Âge : 30

Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : janvier 2008
Messages : 172
Points : 84
Points : 84
Par défaut Bonne pratique : Résolution de portée ou référence ? [résolu]

Bonjour,

je me pose une question de performance, par exemple tout le monde sait qu'il vaut mieux faire :
$date = date("Y:s:i", time());
puis utiliser plusieurs fois $date plutôt qu'executer inutilement plusieurs fois la fonction date() et time() dans cet exemple.

Maintenant dans le cas d'un objet avec une résolution de porté :
il vaut mieux utiliser plusieurs fois maClass::$objet->
ou
le déclarer une fois $objet =& maClass::$objet;
puis utiliser plusieurs fois $objet->

En fait j'ai peur que quand je fais maClass::$objet ça fait travailler PHP comme il le ferait avec une fonction() par exemple.
Ce que j'espère et qui serait parfais c'est que PHP lit maClass::$objet comme si c'était une simple variable au lieu d'executer tout un tas de chose en fond.

Merci pour votre aide.
FrontLine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2008, 16h58   #2
Membre Expert
 
Avatar de gwinyam
 
Homme Mathieu ROBIN
Développeur Web
Inscription : mai 2006
Messages : 1 116
Détails du profil
Informations personnelles :
Nom : Homme Mathieu ROBIN
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2006
Messages : 1 116
Points : 2 142
Points : 2 142
Oulà ça c'est de la question.

Je t'avouerai qu'autant il y a de sacrés beaux morceaux intéressants concernant l'optimisation du code et des temps d'exécution dans le manuel de la certification, autant cette idée là, je ne me souviens pas l'avoir vue.

Personnellement je dirais que :
Code php :
$objet =& maClass::$objet;$objet->actions();
Vaut mieux que le
Enfin c'est ce qui revient le plus dans les exemples d'utilisation du ZendFramework, je suppose que si ils font ainsi c'est qu'il y a une raison logique.
gwinyam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2008, 17h11   #3
Membre régulier
 
Avatar de FrontLine
 
Nicolas
Webmaster
Inscription : janvier 2008
Messages : 172
Détails du profil
Informations personnelles :
Nom : Nicolas
Âge : 30

Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : janvier 2008
Messages : 172
Points : 84
Points : 84
Citation:
Envoyé par gwinyam Voir le message
Enfin c'est ce qui revient le plus dans les exemples d'utilisation du ZendFramework, je suppose que si ils font ainsi c'est qu'il y a une raison logique.
Pas bête mais bon ils leur arrivent de faire des erreurs d'optimisation qu'ils arrangent avec le temps...
FrontLine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2008, 21h12   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Ta syntaxe MaClasse::$object me fait penser à une variable statique, est-ce bien le cas ? Dans l'affirmative, c'est aussi rapide que d'utiliser des références à l'objet.

Au passage, je te rappelle qu'en PHP5 tous les objets sont des références, il est donc inutile d'utiliser =& pour l'instanciation. D'ailleurs, si comme tout le monde le recommande tu mets error_reporting=E_ALL|E_STRICT dans php.ini, tu devrais avoir des alertes visuelles à ce sujet
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 11h14   #5
Membre régulier
 
Avatar de FrontLine
 
Nicolas
Webmaster
Inscription : janvier 2008
Messages : 172
Détails du profil
Informations personnelles :
Nom : Nicolas
Âge : 30

Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : janvier 2008
Messages : 172
Points : 84
Points : 84
Salut,

à bonne nouvelle !

Bien vue, c'est une variable statique et parfois avec $var =& ...j'ai un message de PHP :
Citation:
Strict standards: Only variables should be assigned by reference in /le fichier en question...php

En FR ça donne :
Des normes strictes: Seules les variables devraient être assignées par référence dans /lefichier en question...php
Parfois aucun message d'erreur si je l'utilise directement dans ma méthode &getInstance($class).

Donc dans ce cas là aussi c'est inutile ?
Code :
self::$objet[$class] =& new $class();
Je n'avais pas activé l'option E_STRICT, je viens de la rajouter merci.
FrontLine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 11h28   #6
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Je te recommande de lire la doc à ce sujet, c'est très bien expliqué
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 19h22   #7
Membre régulier
 
Avatar de FrontLine
 
Nicolas
Webmaster
Inscription : janvier 2008
Messages : 172
Détails du profil
Informations personnelles :
Nom : Nicolas
Âge : 30

Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : janvier 2008
Messages : 172
Points : 84
Points : 84
J'ai lu la doc toute l'après midi, du coté de new ça retourne automatiquement une référence depuis PHP5, ça le mérite d'être clair.

Ce post et la lecture de plusieurs chapitres sur les classes et références de la doc de PHP m'ont éclairés ma lanterne. Cependant certains aspects concernant les références sont encore un peu flou.

Désolé de faire le moulin à question, j'approche de la compréhension faut pas que je lâche lol

A quel moment est-il judicieux d'utiliser une référence ?

Ci-dessous ça ne sert à rien de dupliquer le contenu de MaClass::$var1 dans $var2, je pense donc qu'une référence plutôt qu'une copie est judicieux :
Code :
1
2
3
4
5
6
7
MaClass::$var1 = 'toutatime de contenu';
 
function plouf($texte_en_plus)
{
$var2 =& MaClass::$var1;
return $var2.$texte_en_plus;
}
Je me trompe ?

Il y a t-il d'autres contextes où les références sont avantageuse ?

Merci !
FrontLine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 20h43   #8
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Ce que j'essaie de te dire depuis le début, est que depuis PHP5 l'opérateur "=&" est inutile. Il te suffit de faire "=", cela revient exactement au même. Si tu veux un duplicata de l'objet, l'opérateur "=" n'est pas suffisant, tu dois utiliser un clone.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 20h55   #9
Membre régulier
 
Avatar de FrontLine
 
Nicolas
Webmaster
Inscription : janvier 2008
Messages : 172
Détails du profil
Informations personnelles :
Nom : Nicolas
Âge : 30

Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : janvier 2008
Messages : 172
Points : 84
Points : 84
D'accord merci, j'avais un doute ^^

Dernière question, pour les variables normale $var_string1 = $var_string2; l'opérateur "&=" est inutile en php5 aussi ou la prise en charge automatique des références est seulement valable pour les objets ?
FrontLine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 21h05   #10
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Si tu essaies, qu'est-ce que ça donne ?
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 21h44   #11
Membre régulier
 
Avatar de FrontLine
 
Nicolas
Webmaster
Inscription : janvier 2008
Messages : 172
Détails du profil
Informations personnelles :
Nom : Nicolas
Âge : 30

Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : janvier 2008
Messages : 172
Points : 84
Points : 84
Je vois pas où tu veux en venir
Code :
1
2
3
$var_string1 = 'string string la variable te parle';
	$var_string2 =& $var_string1;
	echo $var_string2;
Evidemment ça fonctionne aussi bien que sur un objet mais vue que c'est inutile pour un objet, est-ce utile pour une variable ?

$This->the_question(?)
FrontLine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 22h46   #12
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Pour voir la différence entre des copies et des références, il faut modifier l'une des variables et afficher l'autre

Code :
1
2
3
4
$var_string1 = 'string string la variable te parle';
$var_string2 =& $var_string1;
$var_string1 = 'bouh';
echo $var_string2;
Code :
1
2
3
4
$var_string1 = 'string string la variable te parle';
$var_string2 = $var_string1;
$var_string1 = 'bouh';
echo $var_string2;
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/05/2008, 11h09   #13
Membre régulier
 
Avatar de FrontLine
 
Nicolas
Webmaster
Inscription : janvier 2008
Messages : 172
Détails du profil
Informations personnelles :
Nom : Nicolas
Âge : 30

Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : janvier 2008
Messages : 172
Points : 84
Points : 84
Ok je voyais pas où tu voulais en venir, désolé et merci pour l'exemple mais tu n'as pas tout à fait compris ma dernière question.

Le résultat est le même ici :
Code :
1
2
3
4
$var_string1 = maClass::$var->string;
$var_string2 =& $var_string1;
$var_string1 = 'bouh';
echo $var_string2;
Code :
1
2
3
4
$var_string1 = maClass::$var->string;
$var_string2 = $var_string1;
$var_string1 = 'bouh';
echo $var_string2;
Un objet a exactement le même comportement et pourtant la référence est logiquement inutile en PHP5, donc je me demande si :
pour une variable "normale" comme dans ton exemple est-ce inutile aussi ?
Code :
1
2
3
4
$var_string1 = 'string string la variable normale te parle';
$var_string2 =& $var_string1;
$var_string1 = 'bouh';
echo $var_string2;
Merci pour ton aide constructive
FrontLine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/05/2008, 11h24   #14
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Salut,

Je crois que Yogui t'a tout à fait compris et c'est justement ce qu'il te demandait de tester.
Pour ma part, je pense que cela ne marche pas pour les chaînes. Pour des raisons techniques et ésotériques, les chaînes sont souvent des cas à part dans le monde des langages informatiques : ce sont souvent des objets passés par valeur.
C'est étonnant et c'est un cas à part, mais je sais que c'est le cas en .Net, je crois que c'est le cas aussi en Java, et je ne serais pas étonné que ce soit le cas en php.

Enfin, les nombres sont souvent passés par valeur.
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2008, 17h49   #15
Membre régulier
 
Avatar de FrontLine
 
Nicolas
Webmaster
Inscription : janvier 2008
Messages : 172
Détails du profil
Informations personnelles :
Nom : Nicolas
Âge : 30

Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : janvier 2008
Messages : 172
Points : 84
Points : 84
Désolé pour la réponse tardive ^^

Ok je vois, merci pour la réponse
FrontLine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2008, 18h12   #16
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
salut,

Je reviens sur ce qui se disait plus haut.

N'est ce pas le travail du compilateur que d'optimiser ce genre de code :
Code :
1
2
3
 
$a = MyClass::$maProp;
$a->unefonction();
Pour que se soit identique à :
Code :
1
2
 
MyClass::$maProp->unefonction();
et inversement ?

Et alors dans quelle mesure cela impacte la rapidité d'execution ?
A priori faiblement puisque PHP à un système de cache, non ?

Donc finalement, c'est se poser un faux problème que de se demander si telle ou telle syntaxe est la plus efficace ?

Merci de vos éclaircissements car désormais j'ai le doute...,
bye
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2008, 20h47   #17
Membre actif
 
Avatar de savageman86
 
Inscription : octobre 2006
Messages : 102
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2006
Messages : 102
Points : 180
Points : 180
Hum... La question de se demander si faire $a =& maClasse::$statique; puis d'utiliser $a n'est pas vraiment stupide dans le sens où la résolution de portée à été calculée une fois, puis stockée dans $a.

Alors dans les utilisations de $a, plus besoin de re-résoudre le chemin vers la variable, donc gain de temps ?
savageman86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 00h40   #18
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
@savageman86 : Oui, c'est bien cela, à la différence que l'opérateur =& n'a plus aucune utilité en PHP5, aucun avantage par rapport à l'opérateur =
@kaymak : Non, PHP n'a pas de cache activé par défaut, il faut que tu choisisses toi-même l'extension de cache que tu veux utiliser.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 04h11   #19
Membre éprouvé
 
Avatar de mon_nom_est_personne
 
Inscription : mai 2008
Messages : 450
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 450
Points : 451
Points : 451
il me semble qu'en matiere de performance et de scope la solution suivante est assez interessante.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
class global_scope
{
static $variable1;
...
 
static function func1()
{
//code de la fonction
self::$variable1 = resultat du traitement;
}
global_scope::func1();
echo global_scope::$variable1;
 
}
On peut ajouter
Code :
 $plus_simple_a_ecrire = global_scope::$variable1
mais on perd la portee globale de l'instanciation static.
mon_nom_est_personne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 08h17   #20
Membre actif
 
Avatar de savageman86
 
Inscription : octobre 2006
Messages : 102
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2006
Messages : 102
Points : 180
Points : 180
Vivement les espaces de noms en PHP 5.3 alors ! (même si ce n'est plus trop le sujet initial...).
savageman86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h59.


 
 
 
 
Partenaires

Hébergement Web