博客列表 >命名空间分级和别名引用,以及trait类的使用-------2019.10.10

命名空间分级和别名引用,以及trait类的使用-------2019.10.10

刂艹亻的博客
刂艹亻的博客原创
2019年10月14日 16:15:14828浏览

接口常量的设置和调用

实例

<?php
namespace _1010;
//接口常量,通常用作配置文件
//如果这个接口没定义定义,就定义该接口(要加上命名空间)
if(!interface_exists(__NAMESPACE__.'\iDbParam')){
    interface iDbParam
    {
        //数据库连接参数常量
        const TYPE = 'mysql';
        const HOST = '127.0.0.1';
        const DBNAME = 'chen';
        const USER = 'root';
        const PSWD = 'root';

        //抽象方法
        public static function connection();
    }
}


//工作类/普通类:用来实现接口  在同一空间下 ,可以不加空间名
class Connection implements namespace\iDbParam
{
    //初始化连接参数,直接调用接口中的常量
    private static $type = iDbParam::TYPE;
    private static $host = iDbParam::HOST;
    private static $dbname = iDbParam::DBNAME;
    private static $user = iDbParam::USER;
    private static $pswd = iDbParam::PSWD;

    //实现接口中的方法
    public static function connection()
    {
        // TODO: Implement connection() method.
        //拼接dsn数据库连接语句
        $dsn = Connection::$type.':host='.Connection::$host.';dbname='.Connection::$dbname;
        $user = Connection::$user;
        $pswd = Connection::$pswd;
//        实例话pdo对象
        return new \PDO($dsn,$user,$pswd);
    }

}
//连接数据库
$link = Connection::connection();
//预处理语句
$stmt = $link->prepare('SELECT * FROM `staff` LIMIT :limit');

//绑定参数
$stmt->bindValue('limit',5,\PDO::PARAM_INT);
//执行查询操作
$stmt->execute();
foreach($stmt->fetchAll(\PDO::FETCH_ASSOC) as $staff){
    $hiredate=date('Y年m月d日',$staff['hiredate']);
    echo "<li>{$staff['staff_id']}-{$staff['name']}-{$staff['position']}-{$hiredate}</li>";
}

运行实例 »

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

后期静态绑定的使用

self关键字在解析的时候会先解析成当前的类名(在A类中定义的时候,就会解析成A的类名)
static关键字会解析成为当前调用的类名,
self是谁的就解析成谁,static谁调用就解析成谁

实例

<?php
//后期静态绑定:延时静态绑定
//用在静态继承的上下文环境中
namespace _1010;
class A
{
    public static function who()
    {
        echo __CLASS__;
    }

    public static function where()
    {
//        self::who();
        static::who();
    }
}

//静态继承的上下文
class B extends A
{
    //在子类重写父类A中的静态方法who()
    public static function who()
    {
        echo __CLASS__;
    }

}
//当父类使用self关键字的时候,输出的都是父类A的空间+类名
//A::where();//_1010\A
//echo '<hr>';
//B::where();//_1010\A
//echo '<hr>';

//当父类使用static关键字的时候,A类调用的输出A类的空间+类名
//当父类使用static关键字的时候,B类调用的输出B类的空间+类名

A::where();//_1010\A
echo '<hr>';
B::where();//_1010\B
echo '<hr>';

//原因分析
//self关键字在解析的时候会先解析成当前的类名(在A类中定义的时候,就会解析成A的类名)
//static关键字会解析成为当前调用的类名,
//self是谁的就解析成谁,static谁调用就解析成谁

运行实例 »

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


命名空间的分级和别名引用

实例

<?php

//命名空间的分级管理
namespace _1010;
//echo __NAMESPACE__,'<br>';//_1010 当前的空间名称
//
//class Dog{}
//echo Dog::class,'<br>';//_1010\Dog
//
//namespace _1010\one;
//class Dog{}
//echo Dog::class,'<br>';//_1010\one\Dog
//
//namespace _1010\one\two;
//class Dog{}
//echo Dog::class,'<br>';//_1010\one\two\Dog


//命名空间的别名引用
namespace _1010\one\two\three;
class Test1
{
    public static function demo()
    {
        return __METHOD__;
    }
}

class Test2
{
    public static function demo()
    {
        return __METHOD__;
    }
}

namespace _1010_a;
use _1010\one\two\three\Test1 as T1;
use _1010\one\two\three\Test1;
//如果引入的时候加了别名,就使用别名调用
echo T1::class,'<br>';//_1010\one\two\three\Test1
echo T1::demo(),'<br>';//_1010\one\two\three\Test1::demo

use  _1010\one\two\three\Test2;
use red\Test;
//如果引入的时候,没有写别名,就使用类名调用
echo Test2::class,'<br>';//_1010\one\two\three\Test2
echo Test2::demo(),'<br>';//_1010\one\two\three\Test2::demo

// use
// 默认从全局开始, 可以省略掉: \
// as 给当前的空间名称起一个别名
// 防止当前空间名称命名冲突

运行实例 »

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

延时静态绑定和trait类的综合使用-----数据库的curd操作

实例

<?php
namespace _1010;
//引入全局空间下的PDO类
use PDO;
//
//interface iDbParams
//{
//    const DSN = 'mysql:dbname=chen';
//    const USER = 'root';
//    const PASS = 'root';
//}
////如果接口中没有定义抽象方法,也可不实现该接口,直接调用接口中的常量
//$pdo = new PDO(iDbParams::DSN, iDbParams::USER, iDbParams::PASS);
//$sql = 'SELECT * FROM `staff` LIMIT :num OFFSET :offset';
//$stmt = $pdo->prepare($sql);
//$stmt->bindValue('num',5,PDO::PARAM_INT);
//$stmt->bindValue('offset',0,PDO::PARAM_INT);
//$stmt->execute();
//echo'<pre>';
//print_r($stmt->fetchAll());

//trait类的定义与使用,组件化调用,便于扩展功能

//基础组件
trait BasicComponent
{
    //本类对象
    protected static $execute = null;
    // 表明
    public $table = null;

    // /字段
    public $field = '*';

    // /条件
    public $where = null;

    // 数量
    public $limit = null;

    //修改的数据
    public $value = null;

    //设置数据表名称
    protected static function table($tableName)
    {
        static::$execute->table = $tableName;
        //返回当前类实例, 用来链式调用后面的其它方法
        return static::$execute;
    }

    public function field($fields = '*')
    {
        //如果没传字段名,就默认查所有的
        static::$execute->field = empty($fields) ? '*': $fields ;
        //返回当前类实例, 用来链式调用后面的其它方法
        return static::$execute;
    }
    public function where($where = '')
    {
        //如果没传条件,就默认为空
        static::$execute->where = empty($where) ? $where : ' WHERE '.$where ;
        //返回当前类实例, 用来链式调用后面的其它方法
        return static::$execute;
    }

    public function limit($limit)
    {
        //如果没传数量条件,就默认为空
        static::$execute->limit = empty($limit) ? $limit : ' limit '.$limit ;
        //返回当前类实例, 用来链式调用后面的其它方法
        return static::$execute;
    }

    public function value($data)
    {
        //如果没传要修改的条件,就默认为空
        static::$execute->value = empty($data) ? die('请输入要修改的参数') : $data ;
        //返回当前类实例, 用来链式调用后面的其它方法
        return static::$execute;
    }
}
//查询组件
trait Select
{
    //查询方法
    public function select()
    {
        //拼装SQL
        $sql = 'SELECT '
            . $this->field // 字段列表
            . ' FROM '
            . $this->table  // 数据表
            . $this->where  // 条件
            . $this->limit;  // 显示数量
        //预处理
        $stmt = static::$pdo->prepare($sql);
//        var_dump($stmt);die;
        $stmt->execute();
        //返回查询结果
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}
//新增组件
trait Insert
{
    public function insert()
    {
        //取出要添加的数据(数组)中的下标,然后组成数组
        $keyArr = array_keys($this->value);
        //循环遍历数组
        $fields = '';
        foreach ($keyArr as $value) {
            $fields .= $value . ', ';
        }
        //去掉最后一个逗号
        $fields = rtrim($fields, ', ');

        $value = '';
        foreach ($keyArr as $v) {
            $value .= ':'.$v . ', ';
        }
        //去掉最后一个逗号
        $value = rtrim($value, ', ');
        //组装sql语句
        $sql ='INSERT INTO ' .$this->table .' ('.$fields .')'. ' VALUES '.'('. $value .')'.$this->where;
//        var_dump($sql);die;

        //预处语句
        $stmt = static::$pdo->prepare($sql);
//                var_dump($stmt);die;

        //执行
        $stmt->execute($this->value);
        //返回受影响的那一行
        return [
            'count' => $stmt->rowCount(),
            'id' => static::$pdo->lastInsertId()
        ];
    }
}
//修改组件
trait Update
{
    public function update()
    {
//        UPDATE 表名 set 要修改的参数 where 条件
        //取出要修改的数据(数组)中的下标,然后组成数组
        $keyArr = array_keys($this->value);
        //循环遍历数组
        $set = '';
        foreach ($keyArr as $value) {
            $set .= $value . ' = :' . $value. ', ';
        }
        //去掉最后一个逗号
        $set = rtrim($set, ', ');
        //组装sql语句
        $sql ='UPDATE ' .$this->table . ' SET '. $set .$this->where;

        //预处语句
        $stmt = static::$pdo->prepare($sql);
//                var_dump($stmt);die;

        //执行
        $stmt->execute($this->value);
        //返回受影响的那一行
        return $stmt->rowCount();
    }
}
//删除组件
trait Delete
{
    // 删除数据
    public function delete()
    {
        $sql = 'DELETE FROM ' .$this->table .$this->where;
        $stmt = static::$pdo->prepare($sql);
//        var_dump($stmt);die;
        $stmt->execute();

        return $stmt->rowCount();
    }
}
//数据库组件
trait DBname
{
    //连接数据库的参数,独立出来便于更改
    public static $dsn = 'mysql:host=127.0.0.1;dbname=chen';
    public static $usernam = 'root';
    public static $password = 'root';
    //数据库的连接方式
    public static function connection()
    {
        // 连接数据库
        static::$pdo= new PDO(self::$dsn,self::$usernam,self::$password);
        self::$execute = new self();
    }
}
//工作类
class Execute
{
    use DBname;
    use BasicComponent;
    use Select;
    use Insert;
    use Update;
    use Delete;
    //pdo类对象
    protected static $pdo = null;

    public static function __callStatic($name, $arguments)
    {
        // TODO: Implement __callStatic() method.
//        if(!is_object(static::$pdo)&& !is_object(static::$execute)){
            static::connection();
//        }
//        return call_user_func_array([self::$execute,$name],$arguments);
        return call_user_func_array([new Execute(),$name],$arguments);
    }

}
$staffs = Execute::table('staff')
    ->field('staff_id,name,position,mobile')
    ->where('staff_id > 2')
    ->limit(5)
    ->select();
foreach ($staffs as $staff) {
    print_r($staff); echo '<br>';
}
echo'<hr>';
$data = [
    'name' => '作者',
    'position' => '作死的存在'
];
//修改
//$staffs2 = Execute::table('staff')
//    ->value($data)
//    ->where('staff_id = 17')
//    ->update();
//print_r($staffs2);
echo'<hr>';

//添加
//$data2 = [
//    'name' => '郭靖',
//    'age' => 29,
//    'sex' => 1,
//    'position' => '金刀驸马',
//    'mobile' => '1389998899',
//    'hiredate' => time()
//];
//$staffs3 = Execute::table('staff')
//    ->value($data2)
//    ->insert();
//print_r($staffs3);
//删除
//$staffs4 = Execute::table('staff')
//    ->where('staff_id =17')
//    ->delete();
//print_r($staffs4);

运行实例 »

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


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议