構成保管メカニズムにアクセスする必要があるが、フレームワークのアーキテクチャーのために基本クラスから拡張することができない複数のクラスが存在する状況を考えてみましょう。 それに加えて、ストレージ機構を柔軟に保つために(後でストレージバックエンドを切り替えることができるようにする)必要がありました。クラス外の形質から静的関数を呼び出すことはできますか?
私はそれが実際の保存を行い形質を作成し、(私は、ストレージシステムとして$_SESSION
を使用するなど)すべてのクラス内でこれらの機能を使用するように理にかなって感じた:
trait MyTrait {
function setting_enabled() {
return !empty($_SESSION['setting']) ? TRUE : FALSE;
}
function enable_setting() {
$_SESSION['setting'] = TRUE;
}
function disable_setting() {
$_SESSION['setting'] = FALSE;
}
}
これは、クラスから素晴らしい作品。しかし、クラスではないファイルもありますが、単なるPHPです。設定が有効かどうかを知る必要があります。私はstatic
として関数を宣言しようとしている
:
trait MyTrait {
static function setting_enabled() { // Declared as static function
return !empty($_SESSION['setting']) ? TRUE : FALSE;
}
...
}
そしてがうまく働いた特性から、静的関数を呼び出します。
if (MyTrait::setting_enabled()) {
...
}
しかし、それはまったく正しいとは感じません。一方、その特性を使用する新しい空のクラスを作成し、それをインスタンス化して値を取得することは、オーバーヘッドのように思えます。
私はこれを可能にしました(PHP 5.6以降、PHP 7.xの将来も考慮しています)。
これはクラスでうまく動作します。そして、私は実際にその特性を使用するクラスをインスタンス化することができました。実際の質問は、クラスの外で 'MyTrait :: setting_enabled()'を使用することが許されているかどうかです。それはうまくいきますが、これがバグか機能かどうかのドキュメントは見つかりませんでした。 – Neograph734
私はバグではないと思います。 [php.net](http://php.net/manual/en/language.oop5.traits.php)の「A特性」の定義は、クラスに似ていますが、ファイングで機能をグループ化することのみを目的としています一貫性のある方法で」 形質をインスタンス化することはできませんが、他のすべての機能ではclassと似ているため、他のすべてのアクションを処理する必要があります。 もう一度、コーナーのアイデア。あるクラスのコードをコピーして別のクラスに貼り付けることができれば、その形質の候補があります。 –
ありがとう、私はそれが使用するには保存されていると思います。 – Neograph734