php之魔术方法在ThinkPHP框架的应用

  • 1,504
<?php
/***
按以前的做法,把POST来的数据,拼接sql,然后查询
但是在thinkphp中的做法,是把收到的数据,赋值给了一个对象的属性
然后对象->add()方法,就写入到数据库类了,很方便

思考:
1:userModel()就有username属性供你赋值吗
2:如果$userModel->xyz属性是保护的,
而我的表,又有一个字段,恰好叫xxx,那么自然是$user->xyz = $_POST['xyz'];
这不就出错了吗?
3:userModel有一些属性,很正常,比如有5个属性a,b,c,d,e
在注册时,又动态设置了属性f,g,h,i,j
疑问:在拼接sql时,要把a,b,c,d,e忽略掉才行,又怎么忽略

答:用魔术方法解决


通过__set()魔术方法把属性的设置都放到数组里
处理时,专门处理这个属性就可以了
这样,就不会和其他属性相冲突


TP中的一段用户注册代码
$userModel->username = $_POST['username'];
$userModel->email = $_POST['email'];
if ($num = $userModel->table('user')->add()) {
    echo '注册成功';
}else {
    echo 'fail';
}
***/

class UserModel{
    protected $email = 'useremail@163.com';
    protected $data = array();
    public function __set($k,$v){
        $this->data[$k] = $v;//当想设置一个属性时,触发__set(),把属性名和属性值两个参数放到一个数组中 

    }
    public function __get($p){
        return isset($this->data[$p]) ? $this->data[$p] : NUlL;
    }
    public function __unset($p){
        unset($this->data[$p]);
    }
    public function __isset($p){
        return isset($this->data[$p]);
    }
    public function add(){
        $str1 = implode(',',array_keys($this->data));
        $str2 = implode("','",array_values($this->data));
        $sql = "insert into table ($str1) values ('$str2')";
        return $sql;
    }
}
echo '<pre>';
$userModel = new UserModel();
print_r($userModel);


$userModel->username = 'lisi';//设置的username是不存在的
$userModel->email = 'lisi@126.com';//设置的email是保护的
print_r($userModel);

unset($userModel->email);
print_r($userModel);
//echo $usermodel->add();
?>

 

weinxin
我的微信
这是我的微信扫一扫
开拓者博主
  • 本文由 发表于 2016年7月29日19:16:05
  • 转载请务必保留本文链接:https://www.150643.com/300.html
匿名

发表评论

匿名网友 填写信息