1、接口
1.1接口基本语法
//接口中不可以定义属性,可以定义常量
interface Aname
{
// 接口常量
const USER_NAME = '中国';
}
//接口中定义的方法不能有方法体
interface Afun
{
//接口方法
public function fun();
}
//接口可以用extends继承一个或多个接口
// 接口实现多继承
interface Bname extends Aname, Afun
{
public function fun1();
}
//继承接口的类必须实现接口中定义的所有方法,并且类也可以实现多个接口
class User implements Bname
{//实现Aname接口中的 fun()方法
public function fun(){
}
//实现Bname接口中的 fun1()方法
public function fun1(){
}
}
1.2抽象类部分实现一个接口
// 用抽象类来部分实现一个接口
interface VipUser{
//会员等级
public function membership();
//折扣
public function discount();
}
// 用抽象类只实现会员等级这个方法
abstract class User1 implements VipUser{
protected $k='钻石卡';
public function membership(){
return $this->k;
}
}
// 工作类: 实现折扣方法
class User2 extends User1{
protected $z='7折';
public function discount(){
return $this->z;
}
}
$user = new User2();
//通过调用抽象类中的membership()方法获得会员级别
echo $user->membership();
//根据会员级别打折
echo $user->discount();
1.3接口实现多态
//接口实现多态
interface VipUser{
//会员等级
public function membership();
//折扣
public function discount();
//商场名称
public function marketName();
}
//通过商场名称,对顾客的会员等级进行打折
class User1 implements VipUser
{
protected $name='京东商场';
protected $k='钻石卡';
protected $z='打7.5折';
public function marketName(){
return $this->name;
}
public function membership(){
return $this->k;
}
public function discount(){
return $this->z;
}
}
class User2 implements VipUser{
protected $name='天猫商场';
protected $k='钻石卡';
protected $z='打8折';
public function marketName(){
return $this->name;
}
public function membership(){
return $this->k;
}
public function discount(){
return $this->z;
}
}
//通过方法参数,接受了接口实现类对象
class User{
public function name( VipUser $obj){
return $obj->marketName();
}
public function vip( VipUser $obj){
return $obj->membership();
}
public function zhekou( VipUser $obj){
return $obj->discount();
}
}
$user1 = new User1();
$user =new User();
echo $user->name($user1);
echo $user->vip($user1);
echo $user->zhekou($user1);
echo '<hr>';
$user2 = new User2();
echo $user->name($user2);
echo $user->vip($user2);
echo $user->zhekou($user2);
2、Trait
// triat是一个特殊类,与抽象类,接口一样不能实例化,只能嵌入到宿主类中使用。
// 通过在类中使用use关键字,声明要组合的Trait名称,trait里面可以使用:静态成员,抽象成员,普通成员.不能使用常量。
// Trait内的属性会和调用它的类内的同名的属性冲突,优先顺序:当前类成员 > trait类成员 > 基类成员
// 一个类可以组合多个Trait,通过逗号相隔,trait不能在接口中使用。
trait myTrait {
public function demo() {
echo 'triat是一个特殊类<br>';
}
}
class Dad {
use myTrait;
public function demo1() {
echo '我是一个父类<br>';
}
}
class Body extends Dad {
public function demo1() {
echo '我是一个子类<br>';
}
}
$body = new Body();
$body->demo1();
$body->demo1();
$body->demo();
总结:一看就会,一做就废。勤加练习,深入理解。加油!!!