php 如何自动创建对象,thinkphp自动创建数据对象分析

thinkphp有一个自动创建数据对象的create方法,核心代码如下

public function create($data='',$type='') {

// 如果没有传值默认取POST数据

if(empty($data)) {

$data = I('post.');

}elseif(is_object($data)){

$data = get_object_vars($data);

}

// 判断是否有主键,有代表修改,没有代表插入

$type = $type?:(!empty($data[$this->getPk()])?self::MODEL_UPDATE:self::MODEL_INSERT);

// 生成数据对象,先获取该模型所有的字段$fields,过滤掉$data中不在field数据中的字段(最后剩下表中存在的字段)

if($this->autoCheckFields) { // 开启字段检测 则过滤非法字段数据

$fields = $this->getDbFields();

foreach ($data as $key=>$val){

if(!in_array($key,$fields)) {

unset($data[$key]);

}elseif(MAGIC_QUOTES_GPC && is_string($val)){

$data[$key] = stripslashes($val);

}

}

}

$this->data = $data;

return $data;

}

其中$this->getDbFields方法如下,该方法返回对应表字段名组成的索引数组

/**

* 获取数据表字段信息

* @access public

* @return array

*/

public function getDbFields(){

if(isset($this->options['table'])) {// 动态指定表名

$array = explode(' ',$this->options['table']);

$fields = $this->db->getFields($array[0]);

return $fields?array_keys($fields):false;

}

if($this->fields) {

$fields = $this->fields;

unset($fields['_type'],$fields['_pk']);

return $fields;

}

return false;

}

$this->db->getFields方法如下,该方法返回对应表的字段详细信息

public function getFields($tableName) {

$result = $this->query('SHOW COLUMNS FROM '.$this->parseKey($tableName));

$info = array();

if($result) {

foreach ($result as $key => $val) {

$info[$val['Field']] = array(

'name' => $val['Field'],

'type' => $val['Type'],

'notnull' => (bool) (strtoupper($val['Null']) === 'NO'), // not null is empty, null is yes

'default' => $val['Default'],

'primary' => (strtolower($val['Key']) == 'pri'),

'autoinc' => (strtolower($val['Extra']) == 'auto_increment'),

);

}

}

return $info;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值