在PHP中更改父属性的值

时间:2019-06-11 04:37:34

标签: php laravel oop inheritance static

我有一个带有一些默认属性的父类。在子类中,我想直接更新这些属性,而不使用方法。为什么?我相信这是在子类中定义功能的一种干净方法。

所以这是我的父母班:

<?php 

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class BaseFormRequest extends FormRequest 
{
    protected static $NEEDS_AUTHORIZATION = false;
    protected static $FORM_RULES          = [];

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize() : bool
    {
        //dd($this->authorize);
        return self::$NEEDS_AUTHORIZATION;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules() : array
    {
        return self::$FORM_RULES;
    }
}

在我的孩子班上,我想做些类似的事情:

<?php

namespace App\Http\Requests;

use App\Http\Requests\BaseFormRequest;

class RegisterUserRequest extends BaseFormRequest
{

    protected static $NEEDS_AUTHORIZATION = true;
    protected static $FORM_RULES = [ /* specific form rules for this form */];
}

我不知道这是否是正确的方法。我的问题是我是否可以做类似的事情?如果我有5个扩展 BaseFormRequest 的表单请求类,则只需要覆盖 NEEDS_AUTHORIZATION FORM_RULES ,这比创建相同的方法干净得多(authorize()rules())在每个课程中反复出现。

2 个答案:

答案 0 :(得分:1)

您可以做到。如果它现在对您不起作用,那是因为您没有利用late static binding

基本上,在您的方法rules()authorize()中,您引用的是self,而您应该引用static,以使其按预期工作

例如:

public function rules() : array {
   return static::$FORM_RULES;
}

您可以看到here

的工作示例

答案 1 :(得分:-1)

您可以出于自己的目的使用构造函数。

<?php

namespace App\Http\Requests;

use App\Http\Requests\BaseFormRequest;

class RegisterUserRequest extends BaseFormRequest
{

    public function __construct()
    {
        parent::__construct();
        BaseFormRequest::NEEDS_AUTHORIZATION = true;
        BaseFormRequest::FORM_RULES = [ /* specific form rules for this form */];
    }
}