IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Passage d’objet en références


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    Points : 151
    Points
    151
    Par défaut [POO] Passage d’objet en références
    Passage d’objet en références

    Bon le problème et classique :
    J’ais un objet complexe (il contient d’autres objets).
    Je récupère un de ses sous-objet.
    Je le modifit.

    Mais comme j’ais récupéré une copie.. le sous objet de mon objet n’est pas modifier. !!


    Je vais donc vous présenter :
    mon fichier class : Dossier.php
    son utilisation. ex.php
    un morceau de l’arborescence.

    Mais avent je doit vous parler de mes objectifs.

    Je créer un site php dans le quel les visiteurs peuvent accéder à des ressources qui sont placée dans une arborescence physique sur le serveur.
    Pour accéder à ces ressources j’affiche donc une arborescence ( ex : explorateur windows ).

    Cette arborescence est un objet de type Dossier que j’appel $arbo.
    Dossier contient une liste de dossier : $liste_dossier qui contient tout les fils du dossier (Et se sont des Dossier).

    La racine de l’arborescence visible par l’internaute s’appelle : Mon_compte. Qui est un dossier placer dans « ./USERS/$login » (ici $login = toto).

    Le problème vient de mes fonctions : go($chemin) ou get_dossier($nom) et de leurs valeurs de retour.

    _______________________________________________________
    Dossier.php
    _______________________________________________________

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    <?php
    class Dossier
    {
    	var $maison;
    	var $nom;
    	var $chemin;
    	var $open = false;
    	var $select = false;
    	var $liste_dossiers = array();
    	var $liste_fichiers = array();
     
    	/**
    	Constructeur
    	@PARAM $chemin_absolut
    	@PARAM $maison
    	@RETURN : Un objet de la classe Dossier
    	*/
    	function Dossier($chemin_absolut, $maison)//constructeur
    	{
    		echo "<br/>Dossier(".$chemin_absolut.")";
    		$this->maison = $maison;
    		$this->chemin = $chemin_absolut;
    		$tab = explode("/", $chemin_absolut);
    		$nb = (count($tab));
    		$this -> nom = $tab[($nb-1)];
    		return $this;
    	}
     
    	/**
    	$ret = Dossier demander.
    	$chemin = chemin absolut de la position de la cible dans l'arbre
    	$profondeur = profondeur actuelle dans l'arbo
    	*/
    	function &go($chemin, $profondeur = 0)
    	{
    		echo "<br/>go(".$chemin.", ".$profondeur.")";
    		$tab = explode("/", $chemin);
    		$nb = (count($tab));
    		if($nb-1 == $profondeur)
    		{
    			//on est arrivé.
    			//mais on vérifit quand même
    			if ($tab[$profondeur] !== $this->nom)
    			{
    				echo "<br/>erreur : nous devrion étre dans ".$tab[$profondeur]." et nous somme dans ".$this->nom;
    			}
    			return $this;
    		}
    		else
    		{
    			//on est dans : 
    			$actu = $tab[$profondeur];
    			//et on le vérifit (' ,)
    			if ($actu !==$this->nom)
    			{
    				echo "<br/>erreur : nous devrion étre dans ".$actu." et nous somme dans ".$this->nom;
    			}
    			//on poursuit notre chemin 
    			 $profondeur++;
    			//dans
    			$nom_dossier_suivant = $tab[$profondeur];
    			$dossier_suivant =& $this->get_dossier($nom_dossier_suivant);
    			//on se place dans le dommaine d'exécution du répertoire suivant
    			return $dossier_suivant -> go($chemin, $profondeur);
    		}
    	}
     
    	/**
    	retourne le dossier $nom de la liste des dossiers
    	*/
    	function &get_dossier($nom)
    	{
    		echo "<br/>get_dossier(".$nom.")";
    		for($i = 0; $i<count($this->liste_dossiers) ; $i++)
    		{			
    			$d = $this->liste_dossiers[$i];
    			$nom_d = $d->nom;
    			if($nom_d == $nom)
    			{
    				return $d;
    			}
    		}
    		echo "<br/>erreur le fichier ".$nom." n'as pas été trouvé";
    		return false;
    	}
     
    	function ouvrir()
    	{
    		$this->open = true;
    		echo "<br/>ouvrir() &nbsp;&nbsp;&nbsp; this = ".$this->nom." ouver = ".$this->open;
    		$this -> explore_dossier();
    	}
     
    	function ferme()
    	{
    		$this->open = false;
    	}
     
    	/**
    	La fonction explore dans le context du dossier courant dans l'arborescence le contenu physique du dossier sur le disque.
    	Tout les dossiers trouvé (sauf '' , '.' , '..') sont ajouté à la liste des dossier : $liste_dossiers.
    	WARNNING C'est fonction fonctionne différament sous Windows et UNIX.
    	la fonction utilise les attibuts de sa classe : $this->maison, $this->chemin
    	WARNNING la définition initiale de $this->maison dépend de l'implémentation du site sur le serveur.
    	*/
    	function explore_dossier() 
    	{
    		$ici_unix = $this->maison."/".$this->chemin;
    		$ici_windows = str_replace('/', '\\', $ici_unix) ;
    		//$ici_windows = ".\\USERS\\toto";
    		echo "<br/>explore_dossier() &nbsp;&nbsp;&nbsp; ici_unix = ".$ici_unix." &nbsp;&nbsp;&nbsp; ici_windows = ".$ici_windows ;
    		if ($handle = opendir($ici_windows))
    		{
    			//echo "<br/>";print_r ($this->liste_dossiers);echo "<br/>";
    			while (false !== ($obj = readdir($handle)))
    			{
    				if($obj != '..' && $obj !='.' && $obj !='')
    				{ 
    					if (is_dir($obj) || 1)// WARNNING WINDOWS TOUCHHH
    					{
    						$this->liste_dossiers[] = new Dossier($this->chemin."/".$obj, $this->maison);
    					}
    				}
    			}
    			closedir($handle);
    			//echo "<br/>";print_r ($this->liste_dossiers);echo "<br/>";
    		}
    		clearstatcache();
    	}
     
    	function toHTML()	{		}
    	function afficher_fichiers()	{		}
     
    	function toString($profondeur = 0)
    	{
    		echo "<br/> toString(".$profondeur.") this = ".$this->nom." ";
    		$ret ="<br/>";
    		for($i=0 ; $i<$profondeur ; $i++){$ret .=" _ ";}
    		$ret .= "nom = ".$this->nom." &nbsp;&nbsp;&nbsp; |  &nbsp;&nbsp;&nbsp; chemin = ".$this->chemin." &nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp; ouver = ".$this->open." &nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp; selectionne = ".$this->select."" ;
    		$nb = count($this->liste_dossiers);
    		echo " nb = ".$nb."  ";
    		for ( $i=0 ; $i<$nb ; $i++ )
    		{
    			$next_step = $this->liste_dossiers[$i];
    			$ret .= $next_step->toString($profondeur+1);
    		}
    		return $ret;
     	}
    }//fin de la class dossier.
    ?>
    _______________________________________________________
    ex.php
    _______________________________________________________

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $racine = "Mon_Album";
    $maison = "./USERS/toto";
    echo "<br/> maison = ".$racine;
    echo "<br/> On creer l'arbo";
    $arbo = new Dossier($racine, $maison);
    $arbo -> ouvrir();
    echo "<br/>";
    echo ($st = $arbo->toString());
    echo "<br/>";
    echo "<br/>";
    echo "<br/>on ouvre un premier dossier";
    $dossier =& $arbo->go("Mon_Album/photo");
    $dossier -> ouvrir();
    echo ($st = $arbo->toString());
    _______________________________________________________
    arborescence
    _______________________________________________________


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    site
    +USERS
    	+toto
    		+Mon_Album
    			-image
    			+photo
    				-féte
    				-taf
    +Objet
    	Dossier.php

    _______________________________________________________
    ce que ça donne chez moi ...
    _______________________________________________________

    maison = Mon_Album
    On creer l'arbo
    Dossier(Mon_Album)
    ouvrir() this = Mon_Album ouver = 1
    explore_dossier() ici_unix = ./USERS/toto/Mon_Album ici_windows = .\USERS\toto\Mon_Album
    Dossier(Mon_Album/images)
    Dossier(Mon_Album/photo)

    toString(0) this = Mon_Album nb = 2
    toString(1) this = images nb = 0
    toString(1) this = photo nb = 0
    nom = Mon_Album | chemin = Mon_Album | ouver = 1 | selectionne =
    _ nom = images | chemin = Mon_Album/images | ouver = | selectionne =
    _ nom = photo | chemin = Mon_Album/photo | ouver = | selectionne =

    on ouvre un premier dossier
    go(Mon_Album/photo, 0)
    get_dossier(photo)
    go(Mon_Album/photo, 1)
    ouvrir() this = photo ouver = 1
    explore_dossier() ici_unix = ./USERS/toto/Mon_Album/photo ici_windows = .\USERS\toto\Mon_Album\photo
    Dossier(Mon_Album/photo/fétes)
    Dossier(Mon_Album/photo/taf)
    Dossier(Mon_Album/photo/vacances)
    toString(0) this = Mon_Album nb = 2
    toString(1) this = images nb = 0
    toString(1) this = photo nb = 0
    nom = Mon_Album | chemin = Mon_Album | ouver = 1 | selectionne =
    _ nom = images | chemin = Mon_Album/images | ouver = | selectionne =
    _ nom = photo | chemin = Mon_Album/photo | ouver = | selectionne =
    ici : photo devrais étre ouver et son contenue devrait apparaitre
    Dossier(path)et ça je sais pas encore d'ou ça vient !!!

    Merci à tous :-)

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Il n'y a pas de return dans un constructeur.

    Pour les références :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @get_dossier:
    $d =& $this->liste_dossiers[$i]; 
     
    @explore_dossier:
    $this->liste_dossiers[] =& new Dossier($this->chemin."/".$obj, $this->maison); 
     
    @ex.php:
    $arbo =& new Dossier($racine, $maison);

  3. #3
    Membre habitué Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    Points : 151
    Points
    151
    Par défaut
    Ca c'est de l'efficacité Mr N. !!!!!
    Et tout ça merci beaucoup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Passage d'objet par référence
    Par PinGu- dans le forum Langage
    Réponses: 2
    Dernier message: 10/03/2008, 10h23
  2. [POO] Passage de valeurs d'objet à un array.
    Par Xunil dans le forum Langage
    Réponses: 5
    Dernier message: 28/12/2006, 18h06
  3. [POO] Passage d'objet
    Par kyript dans le forum Langage
    Réponses: 10
    Dernier message: 16/05/2006, 19h42
  4. [POO] Passage d'objet dans un formaulaire
    Par jiluc dans le forum Langage
    Réponses: 4
    Dernier message: 16/12/2005, 16h07
  5. [POO] passage nom objet dsn les parametres d'une fonction
    Par melou dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 21/10/2005, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo