接口常量的设置和调用
实例
<?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);
运行实例 »
点击 "运行实例" 按钮查看在线实例