Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在oop中设置全局变量的最佳方法?_Php_Oop - Fatal编程技术网

Php 在oop中设置全局变量的最佳方法?

Php 在oop中设置全局变量的最佳方法?,php,oop,Php,Oop,我很难找到这个问题的答案,我确信它就在我面前,但我无法把它放在一起 //Global Variables global $GLOBAL; $GLOBAL['myPluginPath'] = dirname( __FILE__ ); //Main Object class My_Class { public function __construct() { // Initializ

我很难找到这个问题的答案,我确信它就在我面前,但我无法把它放在一起

    //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
。如果这是一个坏习惯,你能告诉我好习惯吗

还有一件事我很好奇。在主
\u构造中
您可以看到,我没有使用
全局$global
,因为它在没有它的情况下可以工作,但是在
require\u once
文件中是另一个类,其中包含必须使用
全局$global
的方法。希望有人能解释一下

我认为,有些人说这是一种不好的做法。我读到有一个单一模式(坏习惯)和一个全局模式。我不确定我在上面做了什么,我只是有点迷失了我应该在这里做什么,我正在努力实现

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

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


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

使用此示例来解决您的问题

“全局”关键字的工作方式与您认为的不同。它不会使变量具有全局作用域。它所做的只是指定要在外部作用域中使用变量的函数

例如:

$a="test";

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

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

从代码中可以看出,您只是在寻找将类名解析为文件名的方法。为此,最好使用。它从大部分代码中去掉了类如何映射到文件名的形式,这样您就可以专注于实际开发

可以通过使用来组织插件

第二,在大多数情况下,您不希望在构造函数中实例化类,因为这会导致耦合,过多的耦合会扼杀您的项目;相反,注入依赖项:

class My_Class 
{
    private $settings;

    public function __construct(My_Settings $settings) {
        $this->settings = $settings;
    } 
}
称之为:

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

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

对象与过程代码的区别在于,对象可以在许多地方反复使用

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

假设您有一个很棒的前端代码,并且您通过对象来编写它。在以后的某个时候,您需要对站点中的数据创建额外的报告。您开始编写代码,并意识到可以从前端重用类来实现几乎所有需要的功能—但是,遗憾的是,您的代码包含大量对全局的引用,这些引用只有在从特定脚本调用时才能在前端看到

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

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


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

不使用
$GLOBALS
的原因是我在别人的代码中看到了它,但我越来越喜欢它,不想要相同的名称lol。。我在其他地方看到了对
$GLOBALS
的一些提及,我认为它是通用的,很高兴你确认并指出了它。好吧,我明白了,但是如果全局变量只是普通的PHP语法,比如
dirname
和插件路径等等,那该怎么办呢。。以及插件版本号…好吧,将全局变量与OOP混合使用更难管理,因为如果您的代码越来越大,您如何知道您是否更改了全局变量值或决定删除它,哪个对象会受到它的严重影响。我切换到了
$GLOBALS
,这样做不需要定义有意义的
global$var
。我可以理解为什么对其他任何事情使用全局变量都会导致糟糕的实践,我可以理解为什么他们强调不使用它,但实际上我对全局变量的使用只是针对插件版本和文件路径。。因此,它与
$GLOBALS
配合得很好,我坚持使用它。。我喜欢它,只要它不会在我的案例中引起任何我认为不会的问题,我将使用它。OOP和Global并不是很好地结合在一起。好的,我肯定会注意到@Jack,但是使用OOP不是定义重用的好方法吗?比如插件版本和文件路径。。因此,如果我需要更改版本,我只会更改一次?感谢那里的关键字,我一定会查找这些关键字并找出它们是什么。我想完全理解OOP,我相信我以后会使用这种结构来构建自己的界面和web应用程序。现在我只是用一个插件扩展wordpress。只需要一个好的结构来设置我的实际插件函数,它包括表单数据。我认为