私は現在、形質自動初期化に取り組んでいますが、そのすべてがうまく機能していますが、悲しいことに、悲しいことにいくつかの形質には厳しい制限があります。私が出くわした次の順番で形質依存の読み込み
1つの問題は、次のとおりです。
私はそうのような正しい順序で使用する定義する必要があります動作するように私のオートローディングシステムの今trait constructor{}
trait cache{}
trait database{}
trait settings{} # requires database or cache.
:私が希望した場合
class t{
use constructor, cache, settings;
}
を次の操作を行います。
class t{
use constructor, settings, cache;
}
設定初期設定は、キャッシュの初期化前に呼び出されますキャッシュの特性内の$cache
変数がヌルです。
ここで、簡単な解決策は、設定特性にuse cache, database;
を追加することですが、含める必要がある別の特性によって使用される場合、定義されたメソッドが衝突する可能性があります。
もう1つの解決策は、プロパティー$cache
が定義されているかどうかをチェックして、それが設定されているかどうかを確認することですが、これは冗長なコードをたくさん作成することになります。
今のコードのロジックは以下の通りです:
trait constructor{
function init(){
echo 'I am called first';
print_r(class_uses(self::class))/*[
'constructor' => 'constructor',
'cache' => 'cache',
'database' => 'database',
'settings' => 'settings'
// Sorted in sequence as defined in the class.
]*/
# now call other trait initializers.
}
}
trait settings{
function settings(){
echo 'I am called last, but before __construct()';
}
}
class t{
use constructor; // required by all traits
use cache; // requires constructor.
use database; // requires constructor.
use settings; // requires constructor, cache || database.
function __construct(){
echo 'I am called after init()';
$this->db->prepare(...)->execute();
}
}
それは設定がキャッシュまたはデータベースの後にインデックス化されていることを確認するために配列をソートすることができ、コンストラクタです。しかしここでは、これを行うにはのアプローチは何ですか?トリッキーな部分が来る?
ほとんどのクラスは少数の形質しか使用しないため、並べ替えのベースとして使用する長い配列を定義するのが不十分なようです。このシステムはCMSのコアで動作しているので、私はむしろ形質に基づいて特性を並べ替えたいと思っています。
特色の問題は、同じことを2回も定義することができないことです。つまり、クラスにもnoorがあるため、スコープの汚染を最小限に抑えたいと思います。
興味深い。私たちは、特性(および/またはそれらをロードするクライアントクラス)との依存関係の問題を抱えており、その使用を控え、代わりに依存性を注入できる適切なクラスを使用することに決めました。しかし、場合によってはこれは良い解決策よりも悪いことではありません。ちょうどあなたが対象としているのは、どのPHPバージョンですか?私は、5.4と5.6との間、そして多分5と7の間でいくつかの変更があったので尋ねます。 –
私は現在PHP 7のために特別に書き直していますが、この魔法を実現するために使われたコードは5.4と非常によく似ています。 – Xorifelse