Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2840 connectés 

 


 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  513  514  515  ..  1454  1455  1456  1457  1458  1459
Auteur Sujet :

blabla@web

n°1704531
mIRROR
Chevreuillobolchévik
Posté le 19-03-2008 à 12:12:37  profilanswer
 

Reprise du message précédent :

Dj YeLL a écrit :

C'est sans doute faux, mais c'est qqch dans le genre


 
c est a peu pres ca ...c est une methode de string donc tu traites ta chaine et tu fais un eval ...degueu quoi
faut pas le faire avec replace ...tu stockes tes reponses dans un tableau et ensuite tu traites proprement


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
mood
Publicité
Posté le 19-03-2008 à 12:12:37  profilanswer
 

n°1704765
theredled
● REC
Posté le 19-03-2008 à 16:13:53  profilanswer
 

[PHP5]

 

En Php 5, les assignations d'objet se font par référence.

 

Donc :
- je crée un tableau $tab contenant des objets de classe Achat
- je copie ce tableau dans une autre variable $tab2
- je modifie une valeur dans un objet dans $tab2
- cette valeur est donc aussi modifiée dans $tab

 

C'est de la merde [:petrus75]
Je fais comment après pour faire une vraie copie par valeur du tableau et de ses éléments ?? Je le crée à la main avec une boucle for ??§§ [:suicide]


Message édité par theredled le 19-03-2008 à 16:15:33

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704768
multani
Dépressionnisé
Posté le 19-03-2008 à 16:17:00  profilanswer
 

Fonction clone ?
Ceci dit, les tableaux n'utilisent pas l'assignation par référence : «You should be aware that array assignment always involves value copying» ( http://fr3.php.net/manual/en/language.types.array.php )

Message cité 1 fois
Message édité par multani le 19-03-2008 à 16:22:54
n°1704772
theredled
● REC
Posté le 19-03-2008 à 16:21:13  profilanswer
 

marche pas pour les arrays...


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704776
skeye
Posté le 19-03-2008 à 16:22:37  profilanswer
 

theredled a écrit :

marche pas pour les arrays...


http://fr3.php.net/manual/en/language.oop5.cloning.php


---------------
Can't buy what I want because it's free -
n°1704787
theredled
● REC
Posté le 19-03-2008 à 16:35:08  profilanswer
 

multani a écrit :

Fonction clone ?
Ceci dit, les tableaux n'utilisent pas l'assignation par référence : «You should be aware that array assignment always involves value copying» ( http://fr3.php.net/manual/en/language.types.array.php )


Les tableaux sont fait par copies, mais quand ils contiennent des références, elles restent des références.


Je vois pas de méthode pour les array :??: (edit : oué c'est plutot marqué que ça marche pas ok)

 

Sinon
***** BONUS *****
Ce truc casse l'encapsulation [:pingouino] [:pingouino] [:pingouino]

 
Code :
  1. class Panier {
  2.         private $liste_achats;
  3.         
  4.         function __construct() {
  5.             $this->liste_achats = array(            
  6.                     new Achat(1, 5),
  7.                     new Achat(2, 4),
  8.                     new Achat(3, 3),
  9.                     new Achat(4, 2)
  10.             );
  11.         }
  12.         
  13.         function getListe() {
  14.             return $this->liste_achats;
  15.         }
  16.     }
  17.  
  18.     class Achat {
  19.         public $type;
  20.         public $infos;
  21.         
  22.         function __construct($type, $infos) {
  23.             $this->type = $type;
  24.             $this->infos = $infos;
  25.         }
  26.     }
  27.     
  28.     $panier = new Panier();
  29.     
  30.     $tab2 = $panier->getListe();
  31.     
  32.     $tab2[0]->type = 12;
  33.         
  34.     print_r($panier->getListe());
  35.     print_r($tab2);


Citation :

Array
(
    [0] => Achat Object
        (
            [type] => 12
            [infos] => 5
        )

 

   [1] => Achat Object
        (
            [type] => 2
            [infos] => 4
        )
)
Array
(
    [0] => Achat Object
        (
            [type] => 12
            [infos] => 5
        )

 

   [1] => Achat Object
        (
            [type] => 2
            [infos] => 4
        )

 

)

Message cité 2 fois
Message édité par theredled le 19-03-2008 à 16:39:36

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704800
skeye
Posté le 19-03-2008 à 16:42:58  profilanswer
 

theredled a écrit :


Je vois pas de méthode pour les array :??: (edit : oué c'est plutot marqué que ça marche pas ok)
 
Sinon
***** BONUS *****


 
refais ta méthode getliste() pour retourner un nouveau tableau contenant des clones de tes objets et c'est gagné.:o


---------------
Can't buy what I want because it's free -
n°1704808
theredled
● REC
Posté le 19-03-2008 à 16:45:32  profilanswer
 

si ya rien d'autre oué ça va être ça...
 
(en fait c'est déja fait [:dawao])


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704810
theredled
● REC
Posté le 19-03-2008 à 16:46:34  profilanswer
 

mais le truc d'encapsulation ça fait peur là nan ? c'est pareil ds les autres languages ?

 

En fait les objets privés, quand ils contiennent des références, ne sont plus que des liens vers des objets publics...

Message cité 3 fois
Message édité par theredled le 19-03-2008 à 16:48:03

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704811
ratibus
Posté le 19-03-2008 à 16:46:40  profilanswer
 

theredled a écrit :


Je vois pas de méthode pour les array :??: (edit : oué c'est plutot marqué que ça marche pas ok)


Faut pas cloner le tableau mais les éléments du tableau.


---------------
Mon blog
mood
Publicité
Posté le 19-03-2008 à 16:46:40  profilanswer
 

n°1704814
theredled
● REC
Posté le 19-03-2008 à 16:48:48  profilanswer
 

ratibus a écrit :


Faut pas cloner le tableau mais les éléments du tableau.


c'est bien que je dis depuis le début, une boucle :o


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704822
skeye
Posté le 19-03-2008 à 16:52:26  profilanswer
 

theredled a écrit :

mais le truc d'encapsulation ça fait peur là nan ? c'est pareil ds les autres languages ?
 
En fait les objets privés, quand ils contiennent des références, ne sont plus que des liens vers des objets publics...


 
j'ai pas compris où était le problème...tout ce que tu touches est public...:??:


---------------
Can't buy what I want because it's free -
n°1704829
theredled
● REC
Posté le 19-03-2008 à 16:54:24  profilanswer
 

skeye a écrit :

 

j'ai pas compris où était le problème...tout ce que tu touches est public...:??:


Non, pas Panier::$liste_achats. Et pourtant je le modifie au final.
(Et si j'avais des membres privés + setters dans Achat ce serait pareil.)

Message cité 1 fois
Message édité par theredled le 19-03-2008 à 16:56:18

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704833
skeye
Posté le 19-03-2008 à 16:59:16  profilanswer
 

theredled a écrit :


Non, pas Panier::$liste_achats. Et pourtant je le modifie au final.


C'est une blague? [:autobot]
Tu fais une fonction qui retourne un tableau de références, et tu t'étonnes de pouvoir modifier les objets sur lesquelles pointent ces références en-dehors de ton objet?[:roane]


Message édité par skeye le 19-03-2008 à 16:59:44

---------------
Can't buy what I want because it's free -
n°1704836
skeye
Posté le 19-03-2008 à 17:03:03  profilanswer
 

(ce que tu modifies ce n'est pas Panier::$liste_achats, qui est un tableau de références, mais l'objet vers lequel pointent ces références. Qui ne changent pas, elles)


---------------
Can't buy what I want because it's free -
n°1704846
theredled
● REC
Posté le 19-03-2008 à 17:14:51  profilanswer
 

skeye a écrit :

(ce que tu modifies ce n'est pas Panier::$liste_achats, qui est un tableau de références, mais l'objet vers lequel pointent ces références. Qui ne changent pas, elles)


tu veux dire qu'

theredled a écrit :

En fait les objets privés, quand ils contiennent des références, ne sont plus que des liens vers des objets publics...


?

 

Ca m'étonne absolument pas, je trouve juste ça un peu pourri. Imagine que j'ai dans mon tableau des objets Achat qui contiennent d'autres objets jetables, faut que je fasse une fonction récursive avec analyse de types pour faire une shallow copie (comme y disent) ?


Message édité par theredled le 19-03-2008 à 17:18:03

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704849
skeye
Posté le 19-03-2008 à 17:25:24  profilanswer
 

Non, je ne veux pas dire ça du tout.


---------------
Can't buy what I want because it's free -
n°1704860
masklinn
í dag viðrar vel til loftárása
Posté le 19-03-2008 à 17:32:16  profilanswer
 

theredled a écrit :

mais le truc d'encapsulation ça fait peur là nan ? c'est pareil ds les autres languages ?


Non, pas en erlang.


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1704876
theredled
● REC
Posté le 19-03-2008 à 18:03:11  profilanswer
 

skeye a écrit :

Non, je ne veux pas dire ça du tout.


Sachant qu'un objet en PHP n'est forcément qu'une référence, référence à un contenu accessible de n'importe où, dans l'absolu. C'est ça que j'appelle "public", abus de language ptet jmen branle :o

 

Tu vas me dire que même un membre private non objet peut aussi être accessible de partout par référence. Menfin bon, faut le vouloir.

 

Le truc traître c'est qu'en PHP5 que je sache t'as même pas le choix, un objet c'est toujours une référence, résultat, obligé de foutre des clone partout dès que tu traites avec des objets.

Message cité 3 fois
Message édité par theredled le 19-03-2008 à 18:05:48

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704881
masklinn
í dag viðrar vel til loftárása
Posté le 19-03-2008 à 18:05:57  profilanswer
 

theredled a écrit :


Sachant qu'un objet en PHP n'est forcément qu'une référence, référence à un contenu accessible de n'importe où, dans l'absolu. C'est ça que j'appelle "public", abus de language ptet jmen branle :o
 
Tu vas me dire que même un membre private non objet peut être accessible de partout par référence. Menfin bon, faut le vouloir.
 
Le truc traître c'est qu'en PHP5 que je sache t'as même pas le choix, un objet c'est toujours une référence, résultat, obligé de foutre des clone partout dès que tu traites avec des objets.


Je comprend même pas ce que tu racontes, ça n'a strictement aucun sens [:pingouino]


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1704882
theredled
● REC
Posté le 19-03-2008 à 18:07:37  profilanswer
 

masklinn a écrit :


Je comprend même pas ce que tu racontes, ça n'a strictement aucun sens [:pingouino]


Après 8 remarques du genre que tu me fais, ça te surprend encore [:pingouino dei]

 

J'ai perdu espoir de me faire comprendre de toi :(


Message édité par theredled le 19-03-2008 à 18:09:13

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704890
multani
Dépressionnisé
Posté le 19-03-2008 à 18:23:29  profilanswer
 

theredled a écrit :

Le truc traître c'est qu'en PHP5 que je sache t'as même pas le choix, un objet c'est toujours une référence.


Comme dans la plupart des langages « orientés objets » [:spamafote]


Message édité par multani le 19-03-2008 à 18:23:49
n°1704899
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 19-03-2008 à 18:36:18  profilanswer
 

theredled a écrit :


Sachant qu'un objet en PHP n'est forcément qu'une référence, référence à un contenu accessible de n'importe où, dans l'absolu. C'est ça que j'appelle "public", abus de language ptet jmen branle :o
 
Tu vas me dire que même un membre private non objet peut aussi être accessible de partout par référence. Menfin bon, faut le vouloir.
 
Le truc traître c'est qu'en PHP5 que je sache t'as même pas le choix, un objet c'est toujours une référence, résultat, obligé de foutre des clone partout dès que tu traites avec des objets.


Putain mais [:pingouino]²²²
L'intérêt de jouer avec des références, c'est justement de pas avoir des copies implicites de tes objets qui se baladent partout, notamment lors du passage de méthode en méthode. Si t'as réellement besoin de jouer avec des copies, alors ouais y a clone() mais perso j'en ai jamais fait dans mon code, pas besoin. Sinon après tu vas chialer que PHP bouffe trop de mémoire ; évidemment, stu copies 15 fois un objet de 200 Ko et qu'y a 10 utilisateurs...


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°1704904
theredled
● REC
Posté le 19-03-2008 à 18:42:42  profilanswer
 

Taiche a écrit :


Putain mais [:pingouino]²²²
L'intérêt de jouer avec des références, c'est justement de pas avoir des copies implicites de tes objets qui se baladent partout, notamment lors du passage de méthode en méthode. Si t'as réellement besoin de jouer avec des copies, alors ouais y a clone() mais perso j'en ai jamais fait dans mon code, pas besoin. Sinon après tu vas chialer que PHP bouffe trop de mémoire ; évidemment, stu copies 15 fois un objet de 200 Ko et qu'y a 10 utilisateurs...


Chui d'accord :o (et c'est aussi très pratique quand tu passes des objets en arguments par ex)

 

Faut juste que j'intègre bien qu'un objet, c'est pas comme une variable normale :o

Message cité 1 fois
Message édité par theredled le 19-03-2008 à 18:43:38

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704911
_Raynor_
Posté le 19-03-2008 à 19:08:22  profilanswer
 

Bah un objet n'a rien à voir avec une variable.

 

Mettons que tu as des amis (amiA, amiB, etc.).
Si tu stocke leur nom sous forme de chaîne dans une variable de ton script ($amiA_nom, $amiB_nom, etc.) c'est comme s'ils étaient chez toi, dans ton appart : ils prennent de la place.

 

Avec des amis en objet (classe Ami ne contenant qu'une seule variable -publique ou privée, peut importe- $nom) on peut dire que c'est comme s'ils étaient chez eux et que, chez toi, tu n'avais que leur coordonnées (tel/mail/IM/etc.) ce qui :
- occupe moins de place qu'un être humain
- peut être "en double" (teléphone fixe + mobile + e-mail par exemple) vers le même Ami.

 

Quand tu fais $amiX = new Ami('Mr X'); tu créer un ami (un objet ami qui, pour ton script, représente un ami) nommé 'Mr. X' mais tu ne le ramènes pas chez toi (dans ton script), il te file ses coordonnées (adresse mémoire) que tu stocke dans une variable PHP (comme tu la noterais sur un Post-it!).

 

Quand tu fais $amiY = 'Mr. Y'; tu créer un ami (une chaîne de texte qui, pour ton script, représente un ami) que tu ramènes chez toi. Tu conviendras qu'il occupe plus de place qu'un simple bout de papier :)

 

Voilà une (tentative d') explication.

Message cité 1 fois
Message édité par _Raynor_ le 19-03-2008 à 19:09:50
n°1704913
skeye
Posté le 19-03-2008 à 19:15:35  profilanswer
 

_Raynor_ a écrit :

Bah un objet n'a rien à voir avec une variable.
 
Mettons que tu as des amis (amiA, amiB, etc.).
Si tu stocke leur nom sous forme de chaîne dans une variable de ton script ($amiA_nom, $amiB_nom, etc.) c'est comme s'ils étaient chez toi, dans ton appart : ils prennent de la place.
 
Avec des amis en objet (classe Ami ne contenant qu'une seule variable -publique ou privée, peut importe- $nom) on peut dire que c'est comme s'ils étaient chez eux et que, chez toi, tu n'avais que leur coordonnées (tel/mail/IM/etc.) ce qui :
- occupe moins de place qu'un être humain
- peut être "en double" (teléphone fixe + mobile + e-mail par exemple) vers le même Ami.
 
Quand tu fais $amiX = new Ami('Mr X'); tu créer un ami (un objet ami qui, pour ton script, représente un ami) nommé 'Mr. X' mais tu ne le ramènes pas chez toi (dans ton script), il te file ses coordonnées (adresse mémoire) que tu stocke dans une variable PHP (comme tu la noterais sur un Post-it!).
 
Quand tu fais $amiY = 'Mr. Y'; tu créer un ami (une chaîne de texte qui, pour ton script, représente un ami) que tu ramènes chez toi. Tu conviendras qu'il occupe plus de place qu'un simple bout de papier :)
 
Voilà une (tentative d') explication.


 
...et surtout quand ton ami se coupe les cheveux ça change pas son numéro de téléphone.[:petrus75]


---------------
Can't buy what I want because it's free -
n°1704926
_Raynor_
Posté le 19-03-2008 à 19:37:04  profilanswer
 

Ni même s'il change son nom :)

n°1704929
skeye
Posté le 19-03-2008 à 19:39:38  profilanswer
 

_Raynor_ a écrit :

Ni même s'il change son nom :)


c'est plus chiant pour le retrouver dans ton répertoire par contre.[:chrisbk]


Message édité par skeye le 19-03-2008 à 19:39:45

---------------
Can't buy what I want because it's free -
n°1704941
masklinn
í dag viðrar vel til loftárása
Posté le 19-03-2008 à 20:03:01  profilanswer
 

theredled a écrit :

Faut juste que j'intègre bien qu'un objet, c'est pas comme une variable normale :o


Ya pas de variable normale.
 
Et accessoirement, même avec ce que tu considères comme une "variable normale" (un type natif et non défini par l'utilisateur), si, c'est identique (à bien peu de chose près, mais sûrement pas ça).


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1704957
theredled
● REC
Posté le 19-03-2008 à 20:55:07  profilanswer
 

masklinn a écrit :


Ya pas de variable normale.
 
Et accessoirement, même avec ce que tu considères comme une "variable normale" (un type natif et non défini par l'utilisateur), si, c'est identique (à bien peu de chose près, mais sûrement pas ça).


Ben non, "$foo = $bar", $bar étant une chaine de caractères, ça copie le contenu et pas juste la référence [:pingouino]
 
D'ailleurs du coup, dans les languages comme JS ou Java ou tout est objet (je me plante pas ?), quelle règle fait que tel objet est copié par référence, et tel autre par contenu ?
 
Il me semble que

Code :
  1. bar = new String('yeah');
  2. foo = bar;
  3. bar = 'no';
  4. document.write(foo);


m'afficherait 'yeah', nan ?


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704968
masklinn
í dag viðrar vel til loftárása
Posté le 19-03-2008 à 21:15:39  profilanswer
 

theredled a écrit :


Ben non, "$foo = $bar", $bar étant une chaine de caractères, ça copie le contenu et pas juste la référence [:pingouino]


En PHP j'en doute très fort (mais je connais pas la sémantique exacte du langage), dans tous les autres langages de haut niveau que j'ai pu apprendre (Java, C#, Python, Ruby, Erlang, Haskell, ...) sûrement pas.

theredled a écrit :

D'ailleurs du coup, dans les languages comme JS ou Java ou tout est objet (je me plante pas ?), quelle règle fait que tel objet est copié par référence, et tel autre par contenu ?


En java tout n'est pas objet, mais dans tous les cas il n'y a jamais de copie implicite, tout est toujours passé par référence.

theredled a écrit :


Il me semble que

Code :
  1. bar = new String('yeah');
  2. foo = bar;
  3. bar = 'no';
  4. document.write(foo);

m'afficherait 'yeah', nan ?


oui, et alors? (et le new String ne sert à rien)


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1704969
theredled
● REC
Posté le 19-03-2008 à 21:20:07  profilanswer
 

masklinn a écrit :


En PHP j'en doute très fort (mais je connais pas la sémantique exacte du langage), dans tous les autres langages de haut niveau que j'ai pu apprendre (Java, C#, Python, Ruby, Erlang, Haskell, ...) sûrement pas.

masklinn a écrit :


En java tout n'est pas objet, mais dans tous les cas il n'y a jamais de copie implicite, tout est toujours passé par référence.

masklinn a écrit :


oui, et alors? (et le new String ne sert à rien)


Genre [:pingouino]

 

Toi je sens que tu caches une connaissance (sur le sens profond des concepts de "référence" et "contenu" par ex), que tu sais que je n'ai pas, et tu fais mine de pas comprendre.

Message cité 1 fois
Message édité par theredled le 19-03-2008 à 21:23:08

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704972
_Raynor_
Posté le 19-03-2008 à 21:23:56  profilanswer
 

theredled a écrit :

Code :
  1. bar = new String('yeah');
  2. foo = bar;
  3. bar = 'no';
  4. document.write(foo);


m'afficherait 'yeah', nan ?

Oui.
En fait new String("une_chaine" ) <=> "une_chaine" (du moins en Java)
 
De plus, il me semble que dans une JVM donnée : chaque chaîne de texte n'est présente qu'une seule fois en mémoire. non ?
(J'en suis pas totalement certain mais je crois me souvenir d'un truc de ce style)

n°1704973
masklinn
í dag viðrar vel til loftárása
Posté le 19-03-2008 à 21:28:11  profilanswer
 

theredled a écrit :


Genre [:pingouino]
 
Toi je sens que tu caches une connaissance, que tu sais que je n'ai pas, et tu fais mine de pas comprendre.


 :D  
 
En fait, depuis le début tu mélanges 2 choses: la notion de référence sur un objet, et la notion de mutabilité d'un objet.
 
Tu as l'impression que les strings sont balladés par valeur ou copiés parce que dans nombre de langages populaires les chaînes de caractère sont immutables: on ne peut pas modifier une chaîne en place. C'est vrai en PHP, en Java, en Python, ... donc on se retrouve avec ce genre de cas:

Code :
  1. >>> a = "foo"
  2. >>> b = a
  3. >>> a += "bar"
  4. >>> print a
  5. foobar
  6. >>> print b
  7. foo
  8. >>>


 
mais pas en Ruby par exemple, qui permet de faire ça:

Code :
  1. >> a = "foo"
  2. => "foo"
  3. >> b = a
  4. => "foo"
  5. >> a << "bar"
  6. => "foobar"
  7. >> p a
  8. "foobar"
  9. => nil
  10. >> p b
  11. "foobar"
  12. => nil
  13. >>


La différence, c'est simplement qu'en Ruby, String est un type mutable alors qu'en Python c'est un type immutable.
 
Et c'est pareil avec n'importe quel objet: si tu joues avec des Array PHP, sauf erreur de ma part tu vas avoir l'impression qu'ils sont passés par référence (là encore PHP peut avoir une sémantique à la con, mais dans les langages que j'utilise c'est comme ça que ça marche) alors que c'est un objet natif du langage. Et quand tu crées tes objets, il est possible de les créer mutables (donc si tu as une référence sur un objet tu peux potentiellement modifier son contenu) ou immutable. Après, la complexité augmente quand on commence à se poser des question sur la mutabilité des membres d'un objet immutable, mais ça ne change rien au coeur du truc: tout est passé par référence, c'est simplement que certains objets sont mutables et d'autres pas.
 
Note finale: un peu plus tôt j'ai mentionné erlang en disant que ton problème n'existe pas dans ce langage. C'est parce que tout est immutable dedans (ou presque).


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1704976
theredled
● REC
Posté le 19-03-2008 à 21:29:22  profilanswer
 

donc foo est lié à bar par référence, mais il est tout à fait normal qu'en changeant bar ça ne change pas foo [:opus dei]

 

edit : attendez je lis, c'est ce que j'attendais :o

Message cité 1 fois
Message édité par theredled le 19-03-2008 à 21:31:04

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704978
masklinn
í dag viðrar vel til loftárása
Posté le 19-03-2008 à 21:32:30  profilanswer
 

_Raynor_ a écrit :

Oui.
En fait new String("une_chaine" ) <=> "une_chaine" (du moins en Java)
 
De plus, il me semble que dans une JVM donnée : chaque chaîne de texte n'est présente qu'une seule fois en mémoire. non ?
(J'en suis pas totalement certain mais je crois me souvenir d'un truc de ce style)


c'est un peu plus compliqué que ça
C'est pas fait sur tous les strings, sauf si l'utilisateur le demande en appelant String#intern. D'après Kadreg, c'est fait en interne par la JVM sur certaines tâches et sur les strings présente sous forme littérale dans le source (pas les chaînes construites dynamiquement ou venant de l'extérieur).
 
PS, pour theredled: http://en.wikipedia.org/wiki/Immutable_object


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1704979
masklinn
í dag viðrar vel til loftárása
Posté le 19-03-2008 à 21:35:11  profilanswer
 

theredled a écrit :

donc foo est lié à bar par référence, mais il est tout à fait normal qu'en changeant bar ça ne change pas foo [:opus dei]


C'est surtout que tu ne peux pas changer le contenu de bar (ou celui de foo d'ailleurs).
 
Tout ce que tu peux faire, c'est faire pointer le nom bar (qui n'est qu'un label, un pointeur sur un objet qui vit en mémoire) sur un autre objet. Donc ce sur quoi bar pointe a changé, mais ce sur quoi foo pointe... c'est toujours l'ancien objet.


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1704993
theredled
● REC
Posté le 19-03-2008 à 22:08:16  profilanswer
 


La grande spécialité de monsieur, faut le mériter le pavé :o

masklinn a écrit :

En fait, depuis le début tu mélanges 2 choses: la notion de référence sur un objet, et la notion de mutabilité d'un objet.
Tu as l'impression que les strings sont balladés par valeur ou copiés parce que dans nombre de langages populaires les chaînes de caractère sont immutables: on ne peut pas modifier une chaîne en place. C'est vrai en PHP, en Java, en Python, ... donc on se retrouve avec ce genre de cas:

Code :
  1. >>> a = "foo"
  2. >>> b = a
  3. >>> a += "bar"
  4. >>> print a
  5. foobar
  6. >>> print b
  7. foo
  8. >>>
 

mais pas en Ruby par exemple, qui permet de faire ça:

Code :
  1. >> a = "foo"
  2. => "foo"
  3. >> b = a
  4. => "foo"
  5. >> a << "bar"
  6. => "foobar"
  7. >> p a
  8. "foobar"
  9. => nil
  10. >> p b
  11. "foobar"
  12. => nil
  13. >>


La différence, c'est simplement qu'en Ruby, String est un type mutable alors qu'en Python c'est un type immutable.


Aaaaah Okay :o

masklinn a écrit :


C'est surtout que tu ne peux pas changer le contenu de bar (ou celui de foo d'ailleurs).

 

Tout ce que tu peux faire, c'est faire pointer le nom bar (qui n'est qu'un label, un pointeur sur un objet qui vit en mémoire) sur un autre objet. Donc ce sur quoi bar pointe a changé, mais ce sur quoi foo pointe... c'est toujours l'ancien objet.

 

Ca c'est de la machinerie interne, au niveau du comportement, tout se passe comme si tu changais vraiment le contenu, comme si tu copiais le contenu, etc...

 
masklinn a écrit :

Et c'est pareil avec n'importe quel objet: si tu joues avec des Array PHP, sauf erreur de ma part tu vas avoir l'impression qu'ils sont passés par référence (là encore PHP peut avoir une sémantique à la con, mais dans les langages que j'utilise c'est comme ça que ça marche) alors que c'est un objet natif du langage. Et quand tu crées tes objets, il est possible de les créer mutables (donc si tu as une référence sur un objet tu peux potentiellement modifier son contenu) ou immutable. Après, la complexité augmente quand on commence à se poser des question sur la mutabilité des membres d'un objet immutable, mais ça ne change rien au coeur du truc: tout est passé par référence, c'est simplement que certains objets sont mutables et d'autres pas.


En gras : non :D
- un array se comporte comme un string.
- je ne sais pas comment créer un objet immutable, et de ce que j'ai lu c'est pas possible.

 

Donc je maintient : en PHP (5), un objet n'est pas (ne se comporte pas comme) une variable comme les autres :o

 


Sinon, pour la terminologie référence/contenu, je pense que le truc c'est aussi que toi tu résonnes à bas niveau, au niveau du fonctionnement interne du language. Mais parler de "copie par contenu" ou "copie par référence", à haut niveau ça me semble pas incorrect (c'est ce que fait la doc de PHP du moins), y compris quand c'est inexact d'un point de vue bas niveau . Même si c'est intéressant de savoir comment ça marche à l'intérieur, et que ça aide à comprendre le pourquoi de certains comments. Ou alors il reste des trucs que j'ai pas capté.

 

Mon impression c'est juste que les concepts de références et de contenu sont pas les mêmes suivant le niveau où on se place.

 

Du coup toi tu préfères parler de mutable/pas mutable pour le haut niveau, plutot que référence/contenu.

Message cité 1 fois
Message édité par theredled le 19-03-2008 à 22:08:50

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704995
Jubijub
Parce que je le VD bien
Posté le 19-03-2008 à 22:12:46  profilanswer
 

edit : ben la notion de mutabilité ça a une importance...

 


Code :
  1. public static void main(String[] args) {
  2.     Test bidon = new Test();
  3.     Pouet one = bidon.new Pouet("one" );
  4.     Pouet two = bidon.new Pouet("two" );
  5.     Pouet three = one;
  6.     one.name = "yeah";
  7.     System.out.println(three.name);
  8.     System.out.println(one == three);
  9. }
  10. private class Pouet {
  11.     public String name;
  12.     public Pouet(String name) {
  13.         this.name = name;
  14.     }
  15. }


Output :
yeah
True

 


Code :
  1. public static void main(String[] args) {
  2.         String one = "toto";
  3.         String two = "titi";
  4.         String three = one;
  5.         one = "It's the end of the world as we know it";
  6.         System.out.println(three);
  7.         System.out.println(one == three);
  8.     }


Output :
toto
False

 

si j'ai bien tout compris (ça va me permettre de la vérifier, si j'ai faux je vais me faire traiter de noob :D) :

  • dans le premier cas le three = one passe à three la référence sur laquelle pointe one. Le one = xxx altère l'objet sur lequel pointe one. Three pointant sur le même objet, il répercute cette modif car one et three pointent sur le même objet
  • dans le second cas, le three = one passe à three la référence sur laquelle pointe one. Par contre le one = xxx crée une nouvelle référence vers une autre String, parce que la String initiale est immutable. De fait, three et one ne pointe plus vers la même chose.

Message cité 2 fois
Message édité par Jubijub le 19-03-2008 à 22:25:01

---------------
Jubi Photos : Flickr - 500px
n°1704997
theredled
● REC
Posté le 19-03-2008 à 22:14:54  profilanswer
 

Jubijub a écrit :

alors que

Code :
  1. public static void main(String[] args) {
  2.  Test bidon = new Test();
  3.  Pouet one = bidon.new Pouet("one" );
  4.  Pouet two = bidon.new Pouet("two" );
  5.  Pouet three = one;
  6.  one.name = "yeah";
  7.  System.out.println(three.name);
  8. }
  9. private class Pouet {
  10.  public String name;
  11.  public Pouet(String name) {
  12.   this.name = name;
  13.  }
  14. }



alors que.


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1704999
Jubijub
Parce que je le VD bien
Posté le 19-03-2008 à 22:25:21  profilanswer
 

edited depuis :o


---------------
Jubi Photos : Flickr - 500px
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  513  514  515  ..  1454  1455  1456  1457  1458  1459

Aller à :
Ajouter une réponse
 

Sujets relatifs
blabla 3blabla 2
PUTAIN HARKO TU AS FERM2 BLABLA ![Beaucoup de blabla pour rien : post à effacer] Compiler .bat
variable1="blabla + variable2 +blala : c'est possible ??[PHP & regex] "blabla blabla file.ext?point=444 blabla" Recupérer 444
mail("celine@hotmail.com"," sujet","blabla"); pose une err ! Help[MySQL] WHERE 'blabla' compris dans le champ truc
[blabla@olympe] Le topic du modo, dieu de la fibre et du monde[PHP / BlaBla - limite]
Plus de sujets relatifs à : blabla@web


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)