Php 为什么可以';我不能访问这个全局变量吗?

Php 为什么可以';我不能访问这个全局变量吗?,php,Php,我当然试过了,$GLOBALS,但仍然没有成功。我的语法正确吗。我的理解是,$DB_USER属于全球范围 <?php $DB_USER = 'foo'; class Database { // this does not work private $DB_USER = $GLOBALS['DB_USER']; private $DB_PASS = 'foob';

我当然试过了,
$GLOBALS
,但仍然没有成功。我的语法正确吗。我的理解是,
$DB_USER
属于全球范围

<?php
    $DB_USER = 'foo';
    class Database
    {
        // this does not work
        private $DB_USER =              $GLOBALS['DB_USER'];
        private $DB_PASS =              'foob';
        private $DB_DRIVER =            'foob_foob';
        // ...

使用构造函数初始化变量:

public function __constructor(){
    global $YOUR_VARIABLE;
    $DB_USER = $YOUR_VARIABLE;
}

因此,首先声明
变量
,并在
\u构造
方法中初始化它们

$DB_USER = 'foo';
class Database
{
    private $DB_USER,
    $DB_PASS,
    $DB_DRIVER;
    public function __construct(){
        $this->DB_USER = $GLOBALS['DB_USER'];
        $this->DB_PASS = 'foob';
        $this->DB_DRIVER = 'foob_foob';
        print_r($this);
    }
}

new Database();
这将输出

Database Object
(
    [DB_USER:Database:private] => foo
    [DB_PASS:Database:private] => foob
    [DB_DRIVER:Database:private] => foob_foob
)

编辑

使用依赖项注入:

$DB_USER = 'foo';
class Database
{
    private $DB_USER,
    $DB_PASS,
    $DB_DRIVER;
    public function __construct($dbUser){
        $this->DB_USER = $dbUser;
        $this->DB_PASS = 'foob';
        $this->DB_DRIVER = 'foob_foob';
        print_r($this);
    }
}

new Database($DB_USER);

您正在从类方法内部调用
$DB\u USER
,这意味着您实际上是从局部范围(在类内)调用变量。要解决这个问题,只需告诉PHP您正在寻找全局变量,方法是在将要使用的方法中添加
global$DB_USER
(或者使用构造函数将其添加到类范围中):

使用方法1,您现在可以调用
$this->DB\u USER
,而不是
$GLOBALS['DB\u USER']

使用方法2,将
global$DB\u USER
添加到每个用户,然后只使用
$DB\u USER


有关更多信息,请参见尝试
private$DB_USER=$DB_USER
,但是
$GLOBALS
是您在外部声明的,但使用构造函数初始化默认变量。如果您使用构造函数,则最好将$DB_用户值设置为DI。op希望将这些变量设置在最顶部,所以我想使用构造函数更好。这并不否定将值作为参数传递给构造函数,这比使用构造函数要好得多$GLOBALS@MarkBaker,虽然我100%同意您对DI的看法,但OP的问题是由于对变量作用域缺乏了解。在这种情况下,纠正他最初的问题(并阐明可变范围的主题)不是比尝试将他介绍给DI更好吗?我想听听你对这件事的看法。这实际上是对
$GLOBALS['DB_USER']的“运行时”评估而不是可变范围问题;对$GLOBALS的访问是运行时的-
[property]声明可能包括初始化,但此初始化必须是一个常量值——也就是说,它必须能够在编译时进行计算,并且不能依赖于运行时信息才能进行计算
class Database
{  
    private $DB_USER =              '';
    private $DB_PASS =              'foob';
    private $DB_DRIVER =            'foob_foob';
    // snip


   // Method 1: Add the variable to the class scope with the constructor        
   public function __construct() 
   {
      global $DB_USER;
      $this->DB_USER = $DB_USER;
   }


   // Method 2: tell PHP that you want the global variable in your methods
   public function foo() 
   {
      $global $DB_USER;
      ...
    }