0

AppModelでいくつかのステータス定数を定義して、すべてのモデルで使用できるようにしようとしています。それらの文字列値を取得するには、それらを配列に格納したいのですが、文字列を国際化しようとすると、次のエラーが発生します。

致命的なエラー:181行目の/home/dev/www/test/lib/Cake/Utility/ClassRegistry.phpにある未定義の関数AppModel()を呼び出す

私のコード:

class AppModel extends Model {
    const STATUS_INACTIVE = 0;
    const STATUS_ACTIVE = 1;
    public $statuses = array(
        self::STATUS_INACTIVE => __('Inactive'),
        self::STATUS_ACTIVE => __('Active')
    );
}

コアを調べたところ、次の行でエラーが発生していることがわかりました。

$instance = new $appModel($settings);

$ appModel($ settings)ステートメントが原因で、デバッグしようとしましたが、同じエラーが発生しました。これを解決するために正しい方向に向かうための助けやアイデアはありがたいです。

4

1 に答える 1

0

PHPでそのような$statusesを定義することはできないと思います。問題は、関数の結果を使用してクラスプロパティを定義できないことです。

http://www.php.net/manual/en/language.oop5.properties.php

クラスメンバー変数は「プロパティ」と呼ばれます。「属性」や「フィールド」などの他の用語を使用して参照されている場合もありますが、この参照では「プロパティ」を使用します。これらは、キーワードpublic、protected、またはprivateのいずれかを使用し、その後に通常の変数宣言を使用して定義されます。この宣言には初期化が含まれる場合がありますが、この初期化は定数値である必要があります。つまり、コンパイル時に評価でき、評価するために実行時情報に依存してはなりません。

翻訳されたラベルを使用してプロパティを設定する場合は、オブジェクトの初期化を目的としたコンストラクターにプロパティを移動します。

class AppModel extends Model {
    const STATUS_INACTIVE = 0;
    const STATUS_ACTIVE = 1;
    public $statuses;

    public function __construct($id = false, $table = null, $ds = null) {
        parent::__construct($id, $table, $ds);
        $this->statuses = array(
            self::STATUS_INACTIVE => __('Inactive'),
            self::STATUS_ACTIVE => __('Active')
        );
    }
}

または、別のメソッドに移動して、このように実際に使用した場合にのみ生成されるようにします。

public function getStatusOptions()
{
   return array(
        self::STATUS_INACTIVE => __('Inactive'),
        self::STATUS_ACTIVE => __('Active')
   );
}

別の注意点; クラス定数を定義し、AppModelに追加せずに再利用できるようにするための優れたトリックは、インターフェイスを使用することです。

interface ActiveInactive {
    const STATUS_INACTIVE = 0;
    const STATUS_ACTIVE = 1;
}


interface FooBar {
     const HELLO = 'world';
}


class MyModel extends AppModel implements ActiveInactive, FooBar {

    public function test()
    {
        echo self::STATUS_INACTIVE;  // outputs '1'
        echo self::HELLO;            // outputs 'world'
    }

}

 class MyHelper extends Helper implements ActiveInactive, FooBar {

    public function test()
    {
        echo self::STATUS_INACTIVE;  // outputs '1'
        echo self::HELLO;            // outputs 'world'
    }

}

このようにして、これらの定数をどこでも再利用できます。ヘルパー、モデル、コントローラーで。そして、あなたはそれらの定数を「組み合わせる」ことができます:)

于 2013-03-07T22:03:39.793 に答える