首页 » Web前端 » php父类结构技巧_PHP着手创建自己第一个MVC框架项目三中级篇完

php父类结构技巧_PHP着手创建自己第一个MVC框架项目三中级篇完

访客 2024-11-06 0

扫一扫用手机浏览

文章目录 [+]

什么是ORM,百度的阐明:

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

php父类结构技巧_PHP着手创建自己第一个MVC框架项目三中级篇完

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

php父类结构技巧_PHP着手创建自己第一个MVC框架项目三中级篇完
(图片来自网络侵删)

我们现在开始吧,首先我们变动原来的文件路径,把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即可

标签:

相关文章

QQ伪装黑客代码大全技术与风险警示

网络安全问题日益凸显。QQ作为一种流行的社交工具,成为了黑客攻击的主要目标之一。本文将针对QQ伪装黑客代码大全进行深入剖析,揭示其...

Web前端 2025-03-02 阅读1 评论0