使用场景
2023年3月23日...大约 2 分钟
字段封装
在类里面使用 use Accessor
对类的字段属性进行封装,之前设置为 public
权限的全部改为 protected
或 private
。 当属性为对象时,getter
会获取其克隆对象。这样子做是为了避免对象 暴漏出去后,不小心修改值,导致破坏内部封装,增加心智负担。
Accessor
类默认setter
,getter
都启用,如果只需要setter
或者getter
的话,可以再use Setter
或use 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
进行编写注解,第一个参数是变量类型,第二个就是注释。这里面 实现原理是使用类反射获取到相关注释的内容,正则进行匹配相关的值。最后判断这个类型是系统类型还是自定义类,是类的 话就需要读取文件的命名空间,获取到相关对象的命名空间,从而实例化对象。这里面提供了缓存,因为类的改动只会在编写 时经常变动。
请求参数自动数据填充
Laravel
和 Tp
框架现在都支持自定义 Request
对象,所以这里我们可以定义所有的入参对象。然后使用 basic
包的 AutoFillProperties
类就能实现参数自动填充到 Request
对象的类属性中去了。
trait
AutoFillProperties
已使用类属性,使用该类必须避免重写问题。
src/Entity/FrameEntity.php
:
private static array $_filter = [
'_setter',
'_getter',
'_readOnly',
'_params',
'_properties',
'_alias',
'_cache',
'_idx',
];