2017-02-05 14 views
1

構成保管メカニズムにアクセスする必要があるが、フレームワークのアーキテクチャーのために基本クラスから拡張することができない複数のクラスが存在する状況を考えてみましょう。 それに加えて、ストレージ機構を柔軟に保つために(後でストレージバックエンドを切り替えることができるようにする)必要がありました。クラス外の形質から静的関数を呼び出すことはできますか?

私はそれが実際の保存を行い形質を作成し、(私は、ストレージシステムとして$_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の将来も考慮しています)。

答えて

0

もしあなたが特質を持っているなら、あなたは多分複数のクラスのために多分継承をすることにしました。それ以外の場合は、冗長宣言であり、クラスを使用する必要があります。実際には、形質の存在はその使用を意味します。

特性の中に静的関数がある場合、その特性を実装したクラスの関数を使用できないのはなぜですか?

trait MyTrait { 
static myFunc() {} 
} 

class ThatUsingMyTrait { 
use MyTrait; 
} 

// pretend below a code where you want to use the trait. 
if(ThatUsingMyTrait::myFunc()) { 
// do something 
} 

また、このコードは、特性がなくても実装したいクラスである可能性があります。

私は考えを理解しています。

+0

これはクラスでうまく動作します。そして、私は実際にその特性を使用するクラスをインスタンス化することができました。実際の質問は、クラスの外で 'MyTrait :: setting_enabled()'を使用することが許されているかどうかです。それはうまくいきますが、これがバグか機能かどうかのドキュメントは見つかりませんでした。 – Neograph734

+0

私はバグではないと思います。 [php.net](http://php.net/manual/en/language.oop5.traits.php)の「A特性」の定義は、クラスに似ていますが、ファイングで機能をグループ化することのみを目的としています一貫性のある方法で」 形質をインスタンス化することはできませんが、他のすべての機能ではclassと似ているため、他のすべてのアクションを処理する必要があります。 もう一度、コーナーのアイデア。あるクラスのコードをコピーして別のクラスに貼り付けることができれば、その形質の候補があります。 –

+0

ありがとう、私はそれが使用するには保存されていると思います。 – Neograph734

関連する問題