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 :

Constructeur d'un objet dérivant de DateInterval


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut Constructeur d'un objet dérivant de DateInterval
    Bonjour,

    Voilà, j'ai besoin de créer un objet (CSlot) dérivant de DateInterval et contenant entre autre comme propriété les dates de début et de fin de l'intervalle.

    Je souhaite créer un constructeur pour cet objet prenant (obligatoirement) en paramètre 2 objets DateTime, initialisant ainsi les propriétés de mon objet avec la date de début et de fin de mon intervalle, mais aussi la partie DateInterval comme si j'avais fait un $date_fin->diff($date_debut)

    Vous me suivez ?

    En d'autre terme, je souhaite qu'en faisant un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $x = new CSlot(new DateTime($date1), new DateTime($date2));
    donne quelque chose d'un peu équivalent à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $x = new DateTime($date1)->diff(new DateTime($date2));
    à la différence que $x contienne mon objet dérivant de DateInterval plutôt qu'un DateInterval.

    Or, là ou je butte un peu, c'est sur la rédaction du constructeur de mon objet CSlot.

    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
    class CSlot extends DateInterval
    {
            protected $start = NULL;
    	protected $end = NULL;
     
           public function __construct(DateTime $from, DateTime $to)
    	{
    		$this->start = $from;
    		$this->end = $to;
     
    		$diff = $this->start->Diff($this->end);
    		// ici, comment faire pour initialiser PROPREMENT $this avec les données de $diff ?
                   //parent::__construct();
    	}
     
    }
    Quel serait la bonne façon de faire pour arriver à mes fins ?

    En vous remerciant !

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    Quelque chose dans ce genre devrait faire l'affaire :
    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
    class CSlot
    extends \DateInterval
    {
        /**
         * @var DateTime
         */
        protected $start;
        /**
         * @var DateTime
         */
        protected $end;
     
        /**
         * @param  DateTime $from
         * @param  DateTime $to
         */
        public function __construct(\DateTime $from, \DateTime $to)
        {
            $this->start = $from;
            $this->end   = $to;
     
            $diff     = $to->diff($from);
            $interval = "P{$diff->y}Y{$diff->m}M{$diff->d}DT{$diff->h}H{$diff->i}M{$diff->s}S";
            parent::__construct($interval);
        }
    }
    Par contre, ne sachant pas si tu avais inversé par erreur la différence (from-to) je l'ai remplacé par (to-from)

  3. #3
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    Merci pour cette réponse.

    J'avais envisagé quelque chose d'assez proche, mais ça m'avait chiffonné et j'en suis arrivé à me demander si cette Class n'était pas un peu bancale... En effet, exprimer un intervalle en années et mois n'a pas de sens si ce n'est pas exprimé par rapport à une date précise puisque les années et les moins ne contiennent pas tous le même nombre de jour. Un intervalle de 2 mois positionner en janvier (31+28 ou 29 jours) ne fait donc pas la même durée qu'un intervalle de 2 mois positionner en juillet (31 + 31 jours).

    Bref, pour rebondir la dessus, cette class n'était elle pas un peu foireuse et ne suis-je pas en train de foncer droit dans le mur si ma class CSlot devait représenter par exemple une tâche sur un agenda (que l'on est donc censé pouvoir déplacer librement, donc changer la date en fonction de laquelle on exprime l'intervalle) ?

    Ne vaut mieux pas ne pas faire derriver CSlot de DateInterval, faire sa propre class d'intervalle qui ne se base que sur un nombre de secondes par exemple, et l'initialiser en récupérant cette durée par un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    intval($diff->format("%s")) + intval($diff->format("%i")) * 60 + intval($diff->format("%H")) * 3600 + intval($diff->format("%a")) * 86400

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Personnellement, je n'aurais pas pas procédé ainsi mais bon ne sachant pas où tu voulais en venir, je ne me suis pas étalé.
    Par principe : l'intervalle est un élément calculé et surtout recalculable donc faire une classe pour stocker le résultat d'un calcul....

    Fais attention : tu dois être précis : un intervalle calendaire c'est différent d'une durée, comme tu le soulignes un intervalle calendaire de 2 mois est différent d'une durée de 60 jours.

    Dans tous les cas, je ne ferais pas dériver ta classe de DateInterval mais je lui rajouterai au besoin une méthode qui renverrai le résultat de la différence dans l'unité de ton choix.

  5. #5
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    Je vais donc faire ma class CSlot sans la faire dériver d'autre chose avec juste une date de début et de fin en propriété, et je renverrai sa durée sur la base du calcul que j'ai donné dans mon dernier post.

    Merci beaucoup pour ton temps.

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Juste pour te dire que tu n'es pas obligé d'utiliser $diff->format() pour récupérer tes valeurs : DateInterval expose des attributs publics qui contiennent déjà toutes ces valeurs, regarde ici

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

Discussions similaires

  1. Reconstruire un constructeur d'un objet
    Par gabdeschenes dans le forum ASP.NET
    Réponses: 1
    Dernier message: 09/07/2009, 00h51
  2. Faire appel à un constructeur d'un objet
    Par ploxien dans le forum Langage
    Réponses: 8
    Dernier message: 03/05/2007, 10h32
  3. [JDOM] Constructeur de l'objet Document
    Par nicorama dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 20/04/2007, 01h11
  4. [AJAX] les constructeurs de l'objet xmlHttpRequest
    Par inter_amine dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/12/2006, 21h06
  5. Réponses: 3
    Dernier message: 02/05/2006, 15h12

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