批改狀態(tài):合格
老師批語:努力 , 一定會成功
接口常量的設置和調用
<?php namespace _1010; //接口常量,通常用作配置文件 //如果這個接口沒定義定義,就定義該接口(要加上命名空間) if(!interface_exists(__NAMESPACE__.'\iDbParam')){ interface iDbParam { //數(shù)據庫連接參數(shù)常量 const TYPE = 'mysql'; const HOST = '127.0.0.1'; const DBNAME = 'chen'; const USER = 'root'; const PSWD = 'root'; //抽象方法 public static function connection(); } } //工作類/普通類:用來實現(xiàn)接口 在同一空間下 ,可以不加空間名 class Connection implements namespace\iDbParam { //初始化連接參數(shù),直接調用接口中的常量 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; //實現(xiàn)接口中的方法 public static function connection() { // TODO: Implement connection() method. //拼接dsn數(shù)據庫連接語句 $dsn = Connection::$type.':host='.Connection::$host.';dbname='.Connection::$dbname; $user = Connection::$user; $pswd = Connection::$pswd; // 實例話pdo對象 return new \PDO($dsn,$user,$pswd); } } //連接數(shù)據庫 $link = Connection::connection(); //預處理語句 $stmt = $link->prepare('SELECT * FROM `staff` LIMIT :limit'); //綁定參數(shù) $stmt->bindValue('limit',5,\PDO::PARAM_INT); //執(zhí)行查詢操作 $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>"; }
點擊 "運行實例" 按鈕查看在線實例
后期靜態(tài)綁定的使用
<?php //后期靜態(tài)綁定:延時靜態(tài)綁定 //用在靜態(tài)繼承的上下文環(huán)境中 namespace _1010; class A { public static function who() { echo __CLASS__; } public static function where() { // self::who(); static::who(); } } //靜態(tài)繼承的上下文 class B extends A { //在子類重寫父類A中的靜態(tài)方法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 給當前的空間名稱起一個別名 // 防止當前空間名稱命名沖突
點擊 "運行實例" 按鈕查看在線實例
延時靜態(tài)綁定和trait類的綜合使用-----數(shù)據庫的curd操作
<?php namespace _1010; //引入全局空間下的PDO類 use PDO; // //interface iDbParams //{ // const DSN = 'mysql:dbname=chen'; // const USER = 'root'; // const PASS = 'root'; //} ////如果接口中沒有定義抽象方法,也可不實現(xiàn)該接口,直接調用接口中的常量 //$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; // 數(shù)量 public $limit = null; //修改的數(shù)據 public $value = null; //設置數(shù)據表名稱 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) { //如果沒傳數(shù)量條件,就默認為空 static::$execute->limit = empty($limit) ? $limit : ' limit '.$limit ; //返回當前類實例, 用來鏈式調用后面的其它方法 return static::$execute; } public function value($data) { //如果沒傳要修改的條件,就默認為空 static::$execute->value = empty($data) ? die('請輸入要修改的參數(shù)') : $data ; //返回當前類實例, 用來鏈式調用后面的其它方法 return static::$execute; } } //查詢組件 trait Select { //查詢方法 public function select() { //拼裝SQL $sql = 'SELECT ' . $this->field // 字段列表 . ' FROM ' . $this->table // 數(shù)據表 . $this->where // 條件 . $this->limit; // 顯示數(shù)量 //預處理 $stmt = static::$pdo->prepare($sql); // var_dump($stmt);die; $stmt->execute(); //返回查詢結果 return $stmt->fetchAll(PDO::FETCH_ASSOC); } } //新增組件 trait Insert { public function insert() { //取出要添加的數(shù)據(數(shù)組)中的下標,然后組成數(shù)組 $keyArr = array_keys($this->value); //循環(huán)遍歷數(shù)組 $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; //執(zhí)行 $stmt->execute($this->value); //返回受影響的那一行 return [ 'count' => $stmt->rowCount(), 'id' => static::$pdo->lastInsertId() ]; } } //修改組件 trait Update { public function update() { // UPDATE 表名 set 要修改的參數(shù) where 條件 //取出要修改的數(shù)據(數(shù)組)中的下標,然后組成數(shù)組 $keyArr = array_keys($this->value); //循環(huán)遍歷數(shù)組 $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; //執(zhí)行 $stmt->execute($this->value); //返回受影響的那一行 return $stmt->rowCount(); } } //刪除組件 trait Delete { // 刪除數(shù)據 public function delete() { $sql = 'DELETE FROM ' .$this->table .$this->where; $stmt = static::$pdo->prepare($sql); // var_dump($stmt);die; $stmt->execute(); return $stmt->rowCount(); } } //數(shù)據庫組件 trait DBname { //連接數(shù)據庫的參數(shù),獨立出來便于更改 public static $dsn = 'mysql:host=127.0.0.1;dbname=chen'; public static $usernam = 'root'; public static $password = 'root'; //數(shù)據庫的連接方式 public static function connection() { // 連接數(shù)據庫 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);
點擊 "運行實例" 按鈕查看在線實例
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號