Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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_Global Variables_Global - Fatal编程技术网

Php 是否可以将变量声明为;始终是全球性的;?

Php 是否可以将变量声明为;始终是全球性的;?,php,global-variables,global,Php,Global Variables,Global,有没有办法定义一个变量,这样我就不需要global$var1在每个函数中?只要在一开始就定义它,并在需要的地方继续使用它。我知道存在$GLOBALS,但不想使用它。您需要将变量作为参数传递给该函数,以避免使用GLOBALS 有问题的场景(可行!但要不惜一切代价避免) 此行为称为超全局变量。但php对它们的预定义列表进行了限制: 因此,无法添加自己的超全局变量 我的建议从最激进到不那么激进: 编辑PHP的源代码并添加您自己的超全局变量 根本不要写代码 不要使用PHP(使用具有不同变量范围策略的

有没有办法定义一个变量,这样我就不需要
global$var1在每个函数中?只要在一开始就定义它,并在需要的地方继续使用它。我知道存在$GLOBALS,但不想使用它。

您需要将变量作为参数传递给该函数,以避免使用GLOBALS

有问题的场景(可行!但要不惜一切代价避免)


此行为称为超全局变量。但php对它们的预定义列表进行了限制:

因此,无法添加自己的超全局变量

我的建议从最激进到不那么激进:

  • 编辑PHP的源代码并添加您自己的超全局变量
  • 根本不要写代码
  • 不要使用PHP(使用具有不同变量范围策略的不同语言)
  • 不要使用函数(编写纯脚本)
  • 使用常量而不是变量
  • 使用函数参数而不是全局参数
  • 使用静态变量而不是全局变量。(
    \G::$variable

首先,让我试着解释为什么不应该使用globals,因为它们非常难管理。假设团队成员将文件中的
$ADMIN
变量重写为1,那么所有引用
$ADMIN
变量的代码现在的值都为1

globals非常PHP4,所以您需要选择更好的设计模式,特别是如果这是新代码的话

不使用丑陋的
global
范例的一种方法是使用类容器。对某些人来说,这可能被称为“注册表”

class Container {
  public static $setting = "foo";
}


echo Container::$setting;
这使得这个变量的位置更加清晰,但是它的缺点是不能动态设置属性,因为在PHP中,您不能静态地设置属性


如果您不介意创建一个对象,并以这种方式设置动态变量,那么它会起作用。

为什么不完全消除全局变量呢?如果您需要充当全局变量的东西,可以使用一个类限定名来访问,但每个函数没有特殊声明。这听起来是个非常糟糕的主意。Globals应该少用。Globals有什么问题吗?它似乎解决了您遇到的问题(始终在全局范围内有变量),而且它将变量清楚地标记为全局变量,这样您就不会意外地将其视为一次性变量并覆盖它或诸如此类的废话。我没有足够的时间来解释它。也许以后吧。您需要的是静态变量。$GLOBALS$GLOBALS$GLOBALS随处可见似乎会使代码杂乱无章,难以编写。我问的可能是个好主意。
有没有办法定义一个变量,这样我就不需要全局调用$var1;在每个功能中然后建议一些到OP的方法。@ShankarDamodaran,好的。但建议并非如此。看起来“可能有太多的答案…”和“许多好问题会产生某种程度的意见…”“根本不写代码”-如果我能更经常地向我的一些团队成员建议这一点…这似乎是一个更好的选择,对于不能动态设置属性,我能做Containter->set('setting','value')吗; 在需要时更改值?
<?php
$test = 1;
function test($test)
{
    echo $test; // <--- Prints 1 
}
test($test); //<--- Pass the $test param here
class Container {
  public static $setting = "foo";
}


echo Container::$setting;