在oop中设置全局变量的最佳方法是什么?

时间:2013-09-16 03:54:01

标签: php oop

我很难找到答案,我确信它在我面前,但我不能把它放在一起。

    //Global Variables
    global $GLOBAL;
    $GLOBAL['myPluginPath'] = dirname( __FILE__ );


    //Main Object   
    class My_Class {

            public function __construct() {

                    // Initialize Settings
                    require_once $GLOBAL['myPluginPath'] . '/settings.php';
                    $My_Settings = new My_Settings();

            } 
     }

我想使用一个变量,所以我的代码感觉更有条理,我觉得我可以更好地阅读我的代码,当这样定义路径时,它可以更容易地更改变量,以便它在整个代码中应用,如果需要的话。

我可以通过在我的方法中编写变量来使变量工作。

    public function WhatEverFunc() {
        global $GLOBAL
        require_once $GLOBAL['myPluginPath'] . '/settings.php'; 
   }

这里的主要问题是,我想知道这是不好的做法,如果不是有更好的方法,那么必须在每个方法中定义global $GLOBAL。但是,如果这是不好的做法,你能告诉我良好的做法吗?

还有一件我真正好奇的事情。在主__construct内部,您看到我不使用global $GLOBAL,因为它没有它,但在require_once文件内是另一个类,其中包含必须使用global $GLOBAL的方法他们希望有人可以解释一下。

有些人说这是不好的做法,我想。我读到有一个单身模式(不良做法)和一个全局模式。不确定我上面做了什么构成,我只是有点迷失在我应该做的事情上我想要实现的目标。

4 个答案:

答案 0 :(得分:9)

一个对象真的应该拥有执行它所设计的任何功能所需的一切。如果没有,数据应该通过参数传递给它。

对象与程序代码的整体要点之一是对象可以在很多地方重复使用。

让我们使用这个例子说明为什么使用Globals和OOP是一个坏主意:

假设你有一个很棒的前端代码,你可以通过对象来编写代码。有时在轨道上,您需要为站点中的数据创建其他报告。你开始编写代码并意识到你可以从前面重新使用你的类来实现你需要的几乎所有东西 - 但是你的代码包含很多对全局变量的引用,只有在从某个脚本调用时才能在前端看到。

这基本上只是使你的对象变得不可重用。

虽然这可能不是最好的做法,但我经常写一个快速的课程,抓住各种$GET$_POST和其他可能被视为“全局”的变量,例如URL参数和之类的,然后在我的代码中,我要么根据需要将这些信息直接传递给对象/函数,要么实际传递整个对象(很少)。

使用这种方法,我总是完全准备好重新使用完全知道它们需要运行的对象,因为它们都是params所需要的。

答案 1 :(得分:4)

为什么不使用$GLOBALS?您甚至不需要使用global关键字。

  
    

这里的主要问题是,我想知道这是不好的做法

  

嗯,我相信大多数人会说全球状态是不好的做法,因为管理或进行单元测试更难。大多数人会建议你使用“依赖注入”,而不是依赖于全局状态,你需要直接注入类所需的东西。

答案 2 :(得分:3)

您的代码似乎只是在寻找一种方法将类名解析为文件名。为此目的,最好使用auto loaders。它需要将您的类映射到文件名的形式远离大部分代码,以便您可以专注于实际的开发。

可以使用namespaces来完成整理插件。

其次,在大多数情况下,您不希望在构造函数中实例化类,因为它会导致耦合,而太多的耦合可能会在以后扼杀您的项目;相反,注入依赖:

class My_Class 
{
    private $settings;

    public function __construct(My_Settings $settings) {
        $this->settings = $settings;
    } 
}

要打电话:

$c = new My_Class(new My_Settings());

答案 3 :(得分:-3)

使用此示例解决您的问题

全局关键字不像您认为的那样工作。它不会使变量具有全局范围。它只是指定你要调用它的函数,因为你想在外部作用域中使用该变量。

例如:

$a="test";

function something() {
    global $a;
    echo $a;  //Outputs: test
}

如果你想创建一个全局变量,以便可以从一个类中访问它,你需要使用$ GLOBALS超全局。