2013-01-04 10 views
16

私は形質があります。創造のために、のは、この形質形質を呼びましょう:PHP型ヒントの特徴

trait Trait{  
    static function treat($instance){  
     // treat that trait instance with care 
    } 
} 

は今、私はまた、ユーザーがこの特性を使用するクラスを持っています。ユーザーのインスタントで治療を呼び出そうとすると、すべてが機能します。しかし、私はタイプヒントする形質を使用して、クラスのインスタンスのみが引数として与えられなければならない、そのように希望:

static function treat(Trait $instance){...} 

悲しいことに、しかし、これは、関数がのインスタンスを期待していたと言う致命的な矢印になりしかし、Userのインスタンスが与えられました。このタイプのヒントは継承と実装には完全に機能しますが、どのようにタイプヒントを作成しますか?

+3

できません。 [マニュアル](http://php.net/manual/en/language.oop5.typehinting.php)には、特にこれが記載されています。 '型ヒントは、intやstringなどのスカラー型では使用できません。形質はどちらも許可されません。 – DaveRandom

+0

DaveRandomは正しいです、形質がインスタンス化されていないので、それらを実装するために 'use'ステートメントを使う必要があります。 – phpisuber01

+1

@DaveRandom私はこれが別のphp 'wtf'だと思うhttp://eval.in/5936なぜクラスとして扱われないのですか?致命的なエラー:クラスHelloを再宣言できません ' – Baba

答えて

11

DaveRandomが言うように、あなたはできません。そして、あなたはすべきではありません。おそらくインターフェイスと型ヒントを実装したいと思うでしょう。その後、そのインタフェースを特性を使って実装することができます。

+7

私はこれに同意しないと言う必要があります。私は、タイプのヒントの特性は非常に便利だろうと思う。抽象メソッドを宣言することができるので、型ヒンティングが許されていれば、a)複数の継承(インタフェースなど)をサポートし、b)実装をサポートする(抽象クラ​​スのように、ヒント)。 PHPはコンパイルされていないので、タイプヒントは抽象化に関する最も優れた部分です。そのため、特性はそれほど有用ではありません。 – Rob

+7

@Rob、これは、メソッドエイリアシング( 'use myTrait {myMethod as newMethod;}')がコリジョンの場合に問題になります。たとえば、クラスmyClassに "myMethod"というメソッドがあり、myTraitがmyClassに追加したい機能を提供しているとします。関数myMethodを別のものにエイリアスすることができます(私の例ではnewMethod)。人Bがそれを見て、私がmyClassでmyTraitを使用しているのを見たら、彼はいくつかのタイプヒント付きのクラスでmyClassを使用できると思っています。しかし、これは真実ではありません。インターフェースの場合、私はmyMethodの意図を同じに保つことを余儀なくされていました。 – Veda

+2

私は、エイリアスの形質を知ることはできませんでした。しかし、いくつかのテストの後、抽象メソッドにエイリアスを付けることはできません。[D](http://en.wikipedia.org/wiki/Dependency_inversion_principle)は抽象化に依存しているため、Bは特性実装に依存すべきではありません。インタフェースや抽象クラスのように抽象メソッドではなく、 – Rob