Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让PHP函数使用全局变量作为默认值?_Php_Function_Variables - Fatal编程技术网

让PHP函数使用全局变量作为默认值?

让PHP函数使用全局变量作为默认值?,php,function,variables,Php,Function,Variables,假设我有很多类似于下面的函数,并且将更多地涉及一些变量。例如,我将使用时区 function tell_time($values, $timezone = "Greenwich"){ // Do something dealing with the timezone } function expected_arrival_time($values, $timezone = "Greenwich"){ // Do something d

假设我有很多类似于下面的函数,并且将更多地涉及一些变量。例如,我将使用时区

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

然后,当有人下载并安装时,它只是从安装时设置的服务器变量中提取,或者可能从其他全局变量中提取。或者从客户的某些会话数据中提取数据,甚至是其他数据。关键是,我想要默认值,在这里我可以设置许多函数来共享相同的默认值,这样默认值很容易更新。有什么好办法吗?我不希望进入每一个函数,必须将其更改为设置默认值,并使用单独的内部逻辑从变量中提取,因为它只会让代码中充斥着为后来的任何人所做的忙碌工作。

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

不能将变量用作默认值

从“示例#6使用非标量类型作为默认值”部分开始:

默认值必须是常量表达式,而不是(例如)常量 变量、类成员或函数调用

我建议使用一个可为空的字段,并在方法的顶部设置默认值

function tell_time($values, ?string $timezone) {
  $timezone = is_null($timezone) ? $_SERVER["timezone"] : $timezone;
}
如果愿意,您仍然可以在参数定义中设置一个默认值,但我认为这对于您所描述的问题没有多大意义,除非您将其设置为null。

您可以使用。在文件顶部定义它,并让您的函数使用它。例如

define('CUSTOM_TIMEZONE','Mountain');
函数tell_time($values,$timezone=CUSTOM_timezone){
//你的代码在这里
}

只要更改常量值,它就会到处更改。

您可以执行以下操作:

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

但我甚至不想麻烦,因为PHP已经提供了一个内置功能。更好的是,您可以在应用程序设置期间的运行时,通过调用
date\u default\u timezone\u set()
,将从配置文件或环境变量读取的值传递给它,覆盖一次。在任何情况下,都不应将此参数作为每个函数的参数,也不应实现更改时区需要更改源代码的功能。如果您发布此版本,并且您的客户已更改源以自定义其时区,则他们将无法将更新应用于新版本,因为他们将有冲突的本地更改。

您可以使用
null
func\u get\u args()
并实现此功能。不能将变量引用用作默认参数。您必须在函数中添加解决输入问题的内容。最快的方法可能是将参数默认为null,然后通过
$timezone=$timezone$_服务器['timezome']
定义('ENV_TIMEZONE',getenv('TIMEZONE')?:'Mountain')整洁,我不知道这是可能的!非常酷,这正是我所需要的,并且需要最少的代码重构,特别是添加了@Jared_Farrish。这不是我想要的(我在函数式环境下工作,不是OOP,所以构造函数对我不起作用),但还是很高兴知道。