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



假设我有很多像下面这样的函数,并且将制作更多涉及一些变量的函数。例如,我将使用timezone…

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

然后,当有人下载并安装时,它只是从安装时设置的服务器变量中提取,或者可能从其他全局变量中提取。或者从一些会话数据中提取客户或其他东西。关键是,我想要一个默认值,我可以设置许多函数共享相同的默认值,这样默认值就很容易更新。有什么好办法吗?我不喜欢进入每个单独的函数,不得不将其更改为设置默认值并从具有单独内部逻辑的变量中提取,因为它只会使代码充满了忙碌的工作。

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

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

只要改变常量的值,它就会在所有地方改变。

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

这个包将帮助你在php中使用.env文件
如果你想

,我也给你这个机会在构造函数中设置时区

不能使用变量作为默认值。

例#6使用非标量类型作为默认值section":

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

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

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

如果你愿意,你仍然可以在参数定义中设置一个默认值,但我认为这对你所描述的问题没有多大意义,除非你将其设置为null。

你可以这样做:

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

但是我甚至不会麻烦,因为PHP已经提供了内置的默认时区特性。更好的是,你可以在运行时覆盖那一次,在你的应用程序的设置期间,通过调用date_default_timezone_set(),传递它从配置文件或环境变量读取的值。在任何情况下,您都不应该将此参数作为每个函数的参数,也不应该实现这样的特性,即更改时区需要更改源代码。如果您发布了这个,而您的客户已经更改了源代码以自定义他们的时区,那么他们将无法将更新应用到新版本,因为他们将有冲突的本地更改。

最新更新