2015-11-01 147 views
1

我當然試過了$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'; 
     // ... 
+0

嘗試'專用$ DB_USER = $ DB_USER',但'$ GLOBALS'是邪惡 – Andrew

回答

2

您從類方法,這意味着你實際上是調用內部調用$DB_USER從變量本地範圍(在課堂內)。爲了解決這個問題,只是告訴你正在通過增加global $DB_USER你的方法,它將被用於內部尋找的全局變量PHP(或使用您的構造函數將其添加到類範圍):

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

隨着方法1,您現在可以撥打$this->DB_USER而不是$GLOBALS['DB_USER']

使用方法2,您將global $DB_USER添加到每個,然後只使用$DB_USER

欲瞭解更多信息,請參閱http://php.net/manual/en/language.variables.scope.php

0

使用構造函數初始化varibale:

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

聲明之外,但使用的構造函數初始化默認varbiale。 – Laurentiu

0

所以,你宣佈你variables第一,這將輸出初始化它們在__construct方法

$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 
) 

DEMO

編輯

使用依賴注入:

$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); 

DEMO_2

+0

如果你使用的是構造函數,那麼對DI來說要好得多$ DB_USER的值 –

+0

OP想把這些變量設置在最上面,所以我猜想使用構造函數更好。 – Mubin

+0

這並不否定將該值作爲參數傳遞給構造函數,這比使用$ GLOBALS –