Je prolonge Lorsque vous utilisez J'utilise le code suivant pour contourner ce problème. Est-ce la meilleure approche? P> DateTime code> ajoutez des méthodes et des constantes utiles.
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>
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;
}
}
4 Réponses :
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 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. P> P> statique code> au lieu de
auto code>:
C'est vrai, c'est une bonne pratique, merci d'avoir apporté statique code> dans le jeu. J'espérais imiter
CreateFromFormat CODE> et remplacer
auto code> avec
statique code> mais depuis
DateTime code> est une implémentation C, je suppose qu'il y a Rien d'autre que je puisse faire, non?
Je pense que votre solution va bien. Est-ce une solution alternative (il suffit de refacturer un peu) est-ce: Je ne suis pas sûr de la meilleure façon de mettre en œuvre le Notez que vous pouvez même mettre en œuvre fromdateTime code> 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. P>
__ CallStatic CODS> et utiliser un peu de réflexion pour la faire preuve future. P> P>
class DateTimeEx extends DateTime { static public function createFromFormat($format, $time, $object = null) { return new static(DateTime::createFromFormat($format, $time, $object)->format(DateTime::ATOM)); } }
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); } }
D'ACCORD. Merci d'avoir examiné cela, @lonesomeDay.