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

Mic*_*bry 6 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();

            } 
     }
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

还有一件我真正好奇的事情.在main中__construct你看到我没有使用global $GLOBAL它,因为它没有它,但在该require_once文件中是另一个具有必须global $GLOBAL在其中使用的方法的类.希望有人可以解释一下.

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

Flu*_*feh 9

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

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

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

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

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

虽然这可能不是最好的做法,但我经常写一个快速的类,抓住各种变量$GET,$_POST以及其他可能被认为是"全局"的变量,如URL params等,然后在我的代码中,我要么传递这些信息根据需要直接到对象/函数或实际上传递整个对象(很少).

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

  • @MichaelJosephAubry虽然PHP允许我们编写一些非常"有趣"的代码,但这样做并不总是一个好主意.如果您编写的代码是最好的,请花费额外的时间并使对象完全独立.它应该由包括类文件的人在任何地方运行,然后只是说`$ var = new yourObject();` (2认同)

inv*_*sal 4

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

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

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