Global vs static variables in PHP

2020-03-10 05:43发布

I'm creating a basic framework in PHP. I need to pass data for the current page into different functions, allow them to modify and save it, and then pass it back to the page to be displayed. I was originally planning on storing the data in a global variable like $GLOBALS['data'], but I'm starting to think that using a global is a bad idea. So I'm thinking that instead I will put a static variable in the system class, and access it using system::$data. So, my question is, which would be better and why?

This:

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

Or this:

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条回答
我命由我不由天
2楼-- · 2020-03-10 06:00

There really is no difference between a global variable and a public static variable. The class variable is namespaced a tiny bit better, but that hardly makes any difference. Both are accessible anywhere at any time and both are global state.

As it happens, I just wrote an exhaustive article on the subject:
How Not To Kill Your Testability Using Statics

查看更多
我只想做你的唯一
3楼-- · 2020-03-10 06:03

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.
查看更多
不美不萌又怎样
4楼-- · 2020-03-10 06:15

So, my question is, which would be better and why?

You already sense that there is some problem putting this all into globals. Although you have developed some thoughts to encapsulate things into a class.

I think that is a good starting point. Let's add some more spice to the cooking to get this more fluent at the beginning:

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

You have created an object now that you can pass along containing your data. Just pass $data to the area's where it's needed. No global or global static variable needed.

You can even make that type more concrete later on by extending from ArrayObject with your own type.

查看更多
登录 后发表回答