2016-08-21 5 views
1

次のクラスでConfig::get('modules');を呼び出すと、

私はちょうどstatic::$configを返すと機能はうまく動作しますが、要素を返そうとすると、間違いなく定義されていてもエラーが発生します。

class Config 
{ 
    private static $config = NULL; 
    private static $initialized = FALSE; 

    public static function _init() 
    { 
     if(self::$initialized == TRUE) 
     { 
      return; 
     } 
     static::$config = $GLOBALS['config']; 
     unset($GLOBALS['config']); 

     var_dump(static::$config); 
     static::$initialized = TRUE; 
    } 

    public static function get($property = '') 
    { 
     self::_init(); 
     var_dump(static::$config); 

     $parts = explode('.', $property); 

     $path = 'config'; 

     foreach($parts as $part) 
     { 
      $path .= '["'.$part.'"]'; 
     } 

     return static::$$path; 

    } 
} 

機能とエラーで出力されるvarダンプ。

array(3) { 
    ["APP_VERSION"]=> 
    string(5) "0.0.1" 
    ["database"]=> 
    array(3) { 
    ["dsn"]=> 
    string(32) "mysql:host=localhost;dbname=test" 
    ["user"]=> 
    string(4) "root" 
    ["pass"]=> 
    string(0) "" 
    } 
    ["modules"]=> 
    array(0) { 
    } 
} 
array(3) { 
    ["APP_VERSION"]=> 
    string(5) "0.0.1" 
    ["database"]=> 
    array(3) { 
    ["dsn"]=> 
    string(32) "mysql:host=localhost;dbname=test" 
    ["user"]=> 
    string(4) "root" 
    ["pass"]=> 
    string(0) "" 
    } 
    ["modules"]=> 
    array(0) { 
    } 
} 

Fatal error: Access to undeclared static property: Config::$config["modules"] in C:\xampp\htdocs\project\system\classes\Config.php on line 37 
+0

PHPは 'config [" modules "]'という名前の変数を探しています。それはちょうどそのようには動作しません。 – tkausl

答えて

1

あなたはvariable variables'構文を使用して多次元配列にアクセスすることはできません。 PHPは存在しない$config['modules']という名前のプロパティを検索しています。

foreach($parts as $part) { 
    $path .= '["'.$part.'"]'; 
} 

return static::$$path; 

へ:からあなたConfig::get()方法の最後の部分を変更し

$data = static::$config; 
foreach ($parts as $part) { 
    $data = $data[$part]; 
} 

return $data; 

とあなたが望んでいたようにそれは動作します。しかし、それほど良いアプローチではありません。Symfony's PropertyAccessコンポーネントのような確立されたソリューションを使用するほうがはるかに優れています。

+0

あなたの答えをありがとう、私は今なぜVVの構文と、ループでMD配列にアクセスするいいクリーンな方法では動作しません理解しています! –

+0

問題はありませんが、私はSymfony PropertyAccessコンポーネントに関する小さなコメントで私の答えを更新しました。答えに書いたコードよりもお勧めしたいと思います。 –

関連する問題