PHP技巧之链式调用

接触过ThinkPHP、Laravel、Yii等开发框架的朋友们应该经常遇到这样的调用方式:

// Laravel链式调用示例
DB::table('users')->where('name', 'John')->first();

我们对比下传统早期的调用方式

$_db = new DB();
$_db->table('users');
$_db->where('name','John');
$_db->first();

两者相比是不是,链式更方便、简洁;
那如何实现类似这样的调用呢,其实很简单;
我们都知道类方法的调用就是

[Object|ObjectInstantiation]->[FunName](mixed $expression [, mixed $... ])

链式的核心其实就是让每个调用的方法返回当前对象,以便其他方法的组合;
我们都知道$this表示的是当前的实例对象,我们可以依托它来方便调用当前类内的任何方法;

下面,我们用个简单的数据操作示例来看下实现过程:

<?php


/**
 * PHP 链式数据模型调用示例
 */
class ChainDbDemo
{

    /**
     * 当前需要调用的数据表名称
     * @var string $_tableName 
    */
    private $_tableName = '';

    /**
     * 当前查询条件
     * @var null|array $_where
     */
    private $_where = null;

    /**
     * 查询的数据表
     *
     * @param string $tableName // 查询的数据表名称
     *
     * @return object
     */
    public function table($tableName)
    {
        // table方法作用只是为了指向现在要针对某个数据表进行操作
        // 所以它并不是一个最终执行的方法
        // 将传参进行内部存储
        $this->_tableName = $tableName;
        
        // 返回$this,方便其他方法的组合
        return $this;
    }

    /**
     * 查询条件
     *
     * @param array $where // 查询条件
     *
     * @return object
     */
    public function where(array $where = [])
    {
        // 同table方法,并非最终执行的方法
        // 我们同样进行传参的内部存储
        $this->_where = $where;

        // 返回$this,方便其他方法的组合
        return $this;
    }

    /**
     * 查询一条结果数据
     *
     * @return null|array
     */
    public function find()
    {
        // 这里大家应该注意到返回的内容不一样了
        // find方法用于单条数据的查询结果返回操作,也就是我们最终执行的方法
        // 在这个方法里,我们就可以把之前的内部存储参数进行同意的调用得到最终的查询结果
        return [];
    }

}

接下来就是调用方式的演示了:

$_db = new ChainDbDemo();
$_db->table('users')->where(['id'=>1])->find();

怎么样?是不是很简单,欢迎评论区互相交流探讨更多实现思路!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

转悠的陀螺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值