登录  /  注册
博主信息
博文 9
粉丝 0
评论 0
访问量 7340
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
PDO操作、trait/interface常用场景等、实战抽奖案例
金牌马甲
原创
681人浏览过

1. PDO连接和常用操作

1.1 连接参数

代码展示:
  1. <?php
  2. //连接参数
  3. return [
  4. //类型
  5. 'type' => $type ?? 'mysql',
  6. //默认主机名
  7. 'host' => $username ?? 'localhost',
  8. //默认编码集
  9. 'charset' => $charset ?? 'utf8',
  10. //默认端口号
  11. 'port' => $porst ?? '3306',
  12. //默认用户名
  13. 'username' => $usernam ?? 'root',
  14. //默认用户密码
  15. 'password' => $password ?? 'root',
  16. //默认数据库
  17. 'dbname' => $dbname ?? 'phpedu',
  18. ];
  19. ?>

1.2 PDO方式连接数据库

代码展示:
  1. <?php
  2. //使用pdo方式连接数据库
  3. //1.导入配置参数
  4. $config = require __DIR__ . '\\config.php';
  5. extract($config);
  6. $dsn = sprintf('%s:host=%s;dbname=%s', $type, $host, $dbname);
  7. $pdo = new PDO($dsn, $username, $password);
  8. //设置结果集获取模式,仅返回关联部分
  9. $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  10. ?>

1.3 增删改查

1.3.1 INSERT

代码展示:
  1. <?php
  2. // pdo 新增操作
  3. require __DIR__ .'/connect.php';
  4. $sql = 'INSERT `users` SET `name`=:name, `email`=:email, `password`=:password;';
  5. $stmt = $pdo->prepare($sql);
  6. $res = $stmt->execute(['name'=>'lisi', 'email'=>'zhaoliu@php.cn', 'password'=>sha1('987')]);
  7. if (true === $res) {
  8. if ($stmt->rowCount() === 1){
  9. echo '成功新增了' .$stmt->rowCount() .'条记录...,新增的主键ID = ' .$pdo->lastInsertId();
  10. }
  11. }
  12. unset($pdo);
  13. ?>
运行结果:

1.3.2 UPDATE

代码展示:
  1. <?php
  2. // pdo 更新操作
  3. require __DIR__ .'/connect.php';
  4. $sql = 'UPDATE `users` SET `name`= ?, `email`= ?, `password`= ? WHERE `id`= ?;';
  5. $stmt = $pdo->prepare($sql);
  6. $stmt->execute(['yangguo', 'yangguo@php.cn', sha1('112'), 12]);
  7. echo $stmt->rowCount() === 1 ? '成功更新了' . $stmt->rowCount() . '条记录': '没有记录被更新';
  8. $pdo = null;
  9. ?>
运行结果:

1.3.3 DELETE

代码展示:
  1. <?php
  2. // pdo 删除操作 (简化版本)
  3. require __DIR__ .'/connect.php';
  4. $sql = 'DELETE FROM `users` WHERE `id`= ?;';
  5. $stmt = $pdo->prepare($sql);
  6. $stmt->execute([12]);
  7. echo $stmt->rowCount() === 1 ? '成功删除了' . $stmt->rowCount() . '条记录': '没有记录被删除';
  8. $pdo = null;
  9. ?>
运行结果:

1.3.4 SELECT

1.3.4.1 fetch() + while()
  1. fetch() + while()
代码展示:
  1. <?php
  2. require __DIR__ .'/connect.php';
  3. $sql = 'SELECT `id`, `name`, `email` FROM `users` WHERE `id`>= ?;';
  4. $stmt = $pdo->prepare($sql);
  5. if ($stmt->execute([13])) {
  6. while($user = $stmt->fetch()) {
  7. printf('<pre>%s</pre>', print_r($user, true));
  8. }
  9. } else {
  10. printf('<pre>%s</pre>', print_r($stsm->errorInfo(), true));
  11. $stmt->debugDumpParams();
  12. }
  13. $pdo = null;
  14. ?>
运行结果:

1.3.4.2 fetchAll() + foreach()
  1. fetchAll() + foreach()
代码展示:
  1. <?php
  2. require __DIR__ .'/connect.php';
  3. $sql = 'SELECT `id`, `name`, `email` FROM `users` WHERE `id`>= ?;';
  4. $stmt = $pdo->prepare($sql);
  5. if ($stmt->execute([13])) {
  6. $users = $stmt->fetchAll();
  7. foreach($users as $user){
  8. vprintf('<li>id = %d, name = %s, email = %s</li>', $user);
  9. }
  10. } else {
  11. printf('<pre>%s</pre>', print_r($stsm->errorInfo(), true));
  12. $stmt->debugDumpParams();
  13. }
  14. $pdo = null;
  15. ?>
运行结果:

" class="reference-link">

2. trait常用场景

2.1 代码复用

代码展示:
  1. <?php
  2. // trait:代码复用,将公共部分提取到一个trait类中
  3. trait tDemo
  4. {
  5. public function getProps()
  6. {
  7. // return __CLASS__:当前类名称,等价于:self::class
  8. return sprintf('<pre>%s</pre>', print_r(get_class_vars(self::class), true));
  9. }
  10. }
  11. class User1
  12. {
  13. use tDemo;
  14. protected $name = '张三';
  15. protected $gender = '女';
  16. }
  17. class User2
  18. {
  19. use tDemo;
  20. protected $name = '李四';
  21. protected $gender = '男';
  22. }
  23. echo (new User1)->getProps();
  24. echo (new User2)->getProps();
  25. ?>
运行结果:

2.2 继承

代码展示:
  1. <?php
  2. // trait:支持继承
  3. trait tDemo
  4. {
  5. // 静态属性
  6. public static $name = 'trait...';
  7. // 静态方法
  8. public static function hello()
  9. {
  10. return 'trait method name:'. __METHOD__;
  11. }
  12. }
  13. // 用的是抽象类使用trait
  14. abstract class Dad
  15. {
  16. use tDemo;
  17. }
  18. // Son允许直接向最终用户开放的接口
  19. class Son extends Dad
  20. {
  21. }
  22. echo Son::$name, '<br>';
  23. echo Son::hello();
  24. ?>
运行结果:

2.3 扩展:

代码展示:
  1. <?php
  2. // trait:扩展
  3. trait tDemo1
  4. {
  5. // 获取类中所有属性
  6. public function getProps()
  7. {
  8. return sprintf('<pre>%s</pre>', print_r(get_class_vars(self::class), true));
  9. }
  10. }
  11. trait tDemo2
  12. {
  13. // 获取类中所有方法
  14. public function getMethods()
  15. {
  16. return sprintf('<pre>%s</pre>', print_r(get_class_methods(self::class), true));
  17. }
  18. }
  19. // trait支持功能整合,trait中允许再引入trait
  20. trait tDemo3
  21. {
  22. use tDemo1, tDemo2;
  23. }
  24. class Work1
  25. {
  26. use tDemo1, tDemo2;
  27. public $name = 'apple';
  28. public $price = 2;
  29. public function getInfo()
  30. {
  31. return $this->name. ':'. $this->price;
  32. }
  33. }
  34. $work1 = new Work1;
  35. echo $work1->getMethods();
  36. echo $work1->getProps();
  37. class Work2
  38. {
  39. use tDemo3;
  40. public $name = 'apple';
  41. public $price = 2;
  42. public function getInfo()
  43. {
  44. return $this->name. ':'. $this->price;
  45. }
  46. }
  47. $work2 = new Work2;
  48. echo $work2->getMethods();
  49. echo $work2->getProps();
  50. ?>
运行结果:

" class="reference-link">

3. interface常用场景

3.1 多继承

代码展示:
  1. <?php
  2. // php是典型的单继承式语言
  3. // 接口可以突破这种限制,实现多接口继承
  4. // 接口之间允许继承,并且支持多继承
  5. // 实现类可以同时实现多个接口
  6. // 可以有两种实现方案:
  7. // 1.将多个接口进行整合,形成一个统一的接口,然后用一个实现类来实现它
  8. // 2.一个实现类同时实现多个接口,实现类的功能组合,是一种横向的功能扩展
  9. // 接口1
  10. interface iUser
  11. {
  12. const NATION = 'CHINA';
  13. }
  14. // 接口2
  15. interface iUser1 extends iUser
  16. {
  17. const USER_NAME = 'peter';
  18. }
  19. // 接口3
  20. interface iUser2 extends iUser, iUser1
  21. {
  22. public static function write();
  23. }
  24. // 实现类
  25. // 单接口
  26. class User implements iUser
  27. {
  28. }
  29. echo User::NATION, '<hr>';
  30. //多接口实现
  31. class User1 implements iUser1
  32. {
  33. }
  34. echo User1::NATION, User1::USER_NAME, '<hr>';
  35. class User2 implements iUser2
  36. {
  37. public static function write()
  38. {
  39. return '姓名:'. iUser1::USER_NAME. ',国籍:'. iUser::NATION;
  40. }
  41. }
  42. echo User2::write();
  43. ?>
运行结果:

3.2 抽象类与interface的区别与联系

代码展示:
  1. <?php
  2. // trait与interface组合
  3. interface iDemo
  4. {
  5. public static function index();
  6. }
  7. // 不用普通的工作类来实现接口中的抽象方法
  8. // 用trait来实现
  9. trait tDemo
  10. {
  11. // 将抽象类的实现代码写到trait中
  12. public static function index(){
  13. return 'hello world';
  14. }
  15. }
  16. abstract class Hello implements iDemo
  17. {
  18. use tDemo;
  19. }
  20. class Work extends Hello
  21. {
  22. }
  23. // echo hello::index();
  24. echo Work::index();
  25. ?>

4. 实战:抽奖案例

代码展示:
  1. <?php
  2. // 接口 + 抽象类 + trait + class
  3. // 奖品数组
  4. $prizes = ['电脑', '手机', '平板', '微单', '背包'];
  5. //通用的接口
  6. interface iCreateId
  7. {
  8. public static function generateId($min, $max);
  9. }
  10. //公共方法
  11. trait createId
  12. {
  13. public static function generateId($min, $max)
  14. {
  15. return mt_rand($min, $max);
  16. }
  17. }
  18. // 实现类/工作类
  19. class Drawprize implements iCreateId
  20. {
  21. use createId;
  22. // 开奖
  23. public static function award($prizes, $id)
  24. {
  25. return $prizes[$id];
  26. }
  27. }
  28. $prizes = ['电脑', '手机', '平板', '微单', '背包'];
  29. $id = DrawPrize::generateId(0, 4);
  30. $prize = Drawprize::award($prizes, $id);
  31. printf('你的奖品是:<span style="color:red">%s</span>', $prize);
  32. ?>
运行结果:

批改老师:天蓬老师天蓬老师

批改状态:合格

老师批语:没写完, 双色球案例呢?
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学