12

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

3 回答 3

14

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

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

于 2012-11-09T15:35:18.420 回答
0

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

您已经感觉到将所有这些都放入全局变量中存在一些问题。尽管您已经开发了一些将事物封装到类中的想法。

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

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

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

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

于 2012-11-09T15:55:32.013 回答
0

作为记录。

静态的优点:

代码的清晰度。例如:

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

相对

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

静态的缺点:

  • 如果您使用的是 psr-4,那么您必须添加(并包含)一个新类(和一个新文件)。即使您使用 opcache,它也会影响性能(opcache 可以减轻它,但它不是魔术)。
  • 您必须定义一个代码块。
于 2018-08-22T13:49:20.673 回答