Blogger Information
Blog 49
fans 1
comment 0
visits 45320
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
使用静态方法的重载技术, 实现一个数据库访问类,并实例演示链接调用的实现过程(通过静态魔术方法进行跳转,实现对象方法的跨类调用 __callStatic)2019年6月17日20点
Nick的博客
Original
900 people have browsed it

通过静态魔术方法进行跳转,实现对象方法的跨类调用  __callStatic:

demo1.php代码:

实例

<?php
//使用静态方法的重载技术, 实现一个数据库访问类,并实例演示链接调用的实现过程
require 'Query1.php';

class Db
{
    //创建一个私有的静态属性,用于数据库连接
    protected static $pdo = null;

    // 数据库连接方法, 每次查询时再连接, 实现真正的惰性连接,节省系统开销
    public static function connection()
    {
        //连接数据的参数
        self::$pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','root');
    }

    //查询类操作入口,通过静态魔术方法进行跳转,实现对象方法的跨类调用
    public static function __callStatic($name, $arguments)
    {
        //创建pdo对象,并连接数据库
        self::connection();
        //实例化查询类,将连接对象作为参数
        $query = new Query(self::$pdo);
        //执行查询类Query中的对象方法,注意参数是数组,我只需要第一个参数:表名, 所以加了索引键名
        return call_user_func_array([$query,$name],[$arguments[0]]);
    }
}

//客户端的链式调用
//以Db类做入整数数据库操作的入口,SQL语句的各个部分用对象方法提供
//链式操作是现代PHP框架的基础,非常有用
$cats = Db::table('category')
            ->field('cate_id, name ,alias')
            ->where('cate_id >= 2')
            ->limit('2')
            ->select();

//foreach循环查看获取的数据库数据
foreach ($cats as $cat) {
    print_r($cat);
    echo '<br>';
}

//$cats = Db::table('category')
//    ->field('kr,抗日神剧')
//    ->value('1')
//    ->update();
//
//foreach ($cats as $cat) {
//    print_r($cat);
//    echo '<br>';
//}

运行实例 »

点击 "运行实例" 按钮查看在线实例


Query.php代码:

实例

<?php
//数据库查询类

class Query
{
    //连接对象
    public $pdo = null;
    //字段列表
    public $field = '';
    //数据表名
    public $table = '';
    //查询条件
    public $where = '';
    //显示数量
    public $limit = '';
    //修改值
    public $value = '';

    //构造方法,初始化连接对象
    public function __construct(PDO $pdo)
    {
        //连接对象是对象方法的共享属性
        $this->pdo = $pdo;
    }

    //调用表名
    public  function table($tableName)
    {
        $this->table = $tableName;
        //返回当前对象,便于链式调用该对象的其他方法
        return $this;
    }

    //设置查询字段
    public function field($fields)
    {
        $this->field = $fields;
        return $this;
    }

    //设置查询条件
    public function where($where)
    {
        $this->where = $where;
        return $this;
    }

    //设置显示数量
    public function limit($limit)
    {
        $this->limit = $limit;
        return $this;
    }

    //设置值
    public function value($value)
    {
        $this->limit = $value;
        return $this;
    }

    //创建SQL查询语句对象,并返回查询结果
    public function select()
    {
        //查询条件设置,确保链式方法独立
        $fields = empty($this->field) ? '*' : $this->field;
        $where = empty($this->where) ? '' : ' WHERE ' .$this->where;
        $limit = empty($this->limit) ? '' : ' LIMIT ' . $this->limit;

        //SQL查询语句
        $sql = 'SELECT '.$fields.' FROM '.$this->table . $where . $limit;

        //预处理查询
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

//    //创建SQL修改语句对象,并返回修改结果结果
//    public function update()
//    {
//        //查询条件设置,确保链式方法独立
//        $fields = empty($this->field) ? '*' : $this->field;
//        $where = empty($this->where) ? '' : ' WHERE ' .$this->where;
//        $value = empty($this->value) ? '' : '='.$this->value;
//
//        //SQL查询语句
//        $sql = 'UPDATE '.$this->table.' SET '.$fields.$value. $where;
//
//        //预处理查询
//        $stmt = $this->pdo->prepare($sql);
//        $stmt->execute();
//        return $stmt->fetch(PDO::FETCH_ASSOC);
//    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例


最终在页面上打印出的数据库查询结果显示:

数据查询结果.png

Correction status:Uncorrected

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post