[ThinkPHP]Model中前后置方法实现原理

前几天一朋友问我TP里Model类的前后置方法的实现,语言上的表达总是不尽人意,直接上例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class A {
public function testA() {
$res = $this->_before_testA();
return $res;
}
protected function _before_testA(){
}
}
class B extends A {
public function testB() {
return 'bbb';
}
}
class C extends B{
protected function _before_testA(){
return 'ccc';
}
public function executeTestA(){
return $this->a();
}
}
$classC = new C();
var_dump($classC->executeA());

再看下tp里Model类的代码,就不点自明了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public function add($data='',$options=array()) {
//数据验证及处理
if(false === $this->_before_insert($data,$options)) {
return false;
}
$result = $this->db->insert($data,$options);
if(false !== $result ) {
$insertId = $this->getLastInsID();
if($insertId) {
$data[$this->getPk()] = $insertId;
$this->_after_insert($data,$options);
return $insertId;
}
}
return $result;
}
protected function _before_insert(&$data,$options) {}
protected function _after_insert($data,$options) {}

add方法为public可供外部调用,前后置方法为protected起到很好的访问控制。

另外一点值得提一下的是protected在php里的访问范围是当前类及其父类和子类。如果是孙子辈的话,就没法继承。

但是这里的前后置方法主要是供继承类重写,不管是子类、孙子类、还是……,因为可以继承public方法,调用的时候,就是调用自身重写的前后置方法。

坚持原创技术分享,您的支持将鼓励我继续创作!