web-dev-qa-db-ja.com

PHP:クラス定義内で 'use'

最近、クラス定義内でuseステートメントを使用するクラスに出会いました。

私はそれについての情報を見つけることができないので、誰かがそれが正確に何をするのか説明できますか?.

私はそれが特定のファイルのグローバルスコープからそれを遠ざける方法かもしれないことを理解していますが、おそらくそれはおそらく複数の親クラスから継承する特定のクラスを許可します-extendsは1つの親クラス参照のみを許可するため?

私が見た例は、Laravelの最初のインストールのユーザーモデルにありました:

<?php

use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;

class User extends Eloquent implements UserInterface, RemindableInterface {

    use UserTrait, RemindableTrait;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = array('password', 'remember_token');

}

UserTraitクラスに含まれるメソッドを実際に使用するこのモデルの例をいくつか見てきました。そのため、疑いがありますが、囲まれたuseステートメントの意味についてもっと知りたいと思います。

PHPドキュメント 言います:

Useキーワードは、ファイルの最も外側のスコープ(グローバルスコープ)または名前空間宣言内で宣言する必要があります。これは、インポートが実行時ではなくコンパイル時に行われるため、ブロックスコープにできないためです。次の例は、useキーワードの不正使用を示しています。

次に例を示します。

namespace Languages;

class Greenlandic
{
    use Languages\Danish;

    ...
}

これは、useキーワードの誤った使用であることを示します-手がかりはありますか?

50

それらはTraitsと呼ばれ、PHP 5.4以降で利用可能です。それらはuseキーワードを使用して別のクラスまたは名前空間にインポートされます。これは、PHP 5.0通常のクラスから別のクラスへ。それらは単一の継承です。特性の実装の主な理由は、単一継承の制限によるものです。

詳細については、 PHP trait manual を参照してください。

36
Sagar Rabadiya