Disons que j'ai beaucoup de fonctions comme les suivantes, et que j'en ferai plus impliquant une variable. Par exemple, j'utiliserai le fuseau horaire ...

function tell_time($values, $timezone = "Greenwich"){
     // Do something dealing with the timezone
}

function expected_arrival_time($values, $timezone = "Greenwich"){
     // Do something dealing with the timezone
}

function delayed_shipment_arrival($values, $timezone = "Greenwich"){
     // Do something dealing with the timezone
}
// ... and so on....

Désormais, si le serveur passe à un autre fuseau horaire, tous doivent être mis à jour. Ce qui serait `` normal '' serait quelque chose comme changer individuellement toutes les valeurs par défaut ...

function tell_time($values, $timezone = "Mountain"){
     // Do something dealing with the timezone
}

function expected_arrival_time($values, $timezone = "Mountain"){
     // Do something dealing with the timezone
}

function delayed_shipment_arrival($values, $timezone = "Mountain"){
     // Do something dealing with the timezone
}
// ... and so on....

Cependant, si je souhaite rendre ce code accessible dans un paramètre open source, où le fuseau horaire du serveur peut changer fréquemment en fonction de qui télécharge et installe, cela peut devenir très fastidieux pour beaucoup de gens très rapidement. Cependant, retravailler toute la logique n'est pas idéal. Ce qui serait le plus simple (en supposant que j'ai le jeu de variables serveur), ce serait quelque chose comme ...

function tell_time($values, $timezone = $_SERVER["timezone"]){
     // Do something dealing with the timezone
}

function expected_arrival_time($values, $timezone = $_SERVER["timezone"]){
     // Do something dealing with the timezone
}

function delayed_shipment_arrival($values, $timezone = $_SERVER["timezone"]){
     // Do something dealing with the timezone
}
// ... and so on....

Ensuite, lorsque quelqu'un télécharge et installe, il extrait simplement d'une variable de serveur qui est définie au moment de l'installation, ou potentiellement d'une autre variable globale. Ou peut-être tirer de certaines données de session pour le client ou même autre chose. Le fait est que je veux la valeur par défaut où je peux définir de nombreuses fonctions pour partager la même valeur par défaut, de sorte que la valeur par défaut soit facile à mettre à jour. Y at-il un bon moyen de le faire? Je préférerais ne pas entrer dans chaque fonction et devoir le changer pour définir les valeurs par défaut et extraire des variables avec une logique interne distincte, car cela rend simplement le code rempli de travail pour tous ceux qui viennent plus tard.

2
lilHar 25 févr. 2021 à 00:30

4 réponses

Meilleure réponse

Vous pouvez utiliser une constante. Définissez-le en haut d'un fichier et laissez vos fonctions l'utiliser. Par exemple.

define('CUSTOM_TIMEZONE', 'Mountain');

function tell_time($values, $timezone = CUSTOM_TIMEZONE) {
// Your code here
}

Changez simplement la valeur des constantes et cela change partout.

3
Tim 24 févr. 2021 à 21:45

Vous pourriez faire quelque chose comme ça:

function tell_time($values, $timezone = null) {
    if ($timezone === null) {
        $timezone = $_SERVER["timezone"];
    }
}

Mais je ne me dérangerais même pas, car PHP fournit déjà un fonction de fuseau horaire par défaut. Mieux, vous pouvez remplacer cela une fois au moment de l'exécution, lors de la configuration de votre application, via un appel à date_default_timezone_set(), en lui transmettant une valeur lue à partir d'un fichier de configuration ou d'une variable d'environnement. Dans tous les cas, vous ne devriez pas avoir ce paramètre comme argument pour chaque fonction, et vous ne devriez pas implémenter la fonctionnalité de telle sorte que la modification du fuseau horaire nécessite une modification du code source . Si vous le libérez et que vos clients ont modifié la source pour personnaliser leur fuseau horaire, ils ne pourront pas appliquer les mises à jour aux nouvelles versions car ils auront des modifications locales contradictoires.

0
Alex Howansky 24 févr. 2021 à 22:05

Vous ne pouvez pas utiliser une variable comme valeur par défaut.

De la documentation, section "Exemple # 6 Utilisation de types non scalaires comme valeurs par défaut section ":

La valeur par défaut doit être une expression constante et non (par exemple) une variable, un membre de classe ou un appel de fonction.

Je suggère d'utiliser un champ Nullable et de définir votre valeur par défaut en haut de la méthode.

function tell_time($values, ?string $timezone) {
  $timezone = is_null($timezone) ? $_SERVER["timezone"] : $timezone;
}

Vous pouvez toujours définir une valeur par défaut dans la définition du paramètre si vous le souhaitez, mais je ne pense pas que cela ait beaucoup de sens avec le problème que vous décrivez, à moins que vous ne le définissiez sur null.

1
rjdown 24 févr. 2021 à 21:54

IMHO, c'est une bonne idée d'utiliser le fichier .env et de mettre votre fuseau horaire dessus, puis de le récupérer dans votre constructeur comme ceci

<?php

class Test {
    private $timezone;

    function __construct($timezone = null) {
        $this->timezone = is_null($timezone) ? $_ENV["timezone"] : $timezone;
    }

    function tell_time($values){
            // Do something dealing with the timezone
    }
    
    function expected_arrival_time($values){
            // Do something dealing with the timezone
    }
    
    function delayed_shipment_arrival($values){
            // Do something dealing with the timezone
    }
}

Ce package vous aidera à travailler avec .env fichier en php
Je vous donne également cette chance de définir le fuseau horaire dans votre constructeur si vous le souhaitez

2
azibom 24 févr. 2021 à 21:40