2010-11-21 4 views
3

私は自分のPHPクラスを作成しています。私は列挙型のように、そのクラスのインスタンスのクラス内で定数参照をしたい。私は2つのエラー取得維持そのクラス内のクラスのインスタンスのconst配列を作成する方法は?

:11行で 1.定数をすることはできません配列 2パースエラーを

は何が問題になっています(下記参照)?私は真剣に配列を持つことはできませんか?私は、Javaの背景から来たんだ...ここ

は私のコードです:

class Suit { 
    const SUIT_NAMES = array("Club", "Diamond", "Heart", "Spade"); 
    const COLOURS = array("red", "black"); 

    const CLUB = new Suit("Club", "black");  // LINE 11 
    const DIAMOND = new Suit("Diamond", "red"); 
    const HEART = new Suit("Heart", "red"); 
    const SPADE = new Suit("Spade", "black"); 

    var $colour = ""; 
    var $name = ""; 

    function __construct($name, $colour) { 
     if (!in_array(self::SUIT_NAMES, $name)) { 
      throw new Exception("Suit Exception: invalid suit name."); 
     } 
     if (!in_array(self::COLOURS, $colour)) { 
      throw new Exception("Suit Exception: invalid colour."); 
     } 
     $this->name = $name; 
     $this->colour = $colour; 
    } 
} 
+0

私も列挙型を欠場in_arrayを持っているということです... – SparK

答えて

4

UPDATE

As of PHP 5.6 it's possible to define a const of type array.

Also as of PHP 7.1 it's possible to define constant visibility (before it would always be public).

ORIGINAL ANSWER

どちら配列もオブジェクトはPHPの定数に割り当てることができます。 documentationは「定数式」でなければならないと言います。彼らがこの用語を定義しているかどうかはわかりませんが、変数、プロパティ、数学演算の結果、または関数呼び出しは除外されています。

arrayは、実際には関数ではありませんが、コンストラクタ呼び出しも許可されていないことは意外ではありません。

おそらくあなたは、以下のような回避策を行う必要があるでしょう。実際の定数の代わりにprivate staticを使用します。これは、手動で再割り当てを避ける必要があることを意味し、必要に応じてゲッタ(getClubなど)を提供する必要があります。また

、あなたがstaticにオブジェクトを割り当てることができず、PHPは静的初期化子を持っていないため、我々はコンストラクタでオンデマンドで初期化します。

無関係な問題は、あなたが後方

class Suit { 
    private static $CLUB, $DIAMOND, $HEART, $SPADE; 
    private static $SUIT_NAMES = array("Club", "Diamond", "Heart", "Spade"); 
    private static $COLOURS = array("red", "black"); 

    private static $initialized = false; 

    function __construct($name, $colour) { 
     if(!self::$initialized) 
     { 
      self::$CLUB = new Suit("Club", "black"); 
      self::$DIAMOND = new Suit("Diamond", "red"); 
      self::$HEART = new Suit("Heart", "red"); 
      self::$SPADE = new Suit("Spade", "black"); 
      self::$initialized = true; 
     } 

     if (!in_array($name, self::$SUIT_NAMES)) { 
      throw new Exception("Suit Exception: invalid suit name."); 
     } 
     if (!in_array($colour, self::$COLOURS)) { 
      throw new Exception("Suit Exception: invalid colour."); 
     } 
     $this->name = $name; 
     $this->colour = $colour; 
    } 
} 
+0

は仕事があっまわりますか?私のプログラムは、これがなくてはむしろ難しいでしょう:Xそして、他の方法でそれをするのは私には意味がありません...静的についてはどうですか?同じ取引ですか? – Lindz

+0

よろしくお願いします。 :) – Lindz

関連する問題