2011-02-02 14 views
0

私は自分のクラスの外にある設定データを持つ配列を持っていて、非常に頻繁にクラス内のこの配列の値を必要とします。私のクラスでこの値を取得する最もクリーンな方法は何ですか?私のすべてのクラスで設定変数を取得する方法は?

<? 

$config["deco"] = "dark"; 

class Car { 

    private $color; 

    public function getColor() { 
     return $this->color; 
    } 

    public function setColor($color) { 
     $this->color = $config["deco"].' '.$color; 
     // here I need a value from $config 
    } 

    public function __toString() { 
     return "My car is ".$this->getColor()."\n"; 
    } 

} 

$car = new Car(); 
$car->setColor("blue"); 
echo $car; // "My car is dark blue"; 
+0

あなたのクラスはそのままです。あなたのUseCaseについて説明して、$ config配列の例とそのクラスでの操作方法を教えてください。 – Gordon

+0

そこに定義されたクラスの外にある$ configが必要なsetColor()にコメントがあります。 – bees

+0

'define()'を見ましたか? –

答えて

2

これはあなたの探しているものですか?

$config = array('deco' => 'foo', … 

$car = new Car(); 

$car->setColor($config['deco'] . 'blue'); 
echo $car; // My car is fooblue 

class Car { 
    private $color; 

    public function getColor() { 
     return $this->color; 
    } 

    public function setColor($color) { 
     $this->color = $color; 
    } 

    public function __toString() { 
     return "My car is ".$this->getColor()."\n"; 
    } 

} 
+0

おかげで申し訳ありませんが、私の愚かな質問を更新しました:) – bees

1

これには2つの方法 - あなたが設定必要機能でグローバルキーワードを使用することができます。

public function setColor($color) { 
    global $config; 

    $this->color = $config["deco"].' '.$color; 
    // here I need a value from $config 
} 

それとも、私の好ましい方法は、クラスのように設定を持つことです私は実際のiniタイプのファイルで私の設定のすべてを持っている

$config["deco"] = "dark"; 
class Config 
{ 
    static $values = array(
    "deco" => "dark", 
); 

    public static function get($name) 
    { 
    if (isset(self::$values[$name])) { 
     return self::$values[$name]; 
    } 
    return null; 
    } 
} 

class Car { 

    private $color; 

    public function getColor() { 
     return $this->color; 
    } 

    public function setColor($color) { 
     $this->color = Config::get("deco").' '.$color; 
     // here I need a value from $config 
    } 

    public function __toString() { 
     return "My car is ".$this->getColor()."\n"; 
    } 

} 

- とConfigクラスは、その後、上記のようにアクセスされるデータの配列を構築するためにそのiniファイルを解析します...しかし、私:値は静的にご利用いただけますl読者への課題として

+0

'global'キーワードを使用するとカプセル化が解除され、グローバルスコープに結合されます。静的クラスを使用すると、同じことが行われ、Configクラスへの依存関係がCarにハードコードされます。これは保守可能ではなく、テストするのは難しいです。 – Gordon

+0

グローバルではありませんが、静的なアイデアは素晴らしいです! – bees

+0

@bees静的なクラスは**実用的な目的のためにはグローバルと同じ – Gordon

0
+0

依存性注入は[@Phill suggested](http://stackoverflow.com/questions/4880506/how-to-get-a-config-variable -in-all-my-classes/4880658#4880658) – Gordon

+0

そしてその質問に対する答えとして、依存性注入にはそれ自身の問題がないわけではありません – HorusKol

+0

@Horusすべての提案された解決策は「自分の問題」を持っていますが、DIは解決策を最小限に抑えます。 – Gordon

0

あなたの設定オプションは、アプリケーション全体でユニークであることを行っている依存関係インジェクションであるので、同様の質問を見つけたこと軒しかないはずそれらのコピーをどこかに置いてください。

$configの配列をグローバルなスコープに含むファイルをどこにも含めている場合、クラス内で最も汚い(そして最も速く)取得する方法は、$GLOBALS['config']["deco"]を使用することです。

あなたは、クラス内のコンフィギュレーション値をカプセル化することがより便利かもしれませんが、静的変数として:あなたはConfig::$config['deco']としてアクセス、またはその後

class Config { 

    public static $config = array(
     'deco' => 'dark' 
    ) ; 

} 

シングルトンクラスとして:

class Config { 

    private static $_instance = null ; 

    public $config = array(
     'deco' => 'dark' 
    ) ; 

    public static function getInstance() { 

     if (self::$_instance == null || !self::$_instance instanceOf Config) { 
      self::$_instance = new Config() ; 
     } 

     return self::$_instance ; 
    } 

} 
あなたはそれらの方法はあなたにfunctionali上に構築するための柔軟性を与える Config::getInstance()->config["deco"]

両方を使用したい

設定値を取得し、保存し、キャッシングするために、また、アクセスしようとしたときに設定値が実際に存在するかどうかを確認し、デフォルト値などを返すことによって防御的なコーディングを行うことができます。短く

+0

シングルトンはPHPでは使用できません。オブジェクトが共有メモリーに存在するアプリケーション・サーバーはなく、インスタンスが1つだけであることを確認したい場合は、2つ目のインスタンスをインスタンス化しないでください。 – Gordon

+1

@Gordon絶対に、それはあなたのパフォーマンスの向上はありませんが、それはあまりにも面倒なく同じ要求内で使用するためのインスタンスを単一の場所に格納します。しかし、私はあなたの要点を見て、この機会にDependency Injectionの詳細を読むのを延期するのをやめようとしています。 – Fanis

+0

それは精神です! :)興味がある場合は、最近http://gooh.posterous.com/singletons-in-phpでシングルトンの無用さに関するブログ記事を書いています。 – Gordon

関連する問題