批改状态:合格
老师批语:努力 , 一定会成功
接口常量的设置和调用
<?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>";
}点击 "运行实例" 按钮查看在线实例
后期静态绑定的使用
<?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);点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号