抽象类和接口
抽象类(部分分离设计与实现)
抽象类的声明
<?php
abstract class User
{
// 类中成员属性和方法尽量用protected和private声明
// 成员属性
protected $name = '小殇';
// 方法
protected function write()
{
return "姓名:{$this->name}";
}
// 声明一个抽象方法(在子类中必须实现,不然会报错)
abstract protected function write2();
}
// 子类:实现,使用抽象类中的属性和方法
class Rob extends User
{
public function write1()
{
return parent::write();
}
// 实现抽象类中的抽象方法
public function write2()
{
return "你可以叫我{$this->name}";
}
}
$rob = new Rob;
echo $rob->write1(), '<hr>';
echo $rob->write2();
抽象方法在实现类中必须实现
接口(完全分离设计与实现)
单接口
<?php
interface iUser
{
// 接口常量
const LOCATION = '江西';
// 抽象方法
public function write();
}
// 接口的实现类(关键字implements)
class User implements iUser
{
protected $name = '小殇';
// 实现接口中的抽象方法
public function write()
{
return "姓名:{$this->name},所在地:" . iUser::LOCATION;
}
}
$user = new User;
echo $user->write();
接口的继承
- PHP是禁止多重继承(单继承)
- 通过接口可以实现类似多重继承
<?php
// 接口1
interface iUser1
{
const NAME = '小殇';
}
// 接口2
interface iUser2
{
const LOCATION = '江西';
}
// 接口3(继承接口2)
interface iUser3 extends iUser2
{
public function write();
}
// 接口实现类(实现接口1和接口3)
class User implements iUser3, iUser1
{
public function write()
{
return "姓名:" . self::NAME . ",所在地:" . self::LOCATION;
}
}
$user = new User;
echo $user->write();
用抽象类实现接口(演示数据库操作)
<?php
// 接口
// 引入PDO参数的配置文件
require __DIR__ . '/../0720/config.php';
interface iDbBase
{
// 新增
public function insert($db, $date = []);
// 查询
public function select($db, $optoins);
// 更新
public function update($db, $options = []);
// 删除
public function delete($db, $where);
}
// 用抽象类实现接口
abstract class aDb implements iDbBase
{
// 实现类实现接口方法,操作数据库有一些公共操作可以写在中间的抽象类中实现它
// 比如实现数据表各个操作都需要连接数据库可以在抽象类中实现
protected static $db = null;
public static function connect()
{
if (is_null(self::$db)) {
self::$db = new PDO(DB_DSN, DB_USER, DB_PSD);
}
return self::$db;
}
}
// 最后的工作类(实现类)
class DB extends aDb
{
// 实现接口中的方法
// 新增操作
public function insert($db, $date = [])
{
$stmt = $db->prepare("INSERT `apple` SET `username`=?,`password`=?,`sex`=?");
if ($stmt->execute([$date[0], $date[1], $date[2]])) {
printf("新增成功 %s 条数据,新增的主键id= %d<hr>", $stmt->rowCount(), $db->LastInsertId());
}
}
// 更新操作
public function update($db, $opctions = [])
{
$stmt = $db->prepare("UPDATE `apple` SET `username`=?,`password`=?,`sex`=? WHERE `id`=?");
if ($stmt->execute([$opctions[0], $opctions[1], $opctions[2], $opctions[3]])) {
printf("更新成功 %s 条数据<hr>", $stmt->rowCount());
}
}
// 查询操作
public function select($db, $opctions)
{
$stmt = $db->prepare("SELECT `id`,`username`,`sex` FROM `apple` WHERE `id`>?");
$stmt->execute([$opctions]);
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $user) {
vprintf("序号:%d,姓名:%s,性别:%s<br>", $user);
}
}
// 删除操作
public function delete($db, $where)
{
$stmt = $db->prepare("DELETE FROM `apple` WHERE `id`=?");
if ($stmt->execute([$where])) {
printf("删除成功 %s 条数据<hr>", $stmt->rowCount());
}
}
}
// 调用
$a = new DB;
// 插入操作
$a->insert(DB::connect(), ['小美人', sha1(888), '女']);
// 更新操作
$a->update(DB::connect(), ['小星', sha1(999), '男', 28]);
// 删除操作
$a->delete(DB::connect(), 20);
// 查询操作
$a->select(DB::connect(), 20);
实现类中的方法也可写作静态方法通过类名调用
初识trait(临时类,类中类)
<?php
trait tDemo
{
// 1.常规成员
protected $name = '小殇';
public function getName()
{
return "姓名:{$this->name}";
}
// 2.静态成员
protected static $motto = '好好学习,天天向上';
public function getMotto()
{
return "人生格言:" . self::$motto;
}
// 3.抽象成员
public static $like;
abstract public function getLike();
}
// trait要在实现类中使用
class User
{
// 引用trait(如果trait内有抽象方法,那么在实现类中必须实现)
use tDemo;
public function getLike()
{
return self::$like;
}
}
$user = new User;
// 抽象成员赋值
User::$like = '打游戏';
echo '姓名:' . $user->getName() . '爱好:' . $user->getLike() . '人生格言:' . $user->getMotto();
总结
1.对于抽象类和接口有了一定的认识
2.接口实现数据库操作时碰到挺多问题的,不过最后解决时心里挺有成就感的