11
votes

Faire datetime :: CreateFromFormat () Retourner la classe enfant au lieu de parent

Je prolonge DateTime code> ajoutez des méthodes et des constantes utiles.

Lorsque vous utilisez Nouveau code> pour créer un nouvel objet Tout va bien mais lors de l'utilisation de la méthode statique CreatefromFormat code> Il renvoie toujours l'objet DateTime code> et Bien sûr, aucune des méthodes d'enfant n'est disponible. P>

J'utilise le code suivant pour contourner ce problème. Est-ce la meilleure approche? P>

namespace NoiseLabs\DateTime;

class DateTime extends \DateTime
{
    static public function createFromFormat($format, $time)
    {
        $ext_dt = new self();

        $ext_dt->setTimestamp(parent::createFromFormat($format, time)->getTimestamp());

        return $ext_dt;
    }
}


1 commentaires

D'ACCORD. Merci d'avoir examiné cela, @lonesomeDay.


4 Réponses :


14
votes

C'est la voie à suivre. Cependant, depuis ce qui semble que vous voulez faire, c'est de rendre la classe DateTime extensible, je vous suggère d'utiliser statique au lieu de auto : xxx

Ce n'est pas nécessaire si vous ne prévoyez pas de prolonger la classe, mais si quelqu'un le fera, cela l'empêchera de devoir faire la même solution de contournement.


1 commentaires

C'est vrai, c'est une bonne pratique, merci d'avoir apporté statique dans le jeu. J'espérais imiter CreateFromFormat et remplacer auto avec statique mais depuis DateTime est une implémentation C, je suppose qu'il y a Rien d'autre que je puisse faire, non?



1
votes

Je pense que votre solution va bien. Est-ce une solution alternative (il suffit de refacturer un peu) est-ce: xxx

Je ne suis pas sûr de la meilleure façon de mettre en œuvre le fromdateTime est. Vous pourriez même prendre ce que vous avez et le mettre là-bas. Assurez-vous simplement de ne pas perdre le fuseau horaire.

Notez que vous pouvez même mettre en œuvre __ CallStatic et utiliser un peu de réflexion pour la faire preuve future.


0 commentaires

0
votes
class DateTimeEx extends DateTime
{
    static public function createFromFormat($format, $time, $object = null)
    {
        return new static(DateTime::createFromFormat($format, $time, $object)->format(DateTime::ATOM));
    }
}

0 commentaires

1
votes

Les solutions précédentes négligent des fuseaux horaires et des microsecondes, alors mon peu d'amélioration est ici. Je préfère la variante 1, mais en termes de performance 2 peut être peu plus rapide sur de vieux PHP.

class NDateTimeImmutable extends \DateTimeImmutable
{
    public static function createFromFormat1($format, $time)
    {
        $parent = parent::createFromFormat($format, $time);
        if (!$parent) {
            return false;
        }
        //Seting timezone like this and not by format to preserve timezone format
        $static = new static($parent->format('Y-m-d\TH:i:s.u'), $parent->getTimezone());
        return $static;
    }

    public static function createFromFormat2($format, $time)
    {
        $parent = parent::createFromFormat($format, $time);
         if (!$parent) {
            return false;
        }
        $serialized = serialize($parent);
        // numbers can be computed by strlen() 
        // eg. strlen(parent::class) = 17 but it is slow
        $serialized = strtr($serialized, ['17:"'.parent::class => '18:"'.static::class]);
        return unserialize($serialized);
    }
}


0 commentaires