今天在使用tp开发的过程中碰到这样一个需求,很多模型有共有的属性,例如:一些表单字段的自动验证,这些表单不止在单个模块中出现,其他模块也很常见。能不能在一个model的基类中写这些共有字段的验证,然后不同的模型再自己去扩充呢?
经过尝试,找到下面的解决方法,demo示例如下:
<?php
class A
{
protected $arr = ['11','22','33'];
}
class B extends A
{
//protected $arr;
public function __construct()
{
$this->arr = array_merge($this->arr, ['aa','bb','cc']);
}
public function test()
{
print_r($this->arr);
}
}
$b = new B();
$b->test();
//结果
Array
(
[0] => 11
[1] => 22
[2] => 33
[3] => aa
[4] => bb
[5] => cc
)
B类继承了A类,在B类的构造函数中调用了类属性$arr
,这时会访问到A类中的$arr
属性值,然后再使用array_merge
函数,合并父类属性和子类中新的属性,再赋给子类的$arr
属性。
注意:虽然一般而言,访问类属性时需要在提前声明,但是在这里的B类中不能声明,因为声明之后,在构造函数中调用的就是子类的属性了。