6

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

    //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在每个方法中进行定义。但是,如果这是不好的做法,你能告诉我好的做法吗?

还有一件事我真的很好奇。在 main__construct你看到我不使用global $GLOBAL它,因为没有它它可以工作,但在该require_once文件内部是另一个类,它具有必须global $GLOBAL在它们内部使用的方法。希望有人能解释一下。

有人说这是不好的做法,我想。我读到有一个单例模式(不好的做法)和一个全局模式。不确定我上面所做的构成,我只是对我应该在这里做的事情和我想要实现的目标有点迷茫。

4

4 回答 4

9

一个对象确实应该具备执行其设计的任何功能所需的一切。如果不是,则应通过参数将数据传递给它。

对象与过程代码的整体观点的一部分是对象可以在许多地方一遍又一遍地重复使用。

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

假设您有一段很棒的前端代码,并且您全部通过对象编写。有时,您需要为您网站中的数据创建额外的报告。您开始编写代码并意识到您可以从前端重用您的类来实现您需要的几乎所有东西 - 但遗憾的是,您的代码包含对全局变量的大量引用,如果从某个脚本调用这些全局变量仅在前端可见。

这基本上只是使您的对象不可重用。

虽然这可能不是最好的做法,但我经常编写一个快速类,它包含各种可能被视为“全局”的变量,例如 URL 参数等,然后在我的代码中,我要么传递这些$GET信息$_POST根据需要直接传递给对象/函数,或者确实传递整个对象(很少)。

使用这种方法,我总是可以完全准备好重用对象,因为它们完全知道它们需要什么功能,因为它们在 params 中都是必需的。

于 2013-09-16T04:19:13.910 回答
4

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

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

好吧,我相信大多数人会说拥有全局状态是不好的做法,因为它更难管理或进行单元测试。大多数人会建议您使用“依赖注入”,而不是依赖于全局状态,您需要直接注入类需要的内容。

于 2013-09-16T04:01:44.980 回答
3

从您的代码看来,您似乎只是在寻找一种将类名解析为文件名的方法。为此,最好使用自动装载机。它使您的类如何映射到文件名的形式远离您的大量代码,以便您可以专注于实际开发。

可以使用命名空间来组织插件。

其次,大多数情况下你不想在构造函数内部实例化类,因为它会导致耦合,过多的耦合会在以后扼杀你的项目;相反,注入依赖项:

class My_Class 
{
    private $settings;

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

调用它:

$c = new My_Class(new My_Settings());
于 2013-09-16T04:11:57.597 回答
-3

使用此示例解决您的问题

global 关键字不像你想象的那样工作。它不会使变量具有全局范围。它所做的只是指定要在外部范围内使用变量的调用它的函数。

例如:

$a="test";

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

如果要使变量成为全局变量以便可以从类中访问,则需要使用 $GLOBALS 超全局变量。

于 2013-09-16T04:06:29.103 回答