thinkphp5之orm分解,模型层详解 - 唐轶俊博客

thinkphp5之orm分解,模型层详解

PHP 455浏览 评论

     使用thinkphp5很长一段时间了,感觉thinkphp5的orm封装得还不错,

在使用中也是非常的方便,可以说orm给我们写模型层提供很大的便利性,

也就是直接提高了我们的开发效率和代码的可维护性。正是因为我们使用

起来方便,正因为他的强大,而导致我们忽略了对底层实现,对面向对象

理解得不够深刻,因此在一段时间里我便深入的看了下thinkphp5的orm,

因此抽时间来总结下所得。

    如果你对以下疑问都了解,我觉得可以忽略了!总的来说只有一个大的问题,thinkphp orm是如何运行的?model层的执行过程是怎样的?下面我们把这个大的问题拆解成下面一些小的问题如下:

  • thinkphp orm是如何实现支持多种类型数据库?

  • thinkphp model层是如何支持本类和静态调用的?

  • 明明继承的model与Query无关联是如何调用到query()的where和find()方法的?

  • thinkphp model层是如何连接数据库的?

下面我们来看下这些问题是怎样实现的?首先我们看下tp的orm目录结构

94238482-D137-44E5-BD6A-9E9C486560AB.png


可以看到thinkphp  orm 支持 mysql、pgsql、sqlite、sqlserver.

  • thinkphp orm是如何实现支持多种类型数据库?

image.png

支持多种数据库类型的关键是在连接类会根据数据库配置文件的数据库类型(type)实例化具体的类。

  • thinkphp model层是如何支持本类和静态调用的?如下代码$this 与Db静态调用的结果是一样的,是如何实现的?

class Admin extends Model{
    public function _find($where){
        $this->where($where)->find();
        Db::name('admin')->where($where)->find();
    }
}

在这里 admin继承了Model类,用$this->where()就必然是调用了父类model的方法,而我们的model类并没有where和find()方法?那么是如何定位到query类的查询方法呢?

是通过Model类下面的2个方法完成的,大家可以看下。

image.png


再看静态调用是如何实现的,Db::where(),可以看到Db类也并没有where(),find()...等方法,那么是如何定位到

Query类的查询方法呢?

我们可以看到Db类有这样一个方法:

image.png

主要实例化具体的数据库类型,并且传递方法,如where,find,拿mysql举例,self::connect会实例化Mysql类

而mysql类继承connection类,connection类有这样一个方法,定位到Queryl类的具体方法。大家可以看下。

image.png


  • thinkphp model层是如何连接数据库的?


其实所有的查询方法会调用到connection类的query方法,所有的查询方法会调用到connection类的execute方法,

在该方法中会调用如下函数

image.png

看下该函数

image.png


看下pod连接数据库方法

image.png


可以说thinkphp5 orm封装离不开__call 和__callStatic  以及 call_user_func_arry函数的配合使用,让程序环环相扣,

把面向对象的思想运用得算是淋漓尽致了。这里也就是简单的给大家介绍下,thinkphp model实现的过程,代码量过多,在这里不好全部贴出来给大家分析,也就是几个关键的地方给大家解释了下,不够完善,有不明白的可以在下面留言。


最近在使用Yaf框架,而它以精简高效著称,因此不提供orm类,因此打算自己写一个Yaf的orm层,后面会给大家源码参考。

本文连接:http://www.phpbloger.com/article/60.html 文章都为原创,转载请注明出处!

相关文章