thinkphp3.2使用trait代码复制实现多继承

大兄弟 2018年12月23日0   197

以前遇到过模型多继承的问题,直到今天又遇到了这个老问题:有些模型继承的是BaseModel,也就是自定义的基模型,但某些模型需要继承一些thinkphp提供的高级模型比如RelationModel,那么继承了RelationModel后就没办法继承BaseModel中的常用方法了,因为我在BaseModel中实现了findPage方法,这个是一个thinkphp以前有发布过的非常古老的方法,后来不知道什么原因就废除了,然后我就把它捡回来了。。。

经过百度得知,使用trait语法可以实现多继承效果,使用这个语法其实就是扩展类的方法,或者说共用多个通用类方法。

又:众所周知,thinkphp3.2是有namespace的,所以实现Trait代码的php文件的存放就成问题了。

但:经过查阅文档,得知import可以手动载入没有命名空间的文件,并且不以自动加载的方式得到包含。

综上所述:我们再建立Trait.class.php,这里以.class.php结尾的原因是import函数默认的文件后缀为.class.php,如果不为.class.php的话需要自己在第三个参数加入自定义后缀,这样会导致我们不得不设置import函数的第二个参数,也就是baseUrl基础路径,所以我们干错命名为Trait.class.php。编写代码实现trait:

<?php

/**
 * 代码复制
 * 模型方法继承
 * Trait extendMethod
 */
trait extendMethod
{
    /**
     * 分页查询数据
     * @access public
     * @param mixed $pageopt 分页参数
     * @param mixed $options 表达式参数
     * @return mixed
     */
    function findPage($pageopt, $count = false, $options = array())
    {
        // 此处为对应逻辑代码,可以带$this
    }
}

通过代码可知,文件是没有命名空间的。所以我们在模型中use的时候需要注意路径问题。

然后我们开始编写我新的们Model:

<?php

namespace Common\Model;

use Think\Model\RelationModel;
use Think\Hook;
use Org\Util\ArrayToolkit;
import('Common.Lib.Trait');// 注意这里的Common 这里解析出来的路径实际上是Application/Common/Lib/Trait.class.php
class UserModel extends RelationModel
{
    use \extendMethod; // 继承扩展方法,注意这里的反斜杠,表示我们在命名空间的最根部进行调用,没有命名空间的代码块都是处于空间根部。
    // 下面是我们的对象逻辑,下面的方法也可以使用trait的方法了
}