跳至主要內容

使用场景

dengmf2023年3月23日...大约 2 分钟

字段封装

在类里面使用 use Accessor 对类的字段属性进行封装,之前设置为 public 权限的全部改为 protectedprivate。 当属性为对象时,getter 会获取其克隆对象。这样子做是为了避免对象 暴漏出去后,不小心修改值,导致破坏内部封装,增加心智负担。

Accessor 类默认 setter, getter 都启用,如果只需要 setter 或者 getter 的话,可以再 use Setteruse Getter

bad

$cat->speak;

better

$cat->getSpeak();
$cat->setSpeak($val);

面向对象三大特性之一封装,即隐藏对象内部数据的能力。如果都是公共属性的话, 就会造成该对象没有任何限制的进行获取和修改属性数据,导致后续维护变得复杂。

注解使用

class Cat
{
    use AutoFillProperties;

    /**
     * @var string
     */
    public $eyes;

    /**
     * @var Eat
     */
    public $eat;

    /**
     * @var Speak
     */
    public $speak;

    /**
     * @var string[]
     */
    public $hair;
}

引入 AutoFillProperties 类,然后使用 @var 进行编写注解,第一个参数是变量类型,第二个就是注释。这里面 实现原理是使用类反射获取到相关注释的内容,正则进行匹配相关的值。最后判断这个类型是系统类型还是自定义类,是类的 话就需要读取文件的命名空间,获取到相关对象的命名空间,从而实例化对象。这里面提供了缓存,因为类的改动只会在编写 时经常变动。

请求参数自动数据填充

LaravelTp 框架现在都支持自定义 Request 对象,所以这里我们可以定义所有的入参对象。然后使用 basic 包的 AutoFillProperties 类就能实现参数自动填充到 Request 对象的类属性中去了。

trait AutoFillProperties 已使用类属性,使用该类必须避免重写问题。

src/Entity/FrameEntity.php:

    private static array $_filter = [
        '_setter',
        '_getter',
        '_readOnly',
        '_params',
        '_properties',
        '_alias',
        '_cache',
        '_idx',
    ];