Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
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 16/04/2008, 16h31   #1
Membre régulier
 
Inscription : mai 2007
Messages : 144
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 144
Points : 78
Points : 78
Par défaut [POO] Réassigner objet, dans l'objet

Bonjour,

Petite question...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
class Divers {
 
  public function __construct() {
 
  }
 
  public function changement() {
    // Du traitement...
    // Puis...
    $this = new Divers();
  }
 
}
Problème, j'ai une erreur : "Fatal error: Cannot re-assign $this".

Bref, comment procéder pour réassigner mon objet dans une même méthode de celui ? Je sais que c'est tordu et paradoxal lol mais j'aurais besoin de faire ça...

Merci pour votre aide,
Evocatii
Evocatii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2008, 16h39   #2
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
Salut,

En toute logique, cela me semble impossible à faire au sein l'objet lui-même. ( et c'est d'ailleurs logique que tu obtiennes une erreur.)

Expose nous plutôt comment tu en es arrivé à ce choix car il doit y avoir un autre solution.

Dans le pire des cas, tu fais une fonction de RAZ au sein de la classe pour repartir avec un objet tout neuf
__________________
Pierre
1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
3. Un code rapide c'est bien, un code maintenable c'est mieux
...

Why was the font tag an orphan ? Because it didn't have a font-family.
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2008, 17h01   #3
Membre régulier
 
Inscription : mai 2007
Messages : 144
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 144
Points : 78
Points : 78
Hello ! Merci pour ta réponse !

Alors, il s'agit d'une classe permettant de gérer des fichiers.

Un fichier étant constitué de deux attributs :

- un nom
- un répertoire

et pouvant effectuer diverses actions.

Certains de ces actions créent de nouveaux attributs si besoin est (extension, chemin ou adresse).

Le problème se pose quand j'utilise la fonction "renommer" : l'attribut "nom" change et il me faut alors réinitialiser certains attributs de l'objet (extension, chemin et adresse) qui deviennent erronés. Je voulais le faire en recréant l'objet à partir de la classe mais ce n'est pas possible. Bien entendu, je pourrais simplement résoudre le problème avec des unset() spécifiques, mais je voulais savoir comment j'aurais pu faire autrement.

Je précise que cette classe est expérimentale, c'est juste pour le fun et essayer des trucs pour comprendre le fonctionnement des objets. Donc je voulais simplement savoir s'il était possible de réassigner un objet dans l'objet, et apparemment ce n'est pas le cas.

Code :
1
2
3
4
public function renommer($nouveauNom) {
    rename($this->creerChemin(), str_replace($this->nom, $nouveauNom, $this->creerChemin()));
    $this = new Fichier($this->repertoire, $nouveauNom);
  }
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
class Fichier {
 
  public $nom;
  public $repertoire;
 
  public function __construct($nom, $repertoire) {
    $this->nom = $nom;
    $this->repertoire = $repertoire;
  }
 
  public function creerAdresse() {
 
    if (!isset($this->adresse)) {
      $this->adresse = 'http://' . $_SERVER['SERVER_NAME'] . '/' . $this->repertoire . '/' . $this->nom;
    }
 
    return $this->adresse;
 
  }
 
  public function creerChemin() {
 
    if (!isset($this->chemin)) {
      $this->chemin = $_SERVER['DOCUMENT_ROOT'] . '/' . $this->repertoire . '/' . $this->nom;
    }
 
    return $this->chemin;
 
  }
 
  public function creerExtension() {
 
    if (!isset($this->extension)) {
      $this->extension = self::obtenirExtension($this->nom);  
    }
 
    return $this->extension;
 
  }
 
  public function renommer($nouveauNom) {
    rename($this->creerChemin(), str_replace($this->nom, $nouveauNom, $this->creerChemin()));
    $this = new Fichier($this->repertoire, $nouveauNom);
  }
 
  public function supprimer() {
    unlink($this->creerChemin());
    unset($this);
  }
 
  public static function obtenirExtension($nom) {
    preg_match('/.+\.(.+)$/', $nom, $resultats);
    return $resultats[1];
  }
 
  public static function verifierNom($nom) {
    if (preg_match('/.+\..+$/', $nom)) {
      return true;
    } else {
      return false;
    }
  }
 
}
Evocatii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2008, 19h35   #4
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
La réassignation pourrait se faire dans une fonction statique.
Tu peux étudier le design pattern du singleton qui utilise un principe similaire.
Ca, c'est pour la technique.

Pour la raison fonctionnelle, je trouve ton souhait un peu tordu. Mais ce n'est qu'un avis.
s.n.a.f.u 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 15h41.


 
 
 
 
Partenaires

Hébergement Web