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

时间:2012-11-09 15:30:03

标签: php static global-variables

我正在用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'];

3 个答案:

答案 0 :(得分:12)

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

碰巧,我刚刚写了一篇关于这个主题的详尽文章:
How Not To Kill Your Testability Using Statics

答案 1 :(得分:0)

  

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

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

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

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

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

您甚至可以通过从ArrayObject扩展您自己的类型来使该类型更具体。

答案 2 :(得分:0)

For the record.

Pro of static:

Clarity of the code. For example:

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

versus

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

Cons of static:

  • If you are using psr-4 then you must add (and include) a new class (and a new file). It impacts the performance even if you use opcache (opcache aleviates it but it's not magic).
  • You must define a block of code.