私は、PHP=でトレイトを使用することにかなり慣れていません。トレイトを含むクラスが特定のプロパティを持っていることを確認する方法があるかどうか疑問に思っています。
次のようなものを使用して、usingクラスに特定のメソッドがあることを確認できることを知っています。
protected abstract function some_function();
トレイトが使用中のクラスのメンバー変数にアクセスできるので、メンバー変数に対して同じ種類のことをする方法はありますか?
要件を文書化することもできますが、トレイトを使用しようとするクラスに必要なプロパティがない場合に例外をスローすると便利です。
私が見つけることができる最も近いのは、変数を取得してそれを返そうとするトレイト内の関数を作成することです。見つからない場合は例外をスローします。次に、トレイトのメソッドは、直接アクセスする代わりに、それを使用して親クラスプロパティにアクセスできます。
考え、提案、および推奨事項を歓迎します...私は特性に慣れているだけなので。
ユースケースは、サイトのパブリックフェースでのみ実行される特定のものと、サイトのプライベートフェースでのみ実行される特定の他のものがありますが、どちらも基本機能の共通セット(さまざまな構成設定、エラー処理)を共有します。 、など)。
継承された各クラスのクラスファイルを非常に長くすることで、特性の使用を回避できますが、可能であれば、同じような機能を小さなファイルにまとめるようにしています。
必要なプロパティを返すために、呼び出し側のクラスにアクセサ変数を必要とする可能性が1つあると思います。
abstract function get_my_value();
きれいに動作する可能性のある他に何かありますか?
前もって感謝します!
これを行うために私が見つけた最良の方法は次のとおりです:
class This_Is_My_Class {
use My_Trait;
protected $prefix = '';
function __construct() {
$this->prefix = 'not_empty';
}
protected function get_prefix() {
if ( empty($this->prefix) ) {
throw new Exception("Prefix must be non empty.");
}
return $this->prefix;
}
... rest of class here
}
trait My_Trait {
abstract protected function get_prefix();
protected function do_whatever() {
$prefix = $this->get_prefix();
... do stuff
}
}
これで、トレイトを使用するときに、それを使用するクラスがget_prefix関数を欠いている場合(抽象宣言のため)または接頭辞を使用しようとしたときに(親の例外のため)、トレイトを使用して例外を適切に取得します。クラス)。
もちろん、トレイトを使用するクラスに特定のプロパティがあることを強制するためのより明確なソリューションがある場合は、ぜひ聞いてみたいと思います。
私が思う最良の方法
trait ProductTrait
{
final private function getTable() {
if ( empty($this->table_product) ) {
throw new \Exception('$table_product must be defined in '. __CLASS__);
}
return $this->table_product;
}
//From here, just use $this->getTable() instead of $this->table_product
}
このトレイトを使用するクラスにtable_productプロパティがない場合、例外が発生します。それを検出するために、そのクラス(および他のクラス)には何も必要ありません:)