为什么不鼓励全局$ object_name?

时间:2011-05-02 16:29:14

标签: php class

我有两个课程,目前我通过使用它来引用另一个课程:

ClassB::func()
{
    global $classAObject;
    echo $classAObject->whatever();
}

但是,我被告知不鼓励使用global。是吗,为什么?

2 个答案:

答案 0 :(得分:7)

有很多理由不使用全局变量。这里只是几个:

  1. 范围
    • 在大型系统中,如果重复使用半通用名称,很容易意外地重新分配全局变量
    • 全局范围中的变量会增加脚本内存占用量。并不总是重要,但可以
    • 在其他一些语言中,没有必要获取全局变量 - 默认情况下它们是可用的 - 如果您忘记将同名变量声明为本地
    • ,这可能会导致错误
  2. 耦合
    • 在良好的软件设计中,组件应松散耦合。全局变量意味着紧密耦合。
  3. 维护
    • 全局变量可以在任何地方通过任何其他代码进行更改。特别是在大型系统中,这可以使调试现有代码或添加新代码成为噩梦。
  4. 处理您在帖子中提供的示例的更好方法是传递包含所需数据的对象。

    classB::func($obj) 
    {
       echo $obj->whatever();
    }
    
    $obj = new classAObject;
    classB::func($obj);
    

答案 1 :(得分:0)

原因是它忽略了OOP封装的想法。这样做要好得多:

ClassB::func($classAObject)
{
    echo $classAObject->whatever();
}