接口
1、基本语法和使用场景
声明关键字:
interface
语法和类相似: 抽象方法, 常量, 构造方法
所有方法都是抽象方法
访问控制必须是public
接口: 完全分离了” 设计(抽象类中完成)与实现(工作类中完成)
实现接口关键字:implements
突破php类的继承限制,实现多继承(多层级)
2、接口成员和接口继承
接口成员有:
接口常量
、接口方法
、构造方法
3、实例演示代码:
单接口:
<?php
// 接口使用场景1: 单接口
interface iActor
{
// 接口常量
const NATION = '中国';
// 接口方法: 都是抽象方法
public function resume();
}
// 工作类实现接口
class Lending implements iActor
{
protected $name = '张小哥';
// 接口中的抽象方法,必须在工作类实现
public function resume()
{
return $this->name . ' 的国籍是: ' . iActor::NATION;
}
}
// 客户端
$lending = new Lending;
echo $lending->resume();
效果图:
接口多继承:
<?php
// 接口多层级继承
interface iName
{
// 接口常量
const NAME1 = '张三丰';
}
interface iSchool
{
// 接口常量
const SCHOOL1 = '武当';
}
interface iNfor
{
// 接口方法
public function in();
}
// 实现类
class User implements iName, iSchool, iNfor
{
public function in()
{
return iName::NAME1 . '--->' . iSchool::SCHOOL1 .'<br>';
}
}
echo ( new User)->in();
效果图:
抽象类部分实现接口方法:
<?php
// 抽象类部分实现接口方法
interface iPerformanc
{
public function bushi(int $diem, int $base1);
public function jishu(int $base);
}
// 用抽象类只实现接口的一个方法: jishu()
abstract class cAlculat implements iPerformanc
{
public function jishu(int $base)
{
return $base;
}
}
// 工作类
class Tinh extends cAlculat
{
public function bushi(int $diem, int $base)
{
return $hieuqua = $base * 0.6 * (($diem-100)/100);
}
}
// 调用
$base = (new Tinh) -> jishu(549);
echo '绩效是:' .(new Tinh) -> bushi(116,$base);
效果图:
接口实现多态操作:
<?php
namespace demo2;
//接口实现多态
interface iPerformanc
{
const JISHU = 520;
public function cach(int $diem);
}
// cach tinh bushi
class Bushi implements iPerformanc
{
public function cach(int $diem)
{
return $jixiao = iPerformanc::JISHU * 0.6 * (($diem-100)/100);
}
}
// cach tinh xuong
class Xuong implements iPerformanc
{
public function cach(int $diem)
{
return $jixiao = iPerformanc::JISHU * 0.8 * (($diem-100)/100);
}
}
// 调用
// 计算部窒绩效
echo (new Bushi) -> cach(116) .'<br>';
// 计算分厂绩效
echo (new Xuong) -> cach(116) .'<br>';
效果图:
trait
调用关键字:
use
声明关键词:trait
trait里面可以有:静态成员,抽象成员,普通成员;不能使用常量。
trait内的属性会和调用它的类内的同名的属性冲突:
优先顺序:当前类成员 > trait类成员 > 基类成员
一个类可以继承多个trait, 通过逗号相隔
trait不能在接口中使用
实例演示代码:
<?php
// trait: 间接实现横向多继承
trait myTrait
{
public static $name = '我是: Trait中的属性';
}
class Tinhluong
{
public static function in() {
return '父类方法: Tinhluong';
}
}
class Tinhson extends Tinhluong
{
use myTrait;
public static function in() {
return '子类方法: Tinhson';
}
}
echo Tinhluong::in() .'<br>';
echo Tinhson::$name .'<br>';
echo Tinhson::in() .'<br>';
实例演示效果图: