Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:接口是要好好学
通过类实现面向对象编程,将通用功能分类,重复使用。
使用抽象类,指定要实现的功能,使功能设计和具体实现部分分离,
接口设计统一规范的功能模块要求
extends
继承父类的属性和方法
//基类:商户信息维护
class Merchant
{
protected $number = '';//商户编号
public $name = '';//商户名称
protected function setNumber(string $number){
$this->number = $number;
}
/**
* 设置名称
*/
public function setName($name)
{
$this->name = $name;
}
/**
* 修正名称
* 返回修正后名称
*/
public function editName()
{
//去掉两端空白字符
$this->name = trim($this->name);
//计算长度
$str_len = mb_strlen($this->name,'utf8');
//如果名称超过20个字,就删除多余字
//如果名称少于9个字,就填充到9个字
if($str_len>20){
$this->name = mb_substr($this->name,0,20,'utf8');
}elseif($str_len<3){
return '无效名称';
}elseif($str_len<6){
$this->name = str_pad($this->name,27,'略',STR_PAD_RIGHT);
}
return $this->name;
}
/**
* 最终方法,不能在子类中重写
*/
final public function getName(){
return $this->name;
}
}
// $merchant = new Merchant;
// $merchant->setName('龙门客栈');
// echo $merchant->getName();
class EditMerchant extends Merchant
{
public static $status = 0;//静态属性,状态
public function setNumber(string $number){
parent::setNumber($number);
}
public function getNumber()
{
return $this->number;
}
/**
* 修正商户编号
*/
public function editNumber()
{
//只允许由数字和字母组成的编号
if(!ctype_alnum($this->number)){
return '非法编号';
$this->number = '';
}
if(strlen($this->number)<12){
$this->number = str_pad($this->number,12,0,STR_PAD_RIGHT);
}
return $this->number = substr($this->number,0,12);
}
}
//直接访问静态属性
echo '商户状态:',EditMerchant::$status?'正常':'停用';//输出:商户状态:停用
//实例化
$editMerchant = new EditMerchant;
$editMerchant->setName('龙门客栈');
//直接调用父类中的方法
echo '<br>', $editMerchant->editName();//输出:龙门客栈略略略略略
//将setNumber重写为公开方法后设置商户编号
$editMerchant->setNumber('88048874HGJK001');
//通过getNumber方法获取受保护的变量
echo '<br>',$editMerchant->getNumber();//输出:88048874HGJK001
//子类中扩展的方法editNumber()
echo '<br>',$editMerchant->editNumber();//输出:88048874HGJK
abstract
定义抽象类和抽象方式
/抽象类和抽象方法
abstract class Card
{
public $cardno = '';
//普通方法
public function setCardno(int $cardno){
$this->cardno = $cardno;
}
//抽象方法,没有方法体,指定子类必须要实现的功能
abstract function editCardno();
}
//抽象类不能实例化
//new Card;//atal error: Uncaught Error: Cannot instantiate abstract class Card
//用常规类来继承抽象类
class EditCard extends Card
{
//父类中的抽象方法必须实现
public function editCardno(){
if(strlen($this->cardno)!==16||strlen($this->cardno)!==19){
return '请使用正确的卡号';
}
return $this->cardno;
}
}
$editCard = new EditCard;
//使用抽象父类中的常规方法
$editCard->setCardno(62284854654642);
echo '<br>','输入的卡号为:',$editCard->cardno;//输出:输入的卡号为:62284854654642
//子类实现了父类中的抽象方法
echo '<br>','判断结果为:',$editCard->editCardno();//输出:请使用正确的卡号
interface
关键字定义接口
//接口定义常量和方法,不具体实现
interface iMessage
{
//接口常量
const MSG_ID = '"code"';
const MSG_CONTENT = '"msg"';
//接口方法
public function getMsg();
}
//类中实现接口中的方法
class Message implements iMessage{
public function getMsg(){
return self::MSG_ID.':'.self::MSG_CONTENT;
}
}
$msg = new Message;
echo '<br>', $msg->getMsg();//输出:"code":"msg"