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 :

Redéclaration d'une fonction en POO


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Redéclaration d'une fonction en POO
    Bonjour à tous,

    J'ai ce code qui instancie un nouvel utilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $new_book_for = new Utilisateur($res->id, $res->matricule, $res->nom, $res->prenom, $res->email, 2);
    Avec cette classe :

    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
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
     
     
    <?php
    	/**
    	* Cette classe gère les interactions des utilisateurs (reservation, annulation d'une reservation) ainsi que leurs données personnelles 
    	* (email, matricule, nom, prénom, ...)
    	*
    	* @Author : David Dubois
    	*
    	* @Param 
    	*/
    	class Utilisateur
    	{
    		// Attributs
    		protected $id;
    		protected $nom;
    		protected $prenom;
    		protected $email;
    		protected $matricule;
    		protected $rang;
    		protected $db;
    		protected $reservations = array(); // réservations non encore envoyées par email
     
    		// Constructeur
    		public function __construct($id, $matricule, $nom, $prenom, $email, $rang)
    		{
    			$this->id = $id;
    			$this->matricule = $matricule;
    			$this->nom = $nom;
    			$this->prenom = $prenom;
    			$this->email = $email;
    			$this->rang = $rang;
    			$this->db = PDO2::getInstance()->db;
    			$this->initializeReservations();
    		}
     
    		/**
    		* Fonction "magique" utilisée par PHP pour serialiser un objet, on détermine quels attributs doivent être serialisés.
    		* ici j'exclus l'attribut db car un objet PDO n'est pas serialisable.
    		*/
    		public function __sleep()
    		{
    			return array('id', 'login', 'nom', 'prenom', 'email', 'matricule', 'rang', 'reservations');
    		}
     
    		/**
    		* Fonction "magique" utilisée par PHP pour déserialiser un objet.
    		* ici je récupère l'instance de la connexion PDO car elle n'avait pas pu être sérialisée.
    		*/
    		public function __wakeup()
    		{
    			$this->db = PDO2::getInstance()->db;
    		}
     
    		// Accesseurs
    		public function getNomComplet()
    		{
    			return substr($this->prenom, 0, 1) . '. ' . $this->nom;
    		}
     
    		public function getMatricule()
    		{
    			return $this->matricule;
    		}
     
    		public function getEmail()
    		{
    			return $this->email;
    		}
     
    		public function getRang()
    		{
    			return $this->rang;
    		}
     
    		public function getId()
    		{
    			return $this->id;
    		}
     
    		public function getReservations()
    		{
    			return $this->reservations;
    		}
     
    		// Méthodes
     
    		/**
    		* Effectue une proposition de réservation pour l'utilisateur
    		*
    		* @name: 		Utilisateur::reserver(matricule, jour, mois, annee, periode, commentaire = null)
    		* @access:		public
    		*
    		* @params:		matricule (string)
    		*				jour (int)
    		*				mois (int)
    		*				annee (int)
    		*				periode (string)
    		*				commentaire (string ou null)
    		*
    		* @return:		bool
    		*/
    		public function reserver($jour, $mois, $annee, $periode, $commentaire = null)
    		{
    			$id_jour = $annee . '_' . $mois . '_' . $jour . '_' . $periode;
    			//$occupation = '#ffcc00';
    			$nom_complet = $this->getNomComplet();
     
    			$requete = $this->db->prepare('INSERT INTO reservations(jour, statut, id_user, commentaire, machine) 
    													VALUES(:id_jour, :statut, :utilisateur, :commentaire, :machine)'); //ajout par DD 21/07/2013
    			$requete->bindParam(':id_jour', $id_jour);
    			$requete->bindValue(':statut', 3);
    			$requete->bindParam(':utilisateur', $this->id);
    			//ajout par DD 21/07/2013
    			$requete->bindParam(':machine', $_SESSION['machine']);
     
    			// Si il n'y a pas de commentaire, on entre NULL dans la base de données
    			if (!$commentaire)
    			{
    				$requete->bindValue(':commentaire', null, PDO::PARAM_NULL);
    			}
    			else
    			{
    				$requete->bindParam(':commentaire', $commentaire, PDO::PARAM_STR);
    			}
     
    			// On vérifie que l'enregistrement a été effectué grace à la valeur de retour de PDOStatement::execute()
    			if (!$requete->execute())
    			{
    				$arr = $requete->errorInfo();
    				if (Config::read('debug'))
    				{
    					$_SESSION['erreurs']['reservation'] = 'Erreur : [SQLSTATE:' . $arr[0] . '][' . $arr[1] . '] ' . $arr[2];
    				}
    				else
    				{
    					if (substr($arr[2], 0, 15) == 'Duplicate entry')
    					{
    						$_SESSION['erreurs']['reservation'] = 'Réservation impossible, la salle est déjà réservée pour cette période.';
    					}
    					else
    					{
    						$_SESSION['erreurs']['reservation'] = 'Réservation non effectuée, une erreur s\'est produite';
    					}
    				}
    				return false;
    			}
    			$this->reservations[$id_jour] = new Reservation($id_jour, $commentaire);
    			$this->trierReservations();
    			return true;
    		}
     
    		public function annuler($id_jour)
    		{
    			/* 
    			* On vérifie que l'utilisateur qui veut annuler une proposition est bien celui qui a fait cette proposition
    			* pour éviter que l'on puisse supprimer la proposition d'un autre.
    			* Un traitement sera fait en amont, en javascript pour ne pas afficher le menu contextuel sur une réservation
    			* n'appartenant pas à l'utilisateur.
    			*/
    			$verif = $this->db->prepare('SELECT id_user
    												 FROM reservations
    												 WHERE jour = :id_jour
    												 AND machine = :machine'); //modifé par DD 21/7/13
    			$verif->bindParam(':id_jour', $id_jour);
    			$verif->bindParam(':machine', $_SESSION['machine']); //modifé par DD 21/7/13
    			$verif->execute();
    			$user = $verif->fetch();
    			if ($user['id_user'] == $this->id || $_SESSION['utilisateur']->getRang() == 'administrateur')
    			{
    				$requete = $this->db->prepare('DELETE FROM reservations
    														WHERE jour = :id_jour
    														AND machine = :machine'); //modifé par DD 21/7/13
    				$requete->bindParam(':id_jour', $id_jour);
    				$requete->bindParam(':machine', $_SESSION['machine']); //modifé par DD 21/7/13
    				$requete->execute();
    				$this->supprimerReservation($id_jour);
    			}
    		}
     
    		protected function initializeReservations()
    		{
    			$requete = "SELECT jour, commentaire 
    						FROM reservations 
    						WHERE id_user = :id
    						AND statut = 3
    						AND email_envoye = 0
    						AND machine = :machine"; //modifé par DD 21/7/13
    			$stmt = $this->db->prepare($requete);
    			$stmt->bindParam(":id", $this->id, PDO::PARAM_INT);
    			$stmt->bindParam(":machine", $_SESSION['machine'], PDO::PARAM_INT); //modifé par DD 21/7/13
    			$stmt->execute();
     
    			while ($res = $stmt->fetch())
    			{
    				$this->reservations[$res['jour']] = new Reservation($res['jour'], $res['commentaire']);
    			}
     
    			$this->trierReservations();
    		}
     
    		public function trierReservations()
    		{
    			function cmp(Reservation $a, Reservation $b)
    			{
    				if ($a->getOrder() == $b->getOrder()) {
    					return 0;
    				}
    				return ($a->getOrder() < $b->getOrder()) ? -1 : 1;
    			}
     
    			uasort($this->reservations, "cmp");
    		}
     
    		public function supprimerReservation($jour)
    		{
    			if (isset($this->reservations[$jour])) unset($this->reservations[$jour]);
    		}
    	}
    ?>
    J'obtiens ce message d'erreur :

    PHP Fatal error: Cannot redeclare cmp() (previously declared in /Applications/MAMP/htdocs/apa_juillet_2014/classes/Utilisateur.class.php:202) in /Applications/MAMP/htdocs/apa_juillet_2014/classes/Utilisateur.class.php on line 202
    Ligne 202 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function cmp(Reservation $a, Reservation $b)
    Merci d'avance pour votre aide et bon dimanche.

    bee

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ta fonction cmp est déclarée dans une autre fonction, donc elle est redeclarée à chaque appel de l'autre fonction.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Salut,

    Merci pour ta réponse.

    Je viens de commenter cette ligne du constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //$this->initializeReservations();
    Je dois avouer que ça fonctionne, mais comme je reprends du code que je n'ai pas codé, je vais voir si le fait de commenter cela pose problème pour le reste du projet.

    Question : je peux mettre un if(isset...) dans un constructeur ?

    Merci pour tout.

    bee

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Tu peux la remplacer par une fonction anonyme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function trierReservations() {
        uasort($this->reservations, function (Reservation $a, Reservation $b) {
            if ($a->getOrder() == $b->getOrder())
                return 0;
    	return ($a->getOrder() < $b->getOrder()) ? -1 : 1;
        });
    }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Pour éviter de déclarer plusieurs fois ta fonction tu peux aussi faire un test avec la fonction function_exists. Tu peux également une fonction static (voir l'exemple 3 ici).

    La meilleure des solutions, si tu n'utilises cette fonction de tri qu'à cet endroit là,restant en effet d'utiliser une fonction anonyme.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

Discussions similaires

  1. Retour d'une fonction en POO
    Par andaman dans le forum Langage
    Réponses: 6
    Dernier message: 15/10/2013, 18h58
  2. [SGBD] [POO PHP 4.4.2] Problème mysql_query dans une fonction
    Par Djoul dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 16/06/2006, 13h25
  3. Réponses: 11
    Dernier message: 05/04/2006, 11h50
  4. Réponses: 3
    Dernier message: 06/11/2005, 18h02
  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