我正在用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'];
全局变量和a之间确实没有区别 public static
变量。类变量的命名空间稍微好一些,但这几乎没有任何区别。两者都可以随时随地访问,并且都是全球状态。
碰巧的是,我刚刚写了一篇关于这个主题的详尽文章:
如何使用Statics杀死你的可测试性
全局变量和a之间确实没有区别 public static
变量。类变量的命名空间稍微好一些,但这几乎没有任何区别。两者都可以随时随地访问,并且都是全球状态。
碰巧的是,我刚刚写了一篇关于这个主题的详尽文章:
如何使用Statics杀死你的可测试性
所以,我的问题是,哪个更好,为什么?
你已经意识到将这一切都放入全局变量中存在一些问题。虽然你已经开发了一些思想来将事物封装到一个类中。
我认为这是一个很好的起点。让我们为烹饪添加一些香料,让它在开始时更加流畅:
$data = new ArrayObject(array());
$data['page_title'] = 'Home';
您现在已经创建了一个对象,您可以传递包含数据的对象。刚过去 $data
到该地区的需要。不需要全局或全局静态变量。
您甚至可以通过延伸来使该类型更具体 ArrayObject
你自己的类型。
作为记录。
静态专业:
清晰的代码。例如:
function fn() {
System::data()
}
与
function fn() {
global $system;
$system->data()
}
静电的缺点:
- 如果您使用的是psr-4,则必须添加(并包含)新类(和新文件)。即使你使用opcache它也会影响性能(opcache可以缓解它,但它并不神奇)。
- 您必须定义一个代码块。