龙空技术网

「PHP」动手创建自己第一个MVC框架项目「三」-中级篇(完)

秋名山吴师傅 82

前言:

此时朋友们对“mvc框架php”大体比较重视,看官们都需要剖析一些“mvc框架php”的相关知识。那么小编同时在网络上收集了一些有关“mvc框架php””的相关内容,希望咱们能喜欢,小伙伴们快快来学习一下吧!

[ORM篇]

什么是ORM,百度的解释:

对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换[1] 。从效果上说,它其实是创建了一个可在编程语言里使用的—“虚拟对象数据库”。

说了一大堆,不懂。简单来如果用在我们数据库呢就是,让Model(数据库所有的操作对象)与数据表产生对应关系(关联)的一种方法,或者说一种思想,比如你来了个User.php就是对User表的操作

我们现在开始吧,首先我们更改原本的文件路径,把Home、Back里面的Model抽出来,放到App下取名为Entity,以后这个Entity就是我们的Model目录,意思就是Model不分前后台,区别只要同一个Model区分不同的方法名即可。

Entity就是实体的意思。现在开始创建父类模型,Core/Orm.php。 我们实现类名与表名的对应关系的方法是通过父类Orm.php在其构造方法里获取有谁继承了的类名,PHP自带了一个方法可以获取继承类的类名——

get_called_class(); //App\Entity\Users

这样就获取了包含命名空间的类名,现在我们要处理这个包含命名空间的类名,让其仅仅剩下Users

<?php/** * * Orm.php * User: kalvin * Date: 2018/2/1 * Time: 下午3:02 */namespace Core;/** * Class Orm * @package Core * ORM 父类方法 */class Orm{    private $className;    private $server;    private $type;    private $username;    private $password;    private $port;    private $dbname;    private $charset;    private $_pdo;    public function __construct()    {        $holeClassName=get_called_class(); //App\Entity\Users        $arr=explode('\\',$holeClassName);        $this->className=strtolower($arr[count($arr)-1]);        //根据配置文件项连接数据库        $this->server=$GLOBALS['conf']['mysql']['server'];        $this->type=$GLOBALS['conf']['mysql']['type'];        $this->username=$GLOBALS['conf']['mysql']['username'];        $this->password=$GLOBALS['conf']['mysql']['password'];        $this->port=$GLOBALS['conf']['mysql']['port'];        $this->dbname=$GLOBALS['conf']['mysql']['dbname'];        $this->charset=$GLOBALS['conf']['mysql']['charset'];        $this->connect();    }    public function connect(){        $dsn="$this->type:host=$this->server;dbname=$this->dbname;port=$this->port;charset=$this->charset";        $this->_pdo=new \PDO($dsn,$this->username,$this->password);    }}

这样就能连接了,现在我们只要把上面私有化的变量拼接到sql语句中即可

<?php/** * * Orm.php * User: kalvin * Date: 2018/2/1 * Time: 下午3:02 */namespace Core;/** * Class Orm * @package Core * ORM 父类方法 */class Orm{    private $className;    private $server;    private $type;    private $username;    private $password;    private $port;    private $dbname;    private $charset;    private $_pdo;    public function __construct()    {        $holeClassName=get_called_class(); //App\Entity\Users        $arr=explode('\\',$holeClassName);        $this->className=strtolower($arr[count($arr)-1]);        //根据配置文件项连接数据库        $this->server=$GLOBALS['conf']['mysql']['server'];        $this->type=$GLOBALS['conf']['mysql']['type'];        $this->username=$GLOBALS['conf']['mysql']['username'];        $this->password=$GLOBALS['conf']['mysql']['password'];        $this->port=$GLOBALS['conf']['mysql']['port'];        $this->dbname=$GLOBALS['conf']['mysql']['dbname'];        $this->charset=$GLOBALS['conf']['mysql']['charset'];        $this->connect();    }    public function connect(){        $dsn="$this->type:host=$this->server;dbname=$this->dbname;port=$this->port;charset=$this->charset";        $this->_pdo=new \PDO($dsn,$this->username,$this->password);        $this->_pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);    }    public function select()    {        $sql='select * from '.$this->className;        $res=$this->query($sql);        return $res->fetchAll(\PDO::FETCH_ASSOC);    }    public function query($sql)    {        try{            $resObj=$this->_pdo->query($sql);        }catch (\PDOException $e){           $resObj=$this->errors($e,$sql);        }        return $resObj;    }    public function errors($e,$sql)    {        echo '错误信息为:'.$e->getMessage().'<br/>';//        echo '错误代码为:'.$e->errorCode() ().'<br/>';        echo '错误语句为:'.$sql.'<br/>';        return false;    }}

上面的select方法就是拼接了继承的类名的方法

[连贯操作]

我们在使用其他框架的时候发现我们存在着一些连贯操作,那么这个连贯操作怎么实现呢?

比如说laravel有个

Users->where(‘id’,’>’,’2’)->orderby(‘id’)->first().

我们可以动手试试,无论tp还是laravel,他们的连贯操作还有一个关键点,就是如果只有$Useres->where(…..),返回值是什么?一般这个返回值是对象,也就是保留了某些操作的对象。我们看看怎么实现吧。

我们首先先定义

private $where=’ 1 ‘;

用于存放拼接好的字符串

/** * @return mixed * 连贯操作的 get方法 */public function get(){    $sql='select * from '.$this->className.' where';    $sql.=$this->where;    $res=$this->query($sql);    return $res->fetchAll(\PDO::FETCH_ASSOC);}

注意:$this->className后面需要拼接一个空格以防与where语句连接在一起

重头戏来了我们开始写where方法用于连贯操作!

/** * @param $field 字段名 * @param $operator 符号,> < = >= eq等等。。 * @param $condition 数值或字符串 * 用户连贯操作的where方法 */public function where($field,$operator,$condition){    $this->where.=' '.$field.' '.$operator.' '.$condition.' ';    return $this;}

关键在于return

this也保存了上面拼接的结果。

但是我们使用中发现,where只能用一次,如果我有多个where条件就不行了。会报语法错误!

我们继续完善

结果

<?php/** * * Orm.php * User: kalvin * Date: 2018/2/1 * Time: 下午3:02 */namespace Core;/** * Class Orm * @package Core * ORM 父类方法 */class Orm{    private $className;    private $server;    private $type;    private $username;    private $password;    private $port;    private $dbname;    private $charset;    private $_pdo;    private $where=' 1 ';    private $limit='';    public function __construct()    {        $holeClassName=get_called_class(); //App\Entity\Users        $arr=explode('\\',$holeClassName);        $this->className=strtolower($arr[count($arr)-1]);        //根据配置文件项连接数据库        $this->server=$GLOBALS['conf']['mysql']['server'];        $this->type=$GLOBALS['conf']['mysql']['type'];        $this->username=$GLOBALS['conf']['mysql']['username'];        $this->password=$GLOBALS['conf']['mysql']['password'];        $this->port=$GLOBALS['conf']['mysql']['port'];        $this->dbname=$GLOBALS['conf']['mysql']['dbname'];        $this->charset=$GLOBALS['conf']['mysql']['charset'];        $this->connect();    }    public function connect(){        $dsn="$this->type:host=$this->server;dbname=$this->dbname;port=$this->port;charset=$this->charset";        $this->_pdo=new \PDO($dsn,$this->username,$this->password);        $this->_pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);    }    public function select()    {        $sql='select * from '.$this->className;        $res=$this->query($sql);        return $res->fetchAll(\PDO::FETCH_ASSOC);    }    public function query($sql)    {        try{            $resObj=$this->_pdo->query($sql);        }catch (\PDOException $e){           $resObj=$this->errors($e,$sql);        }        return $resObj;    }    public function errors($e,$sql)    {        echo '错误信息为:'.$e->getMessage().'<br/>';//        echo '错误代码为:'.$e->errorCode() ().'<br/>';        echo '错误语句为:'.$sql.'<br/>';        return false;    }    /**     * @return mixed     * 连贯操作的 get方法     */    public function get()    {        $sql='select * from '.$this->className.' where';        $sql.=$this->where;        $res=$this->query($sql);        return $res->fetchAll(\PDO::FETCH_ASSOC);    }    /**     * @param $field 字段名     * @param $operator 符号,> < = >= eq等等。。     * @param $condition 数值或字符串     * 用户连贯操作的where方法     */    public function where($field,$operator,$condition)    {        //如果strlen==3 就是说 之前无where 条件不然就直接        if (strlen($this->where)==3){            $this->where=' '.$field.' '.$operator.' '.$condition.' ';            return $this;        }        $this->where.=' and '.$field.' '.$operator.' '.$condition.' ';        return $this;    }}

我们在上面做where做了判断,为什么长度为3因为前后各有一个空格加上数字就是三,如果是第一次where就直接覆盖之前定义的$this->where=’ 1 ‘

如果不是就是拼接上 and 以及条件。我们这章的orm就结束了,如果有什么疑惑可以在评论中留言,详细代码也可以查看我的码云上会有哦

gitee搜索 Ecframe即可

标签: #mvc框架php