服务端 - PHP - OOP之接口
一、概述
- 语法:interface 接口名;
- 描述:对外公开的、能够进行顶层设计的特殊类
- 特点:访问控制必须是public
- 作用:完全分离设计与实现
二、接口成员
- 接口常量:const 常量名;
- 接口方法:接口中的抽象方法,必须在工作类实现;
- 构造方法:魔术方法中的一种,由系统根据一定的条件或用户行为,自动调用/触发,禁止用户主动调用
- 构造方法场景:在类实例化的时候,使用构造方法自动完成类属性的初始化/赋值
三、实现
1. 单接口
//定义一个接口
interface iSetPseronInfo {
//设置
public static function setInfo($name, $sex, $age);
//新增
public function addData(array $data);
//更新
public function upData($source, $nvalue);
//查询
public function queData($seaValue);
//删除
public function delData($seaValue);
}
//定义一个实现类
class SetPseronInfo implements iSetPseronInfo
{
//定义一个空数组用来存储数据
public static $personInfo = [];
//设置
public static function setInfo($name, $sex, $age)
{
array_push(self::$personInfo, array($name, $sex, $age));
}
//新增
public function addData(array $data)
{
array_push(self::$personInfo, $data);
}
//更新
public function upData($source, $nvalue) {
foreach (self::$personInfo as &$value) {
$key = array_search($source, $value);
foreach ($value as $key1 => $ovalue) {
if ($key1 === $key) {
$value[$key1] = $nvalue;
}
}
}
}
//查询
public function queData($seavalue) {
foreach (self::$personInfo as &$value) {
$key = array_search($seavalue, $value);
foreach ($value as $key1 => $ovalue) {
if ($key1 === $key) {
return array_slice($value, $key1);
}
}
}
}
//删除
public function delData($svalue) {
foreach (self::$personInfo as $value) {
if (in_array($svalue, $value)){
$key = array_search($value, self::$personInfo);
unset(self::$personInfo[$key]);
}
}
}
}
//客户端代码
//设置
SetPseronInfo::setInfo('小明', '男', 18);
printf('<pre>1. 设置后此时的数据为<br>%s</pre>', print_r(SetPseronInfo::$personInfo, true));
//新增
(new SetPseronInfo)->addData(['小红', '女', 17]);
(new SetPseronInfo)->addData(['小王', '男', 19]);
(new SetPseronInfo)->addData(['小倩', '女', 18]);
printf('<pre>2. 新增后此时的数据为<br>%s</pre>', print_r(SetPseronInfo::$personInfo, true));
//更新
(new SetPseronInfo)->upData('小红', '小雪');
printf('<pre>3. 更新后此时的数据为<br>%s</pre>', print_r(SetPseronInfo::$personInfo, true));
//查询
printf('<pre>4. 查询的数据为<br>%s</pre>', print_r( (new SetPseronInfo)->queData('小雪'), true));
//删除
(new SetPseronInfo)->delData('小王');
printf('<pre>5. 删除后此时的数据为<br>%s</pre>', print_r(SetPseronInfo::$personInfo, true));
2. 多继承
//定义第一个接口
interface iSetPersonInfo {
//设置
public static function setInfo($name, $sex, $age);
}
//定义第二个接口
interface iCRUD {
//新增
public function addData(array $data);
//更新
public function upData($source, $nvalue);
//查询
public function queData($seaValue);
//删除
public function delData($seaValue);
}
//定义第三个接口继承自第一和第二个接口
interface iPerson extends iSetPersonInfo, iCRUD {}
//定义一个实现类
class Pseron implements iPerson {
//定义一个空数组用来存储数据
public static $personInfo = [];
//设置
public static function setInfo($name, $sex, $age)
{
array_push(self::$personInfo, array($name, $sex, $age));
}
//新增
public function addData(array $data)
{
array_push(self::$personInfo, $data);
}
//更新
public function upData($source, $nvalue) {
foreach (self::$personInfo as &$value) {
$key = array_search($source, $value);
foreach ($value as $key1 => $ovalue) {
if ($key1 === $key) {
$value[$key1] = $nvalue;
}
}
}
}
//查询
public function queData($seavalue) {
foreach (self::$personInfo as &$value) {
$key = array_search($seavalue, $value);
foreach ($value as $key1 => $ovalue) {
if ($key1 === $key) {
return array_slice($value, $key1);
}
}
}
}
//删除
public function delData($svalue) {
foreach (self::$personInfo as $value) {
if (in_array($svalue, $value)){
$key = array_search($value, self::$personInfo);
unset(self::$personInfo[$key]);
}
}
}
}
//客户端代码
//设置
Pseron::setInfo('小明', '男', 18);
printf('<pre>1. 设置后此时的数据为<br>%s</pre>', print_r(Pseron::$personInfo, true));
//新增
(new Pseron)->addData(['小红', '女', 17]);
(new Pseron)->addData(['小王', '男', 19]);
(new Pseron)->addData(['小倩', '女', 18]);
printf('<pre>2. 新增后此时的数据为<br>%s</pre>', print_r(Pseron::$personInfo, true));
//更新
(new Pseron)->upData('小红', '小雪');
printf('<pre>3. 更新后此时的数据为<br>%s</pre>', print_r(Pseron::$personInfo, true));
//查询
printf('<pre>4. 查询的数据为<br>%s</pre>', print_r( (new Pseron)->queData('小雪'), true));
//删除
(new Pseron)->delData('小王');
printf('<pre>5. 删除后此时的数据为<br>%s</pre>', print_r(Pseron::$personInfo, true));
3. 多态编程
//定义一个用户查询接口
interface iUser {
//定义构造方法:用于初始化对象属性
public function __construct(...$params);
//定义抽象方法:用于获取用户信息
public function getUserInfo ();
}
//定义第一个实现类:获取普通用户的信息
class ComUser implements iUser {
//定义一个受保护属性:用于
public static $id = null;
//实现接口的构造方法
public function __construct(...$params) {
list($name, $sex, $age, $id) = $params;
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
self::$id = $id;
}
//实现接口的抽象方法
public function getUserInfo () {
return '姓名:'.$this->name.' '.'性别:'.$this->sex.' '.'年龄:'.$this->age.' '.'会员状态:'.(self::$id ? '是会员' : '不是会员');
}
}
//定义第二个实现类:获取会员用户的信息
class PlusUser implements iUser {
//定义一个受保护属性:用于
public static $id = null;
//实现接口的构造方法
public function __construct(...$params) {
list($name, $sex, $age, $id) = $params;
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
self::$id = $id;
}
//实现接口的抽象方法
public function getUserInfo () {
return '姓名:'.$this->name.' '.'性别:'.$this->sex.' '.'年龄:'.$this->age.' '.'会员状态:'.(self::$id ? '是会员' : '不是会员');
}
}
/*$p1 = new ComUser('小明', '男', 18, 0);
echo $p1->getUserInfo();
echo ComUser::$id;
echo '<br>';
$p2 = new PlusUser('小红', '女', 17, 1);
echo $p2->getUserInfo();
echo PlusUser::$id;*/
//定义一个通用工作类:当传进去的参数为不同的账户时,调用不同账户的相同的方法名,产生不同的效果
class User {
public function clearP($p) {
return $p->getUserInfo();
}
}
//客户端代码
//实例化通用工作类
$p = new User;
//普通成员
$p1 = new ComUser('小明', '男', 18, 0);
echo $p->clearP($p1);
echo '<br>';
//会员
$p2 = new PlusUser('小红', '女', 17, 1);
echo $p->clearP($p2);
四、课程总结
- 今天学习了 PHP 的面向对象编程,通过上课认真听讲和认真完成老师布置的作业,使得我对 PHP 面向对象编程的理解和运用更加深入和熟悉。最主要的知识点是明白和掌握了接口的特点以及单接口、多继承和多态编程的基本用法。