【问题标题】:Change Value of Parent Property in PHP在 PHP 中更改父属性的值
【发布时间】:2019-10-25 10:54:29
【问题描述】:

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

这是我的父类:

<?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_AUTHORIZATIONFORM_RULES,这看起来比创建相同的方法要干净得多(authorize()rules())在每节课上一遍又一遍。

【问题讨论】:

    标签: php laravel oop inheritance static


    【解决方案1】:

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

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

    例如:

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

    你可以看到这个工作的例子here

    【讨论】:

    • 有效!太棒了:) 问题:我正在尝试做的事情是保持代码清洁的好方法吗?还是您认为设计上有问题?
    • 在不了解您的整个系统的情况下无法判断。最后是选择和风格的问题。乍一看,我不喜欢它。但我想它可能有用途。找到正确的方法是您需要通过额外研究自行完成的事情。
    【解决方案2】:

    您可以将构造函数用于您的目的。

    <?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 */];
        }
    }
    

    【讨论】:

    • 我知道这一点。问题的重点是我只想设置两个属性的值,而不是使用方法,任何方法。它可以以某种方式完成吗?还是我该死的使用一种方法来做到这一点?
    猜你喜欢
    • 2020-11-24
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2020-01-26
    相关资源
    最近更新 更多