2014-04-26 71 views
0

我在寫一個最小的依賴注入類。然而,當我嘗試訪問一個靜態方法內的PHP給'未定義變量'通知的靜態屬性。該代碼是這樣的:訪問類內部的靜態屬性給出'未定義的變量'通知

class DI{ 
/** 
* @var array $registry Class dependency resolving functions 
*/ 
public static $registry = []; 

/** 
* @var array $instances Class instances for singleton classes 
*/ 
public static $instances = []; 

public static function register($className, $singleton, $resolve){ 
    self::$registry[$className] = ['resolve' => $resolve, 'singleton' => $singleton]; 
} 

public static function inject($className){ 
    if(array_key_exists($className, self::$registry)){ 
     if(array_key_exists($className, self::$instances)) { 
      return self::$instances[$className]; 
     } 
     else{ 
      // Problem occurs at that line: 
      $instance = self::$registry[$className]['resolve'](); 
      if(self::$registry[$className]['singleton']){ 
       self::$instances[$className] = $instance; 
      } 
      return $instance; 
     } 
    } 
    else{ 
     return false; 
    } 
} 
} 

但是如果我更改了該行這兩行問題就消失了:

$instance = self::$registry; 
$instance = $instance[$className]['resolve'](); 

這是PHP的通知:

Notice: Undefined variable: registry in /var/www/lib/DI.class.php on line 32 

回答

0

正如你所提到的問題是以下行:

$instance = self::$registry[$className]['resolve'](); 

PHP嘗試使用$ registry數組中的字符串值的名稱(不是靜態類屬性!)調用函數。雖然只存在一個靜態:: $註冊表數組,並且沒有本地$註冊表數組,但php會打印未定義的通知。

因爲函數調用,PHP解決了這個語句,如下面的僞代碼:

$string = $registry[$className]['resolve']; 
$result = $string(); 
$instance = self::{result of function call}; 

這也就是您的解決方案工作的原因。 也許一個靜態的getter方法可以封裝數組訪問邏輯。

此行爲還存在一個錯誤:https://bugs.php.net/bug.php?id=55573和一個解釋,預計它會像它一樣工作。

相關問題