1. PDO连接和常用操作
1.1 连接参数
代码展示:
<?php
//连接参数
return [
//类型
'type' => $type ?? 'mysql',
//默认主机名
'host' => $username ?? 'localhost',
//默认编码集
'charset' => $charset ?? 'utf8',
//默认端口号
'port' => $porst ?? '3306',
//默认用户名
'username' => $usernam ?? 'root',
//默认用户密码
'password' => $password ?? 'root',
//默认数据库
'dbname' => $dbname ?? 'phpedu',
];
?>
1.2 PDO方式连接数据库
代码展示:
<?php
//使用pdo方式连接数据库
//1.导入配置参数
$config = require __DIR__ . '\\config.php';
extract($config);
$dsn = sprintf('%s:host=%s;dbname=%s', $type, $host, $dbname);
$pdo = new PDO($dsn, $username, $password);
//设置结果集获取模式,仅返回关联部分
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
?>
1.3 增删改查
1.3.1 INSERT
代码展示:
<?php
// pdo 新增操作
require __DIR__ .'/connect.php';
$sql = 'INSERT `users` SET `name`=:name, `email`=:email, `password`=:password;';
$stmt = $pdo->prepare($sql);
$res = $stmt->execute(['name'=>'lisi', 'email'=>'zhaoliu@php.cn', 'password'=>sha1('987')]);
if (true === $res) {
if ($stmt->rowCount() === 1){
echo '成功新增了' .$stmt->rowCount() .'条记录...,新增的主键ID = ' .$pdo->lastInsertId();
}
}
unset($pdo);
?>
运行结果:

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

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

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

1.3.4.2 fetchAll() + foreach()
fetchAll() + foreach()
代码展示:
<?php
require __DIR__ .'/connect.php';
$sql = 'SELECT `id`, `name`, `email` FROM `users` WHERE `id`>= ?;';
$stmt = $pdo->prepare($sql);
if ($stmt->execute([13])) {
$users = $stmt->fetchAll();
foreach($users as $user){
vprintf('<li>id = %d, name = %s, email = %s</li>', $user);
}
} else {
printf('<pre>%s</pre>', print_r($stsm->errorInfo(), true));
$stmt->debugDumpParams();
}
$pdo = null;
?>
运行结果:
2. trait常用场景
2.1 代码复用
代码展示:
<?php
// trait:代码复用,将公共部分提取到一个trait类中
trait tDemo
{
public function getProps()
{
// return __CLASS__:当前类名称,等价于:self::class
return sprintf('<pre>%s</pre>', print_r(get_class_vars(self::class), true));
}
}
class User1
{
use tDemo;
protected $name = '张三';
protected $gender = '女';
}
class User2
{
use tDemo;
protected $name = '李四';
protected $gender = '男';
}
echo (new User1)->getProps();
echo (new User2)->getProps();
?>
运行结果:

2.2 继承
代码展示:
<?php
// trait:支持继承
trait tDemo
{
// 静态属性
public static $name = 'trait...';
// 静态方法
public static function hello()
{
return 'trait method name:'. __METHOD__;
}
}
// 用的是抽象类使用trait
abstract class Dad
{
use tDemo;
}
// Son允许直接向最终用户开放的接口
class Son extends Dad
{
}
echo Son::$name, '<br>';
echo Son::hello();
?>
运行结果:

2.3 扩展:
代码展示:
<?php
// trait:扩展
trait tDemo1
{
// 获取类中所有属性
public function getProps()
{
return sprintf('<pre>%s</pre>', print_r(get_class_vars(self::class), true));
}
}
trait tDemo2
{
// 获取类中所有方法
public function getMethods()
{
return sprintf('<pre>%s</pre>', print_r(get_class_methods(self::class), true));
}
}
// trait支持功能整合,trait中允许再引入trait
trait tDemo3
{
use tDemo1, tDemo2;
}
class Work1
{
use tDemo1, tDemo2;
public $name = 'apple';
public $price = 2;
public function getInfo()
{
return $this->name. ':'. $this->price;
}
}
$work1 = new Work1;
echo $work1->getMethods();
echo $work1->getProps();
class Work2
{
use tDemo3;
public $name = 'apple';
public $price = 2;
public function getInfo()
{
return $this->name. ':'. $this->price;
}
}
$work2 = new Work2;
echo $work2->getMethods();
echo $work2->getProps();
?>
运行结果:
3. interface常用场景
3.1 多继承
代码展示:
<?php
// php是典型的单继承式语言
// 接口可以突破这种限制,实现多接口继承
// 接口之间允许继承,并且支持多继承
// 实现类可以同时实现多个接口
// 可以有两种实现方案:
// 1.将多个接口进行整合,形成一个统一的接口,然后用一个实现类来实现它
// 2.一个实现类同时实现多个接口,实现类的功能组合,是一种横向的功能扩展
// 接口1
interface iUser
{
const NATION = 'CHINA';
}
// 接口2
interface iUser1 extends iUser
{
const USER_NAME = 'peter';
}
// 接口3
interface iUser2 extends iUser, iUser1
{
public static function write();
}
// 实现类
// 单接口
class User implements iUser
{
}
echo User::NATION, '<hr>';
//多接口实现
class User1 implements iUser1
{
}
echo User1::NATION, User1::USER_NAME, '<hr>';
class User2 implements iUser2
{
public static function write()
{
return '姓名:'. iUser1::USER_NAME. ',国籍:'. iUser::NATION;
}
}
echo User2::write();
?>
运行结果:

3.2 抽象类与interface的区别与联系
代码展示:
<?php
// trait与interface组合
interface iDemo
{
public static function index();
}
// 不用普通的工作类来实现接口中的抽象方法
// 用trait来实现
trait tDemo
{
// 将抽象类的实现代码写到trait中
public static function index(){
return 'hello world';
}
}
abstract class Hello implements iDemo
{
use tDemo;
}
class Work extends Hello
{
}
// echo hello::index();
echo Work::index();
?>
4. 实战:抽奖案例
代码展示:
<?php
// 接口 + 抽象类 + trait + class
// 奖品数组
$prizes = ['电脑', '手机', '平板', '微单', '背包'];
//通用的接口
interface iCreateId
{
public static function generateId($min, $max);
}
//公共方法
trait createId
{
public static function generateId($min, $max)
{
return mt_rand($min, $max);
}
}
// 实现类/工作类
class Drawprize implements iCreateId
{
use createId;
// 开奖
public static function award($prizes, $id)
{
return $prizes[$id];
}
}
$prizes = ['电脑', '手机', '平板', '微单', '背包'];
$id = DrawPrize::generateId(0, 4);
$prize = Drawprize::award($prizes, $id);
printf('你的奖品是:<span style="color:red">%s</span>', $prize);
?>
运行结果:
