Trait 在 PHP 中是什么意思?

“Trait” 是什么意思?

    • PHP 5.4.0 以降で導入されたコードを再利用するための仕組みのことです。

 

    いくつかのメソッド群を異なるクラス階層にある独立したクラスで再利用できるようにします。

与课程的区别

    • Trait の目的はあくまでも機能をまとめるためだけに限定されます。

 

    インスタンスを生成することはできません。

使用的好处

    • 多重継承や Mixin に関連するありがちな問題を回避することができます。

 

    振る舞いを水平方向で構成できるようになります。

优先次序

当前基类的方法 → 特质的方法 → 继承的类的方法

试用一下。

因为简单的例子已经以公式的形式写出来了,所以我在这里只是总结一下当我们尝试保存值时如何对自定义请求进行验证的处理的可能情况。
我使用的框架是laravel5.5。

之前

use Illuminate\Validation\Validator;

class CustomRequest extends BaseRequest
{
    /**
     * @param  Validator  $validator
     */
    public function withValidator(Validator $validator)
    {
        $validator->after(function (Validator $validator) {
            $inputs = $this->validatedValues();

            // このバリデーションをTraitで再利用できるようにしましょう  ---------
            if ($inputs['sample']['hoge']) {
                $validator->errors()->add('hoge', 'error message.');
            }
            // ---------------------------------------------------------
            return $validator->messages()->isEmpty();
        });
    }
}

use Illuminate\Database\Eloquent\Model;

/**
 * Class Sample
 * Sampleテーブルを操作するModelクラスです。
 */
class Sample extends Model
{
    // Eloquent save etc...
}

在这之后

我将在与CustomRequest相同的级别上创建一个Trait。

use Illuminate\Validation\Validator;

/**
 * Trait CustomValidationRule
 */
trait CustomValidationRule
{
    /**
     * @param  Validator  $validator
     * @param  Sample  $sample
     */
    protected function checkHoge(Validator $validator, Sample $sample)
    {
        if ($sample['hoge']) {
            $validator->errors()->add('hoge', 'error message.');
        }
    }
}

use Illuminate\Validation\Validator;

class CustomRequest extends BaseRequest
{
    // 使用したいクラス内で Trait を宣言します
    use CustomValidationRule;

    /**
     * @param  Validator  $validator
     */
    public function withValidator(Validator $validator)
    {
        $validator->after(function (Validator $validator) {
            $inputs = $this->validatedValues();

            // Trait で宣言した関数を呼ぶ ---------------------------------
            $this->checkHoge($validator, (new Sample($inputs['sample'])));
            // ---------------------------------------------------------

            return $validator->messages()->isEmpty();
        });
    }
}

解决冲突

    同じ名前のメンバーを含む複数のトレイトを追加するときには、 衝突を明示的に解決しておかないと fatal エラーが発生するので注意が必要。

【参考: https://www.php.net/manual/zh/language.oop5.traits.php】

广告
将在 10 秒后关闭
bannerAds