2011-09-15 10 views
0

.iniファイルを読み込むクラスを作成しようとしています。私が作業しているアプリケーションの名前を指定してから、そのファイルを1つまたは複数のファイルにまとめてロードしてください。それが完了したら、私はちょうどそのように呼びます。新しい値を配列にプッシュする静的クラスロジックのヘルプ

Ini::path(BASE_PATH . "config" . DS); 
Ini::set_app("testApp"); 
Ini::load(array("db", "web", "themer")); 

その後、私はその機能を追加しようとしているので、私は設定されているIni::$appせずに使用することができ、現時点ではこの

echo Ini::$get['testApp']['someKey']['someValue']; 

ようにそれを使用しようとしています。すなわちIni::$get['someKey']['someValue'];

私の問題は、より多くの.iniファイルをIni::$getアレイにプッシュする方法を理解できないことです。使用方法は、私のpushメソッドを呼び出して、配列に新しいファイルをプッシュすると仮定され、この

Ini::push("anotherIni");

のようなものでなければなりません。しかし、私は正しく配列を構築するように見えることはできません。どちらか、または新しい値を静的配列にプッシュすることはできません。 array_pushの試みと

私の配列は、print_r()

Array ([testApp] =>) 

で出力このオンスのようになります。それ以外の場合は、ここで

Array ([testApp] => Array ([db] => [web] => [themer] =>)) 

配列に新しいiniファイルをプッシュしようとしてくれなくて、これを出力し、私でありますクラスファイル(回答を反映するように更新)

class Ini { 

    public static $get = array(); 
    public static $tmp = array(); 
    public static $path; 
    public static $app; 
    public static $push; 

    public static function load($file) 
    { 
     if (is_array($file)) { 

      foreach ($file as $ini) 
       self::$get[self::$app][$ini] = parse_ini_file(self::$path . $ini . ".ini", true); 

      //array_push(self::$get[self::$app], "testIni"); 
     } else { 

      self::$get[self::$app][$file] = parse_ini_file(self::$path . $file . ".ini", true); 
     } 
    } 

    public static function push($file) 
    { 
     self::$tmp[$file] = parse_ini_file(self::$path . $file . ".ini", true); 
     array_push(self::$get[self::$app], self::$tmp[$file]); 
    } 

    public static function set_app($name) 
    { 
     self::$app = $name; 
     self::$get[self::$app] = array(); 
    } 

    public static function path($path) 
    { 
     self::$path = $path; 
     return self::$path; 
    } 

    // TODO: Create 'write', 'delete', 'append' function to change ini values 
} 

答えて

0

を使用し、私はあなたの質問にお答えしますが、あなたのコードにはいくつかの主要な懸念される私見:なぜ

  • は、静的なものはすべて? iniの設定がオブジェクト内にあった方が意味があります。一意性を強制したいのであれば、シングルトンパターンについて読んでください。
  • あなたの$app静的なプロパティの目的はあいまいです。ファイルの読み込みまたは読み込みを行う前に初期化する必要があります。それはほとんど読めません。少なくとも、この属性を直接設定する代わりに、コードsetDefaultApp($appName)を使用すると、コードがより明確になります。後者の構文で

    $a[] = $e; 
    array_push($a, $e); // scarcely used 
    

    $aはアレイ、it won't be initializedなければならない:

  • アレイ$aの終わりに要素$eを追加するための2つの構文があります。代わりの構文を使用してください:

    self::$get[self::$app][] = $file; 
    

    ただし、読みやすいAPIを選択することを強くお勧めします。あなたのecho Ini::$get['testApp']['someKey']['someValue'];に私も、私は(プッシュを使用していませんでしたecho $ini->get('testApp')['someKey']['someValue'];

+0

heh、私は最初の試みに基づいてオブジェクトにしようとしましたが、別のページでこの情報が必要な場合は、新しいオブジェクトを作成してデータをリセットしたくないという問題がありました。私はシングルトンを読んだが、静的なクラスと同じように動作するがコードは少なくて済むことが分かった。 – Eli

+0

PHPについて誤解をお持ちですか? Apache PHPモジュールでは、各Webページは独立しています。変数は要求の終わりに常に削除されます。したがって、あるページでオブジェクトを宣言して別のページで使用することはできません(_page_によって、ユーザー要求に応じて_webページが表示されますが、同じファイルに存在する可能性もあります)。各リクエストでiniファイルを解析しない場合は、APCまたはmemcacheなどのキャッシュを使用する必要があります。 –

1

問題は、この行である:それは最初の引数だとして

array_push(self::$get[self::$app], $file); 

array_push()は、配列を期待しています。私は、PHPファイルへのあなたのクラス貼り付け、コピーし、次のコードを使用:

Ini::$app = 'Some App'; 

Ini::push('something.ini'); 

と「array_push()を期待...」エラーが表示されます。これは、self::$get[self::$app]文字列であり、配列ではないためです。

したがって、配列$getの最初のエントリには、キーがself::$appで、値が空白配列になるように設定する必要があります。このaddtionalの方法は私のためにそれを修正:

public static function set_app_name($name) 
{ 
    self::$app = $name; 
    self::$get[self::$app] = array(); 
} 

はその後

Ini::set_app_name('Some App'); 
+0

屋を好む)まだので、私は前にここにコードを掲示し、それを修正するのを忘れていました。しかし、私は先に進んであなたの例を適用しましたが、私の配列で結果を得られませんでした。私は、更新されたコード – Eli

+0

で私の質問を編集するつもりです。あなたの問題は 'push'メソッドの最初の行にあります(ここでは、iniファイルを解析しています)。 PHPは何のエラーを投げかけていますか? – Alex

+0

エラーがなければ、配列にプッシュされません。私は手動で 'array_push(self :: $ get [self :: $ app]、" testPush ");}を書き出すとプッシュすることができますが、メソッドを呼び出すことではできません。 – Eli

関連する問題