问题 PHP中的全局变量与静态变量


我正在用PHP创建一个基本框架。我需要将当前页面的数据传递到不同的函数,允许它们修改并保存它,然后将其传递回要显示的页面。我原本计划将数据存储在全局变量中 $GLOBALS['data'],但我开始认为使用全局是一个坏主意。所以我想我会在系统类中放置一个静态变量,并使用它来访问它 system::$data。所以,我的问题是,哪个更好,为什么?

这个:

$GLOBALS['data'] = array();
$GLOBALS['data']['page_title'] = 'Home';
echo $GLOBALS['data']['page_title'];

或这个:

class system
{
    public static $data = array()
}

function data($new_var)
{
    system::$data = array_merge(system::$data, $new_var);
}

data(array('page_title' => 'Home'));
echo system::$data['page_title'];

3158
2017-11-09 15:30


起源



答案:


全局变量和a之间确实没有区别 public static 变量。类变量的命名空间稍微好一些,但这几乎没有任何区别。两者都可以随时随地访问,并且都是全球状态。

碰巧的是,我刚刚写了一篇关于这个主题的详尽文章:
如何使用Statics杀死你的可测试性


11
2017-11-09 15:35



很棒的文章 - Dejan Marjanovic
是否存在性能差异?似乎全局变量不如使用静态变量那么有效。 - Kyle Piontek
@Kyle 没关系。 认真。可能存在差异,但它在天文数字上很小而且无关紧要。您的首要任务应该是编写可维护,逻辑,可读和所有其他代码应该是的代码。全球和 public static 变量对于这个目的来说都很糟糕。 - deceze♦
@deceze我的问题 - 你会在2和为什么之间使用(选择)? - ShalomSam
@ShalomSam正如我以为我上面说的那样:都没有。两者之间没有任何真正的区别,而且它们都非常糟糕。 (在某些情况下,静态类成员是有意义的,但是除了在脚本中如此之小以至于几乎没有任何范围之外,永远不应该使用全局变量。)阅读上面链接的文章。 - deceze♦


答案:


全局变量和a之间确实没有区别 public static 变量。类变量的命名空间稍微好一些,但这几乎没有任何区别。两者都可以随时随地访问,并且都是全球状态。

碰巧的是,我刚刚写了一篇关于这个主题的详尽文章:
如何使用Statics杀死你的可测试性


11
2017-11-09 15:35



很棒的文章 - Dejan Marjanovic
是否存在性能差异?似乎全局变量不如使用静态变量那么有效。 - Kyle Piontek
@Kyle 没关系。 认真。可能存在差异,但它在天文数字上很小而且无关紧要。您的首要任务应该是编写可维护,逻辑,可读和所有其他代码应该是的代码。全球和 public static 变量对于这个目的来说都很糟糕。 - deceze♦
@deceze我的问题 - 你会在2和为什么之间使用(选择)? - ShalomSam
@ShalomSam正如我以为我上面说的那样:都没有。两者之间没有任何真正的区别,而且它们都非常糟糕。 (在某些情况下,静态类成员是有意义的,但是除了在脚本中如此之小以至于几乎没有任何范围之外,永远不应该使用全局变量。)阅读上面链接的文章。 - deceze♦


所以,我的问题是,哪个更好,为什么?

你已经意识到将这一切都放入全局变量中存在一些问题。虽然你已经开发了一些思想来将事物封装到一个类中。

我认为这是一个很好的起点。让我们为烹饪添加一些香料,让它在开始时更加流畅:

$data = new ArrayObject(array());
$data['page_title'] = 'Home';

您现在已经创建了一个对象,您可以传递包含数据的对象。刚过去 $data 到该地区的需要。不需要全局或全局静态变量。

您甚至可以通过延伸来使该类型更具体 ArrayObject 你自己的类型。


1
2017-11-09 15:55



作为一个与该帖完全无关的FYI,我们不能再迁移超过60天的问题了。 - NullUserException
@NullUserException:感谢您的通知。 - hakre


作为记录。

静态专业:

清晰的代码。例如:

function fn() { 
   System::data()
 }

function fn() { 
   global $system;
   $system->data()
 }

静电的缺点:

  • 如果您使用的是psr-4,则必须添加(并包含)新类(和新文件)。即使你使用opcache它也会影响性能(opcache可以缓解它,但它并不神奇)。
  • 您必须定义一个代码块。

0
2017-08-22 13:49