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;
...
}