Скажем, у меня есть много функций, подобных приведенным ниже, и я буду делать больше с использованием некоторых переменных. Например, я буду использовать часовой пояс ...

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....

Теперь, если сервер переходит в другой часовой пояс, все это необходимо обновить. То, что было бы «нормальным», было бы чем-то вроде индивидуального изменения всех значений по умолчанию ...

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....

Однако, если я хочу сделать этот код доступным в настройках с открытым исходным кодом, где часовой пояс сервера может часто меняться в зависимости от того, кто загружает и устанавливает, это может стать очень обременительным для многих людей очень быстро. Однако переработка всей логики не идеальна. Что было бы самым простым (при условии, что у меня установлена ​​переменная сервера), было бы что-то вроде ...

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....

Затем, когда кто-то загружает и устанавливает, он просто извлекает из серверной переменной, которая устанавливается во время установки, или, возможно, из какой-либо другой глобальной переменной. Или, может быть, извлечение из некоторых данных сеанса для клиента или что-то еще. Дело в том, что я хочу по умолчанию, где я могу установить для многих функций одно и то же значение по умолчанию, чтобы его было легко обновить. Есть хороший способ сделать это? Я бы предпочел не вдаваться в каждую отдельную функцию и менять ее на установку значений по умолчанию и извлечение переменных с отдельной внутренней логикой, поскольку это просто заставляет код загружаться работой для всех, кто придет позже.

2
lilHar 25 Фев 2021 в 00:30

4 ответа

Лучший ответ

Вы можете использовать константу. Определите его в верхней части файла и позвольте вашим функциям использовать это. Например.

define('CUSTOM_TIMEZONE', 'Mountain');

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

Просто измените значение константы, и оно изменится везде.

3
Tim 24 Фев 2021 в 21:45

Вы можете сделать что-то вроде этого:

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

Но я бы даже не стал беспокоиться, так как PHP уже предоставляет встроенный часовой пояс по умолчанию. Более того, вы можете переопределить это один раз во время выполнения, во время настройки вашего приложения, с помощью вызова date_default_timezone_set(), передавая ему значение, считываемое из файла конфигурации или переменной среды. В любом случае у вас не должно быть этого параметра в качестве аргумента для каждой функции, и вы не должны реализовывать эту функцию таким образом, чтобы изменение часового пояса требовало изменения исходного кода . Если вы выпустите это, и ваши клиенты изменили источник, чтобы настроить свой часовой пояс, то они не смогут применять обновления к новым версиям, потому что у них будут конфликтующие локальные изменения.

0
Alex Howansky 24 Фев 2021 в 22:05

Вы не можете использовать переменную как значение по умолчанию.

Из документации, раздел «Пример # 6 Использование нескалярных типов в качестве значений по умолчанию раздел »:

Значение по умолчанию должно быть постоянным выражением, а не (например) переменной, членом класса или вызовом функции.

Я предлагаю использовать поле, допускающее значение NULL, и установить значение по умолчанию в верхней части метода.

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

Вы все равно можете установить значение по умолчанию в определении параметра, если хотите, но я не думаю, что это имеет смысл с описываемой вами проблемой, если вы не установите его равным null.

1
rjdown 24 Фев 2021 в 21:54

IMHO, это хорошая идея использовать файл .env и поместить в него свой часовой пояс, а затем получить его в своем конструкторе следующим образом

<?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
    }
}

Этот пакет поможет вам работать с файлом .env на php
Я также даю вам возможность установить часовой пояс в вашем конструкторе, если вы хотите

2
azibom 24 Фев 2021 в 21:40