Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:你说得对, 写得多了 , 就有感觉了, 日久生情
<?php
// 接口编程之场景1:单接口
// 创建接口
interface iSingleinter1
{
const book = '射雕英雄传';
public static function write1();
}
// 工作类实现接口
class iJob implements iSingleinter1
{
protected static $name = '郭靖';
public static function write1()
{
return iSingleinter1::book . '的男主角是: ' . self::$name ;
}
}
// 客户端
echo iSingleinter1::book , '<br>';
echo iJob:: write1();
实例效果
<?php
// 多接口继承
interface iUser1
{
const novel1 = '笑傲江湖';
}
// 接口2继承接口1
interface iUser2
{
const novel2 = '射雕英雄传';
}
// 接口3继承以上两个接口,即继承接口1和接口2
interface iUser3 extends iUser2
{
const novel3 = '小李飞刀';
// 抽象方法
public static function write1();
}
// 工作类
// 为了代码简写,只需写实现接口3就等于接口1、2、3
class Job implements iUser3
{
protected static $name = '张三、李四、王五、马六';
// 实现抽象方法
public static function write1()
{
return self::$name . '最喜欢的武侠小说是:' . iuser1::novel1 . '、' . iuser2::novel2 . '、' . iuser3::novel3;
}
}
// 客户端
echo Job::write1();
实例效果
<?php
// 接口场景3: 用抽象类来部分实现一个接口
interface iUser1
{
const login = '藏经阁';
const kungfu = '降龙十八掌';
// 接口方法1-4----招式内容
public static function moves1();
public static function moves2();
public static function moves3();
public static function moves4();
// 接口方法5----入门
public static function signin();
}
// 用抽象类实现接口5
abstract class Sign implements iUser1
{
public static function signin()
{
return '藏经阁入口登陆成功~~~请看“降龙十八掌”武功秘籍';
}
}
// 工作类
class Move extends Sign
{
public static function moves1()
{
return '第一招:亢龙有悔!';
}
public static function moves2()
{
}
public static function moves3()
{}
public static function moves4()
{}
}
// 客户端
echo Sign::signin(),'<br>';
echo Move::moves1();
实例效果
<?php
// trait 功能与语法
// trait: 代码复用
// trait:与抽象类,接口一样不能实例化, 只能嵌入到宿主类中使用
// triat是一个特殊类: 1. 常规, 2. 静态, 3. 抽象, 不能用类常量
trait tDemo1
{
// 常规
protected $name = '令狐冲';
public function getName()
{
return '我喜欢的一个武侠人物:'. $this->name ;
}
// 静态
protected static $sex = '男';
public static function getSex()
{
return ' 性别 :' . self::$sex;
}
// 抽象
public static $age;
abstract public static function getAge();
}
// 客户端
class Demo
{
// 类中使用trait , 用use 关键
use tDemo1;
// 抽象类方法
public static function getAge()
{
return ' 年龄 :' . self::$age;
}
}
// 创建对象
$demo = new Demo;
// 初始化age
demo::$age = 30;
echo $demo->getName() . demo::getSex() . $demo::getAge();
实例效果
<?php
// 创建格式打印的公共方法集
trait tPrint
{
public function printer()
{
// 获取所有属性的函数:get_class_var,__CLASS__
$property = get_class_vars(__CLASS__);
// 格式化打印属性
printf('<pre>%s</pre>',print_r($property,true));
}
}
// 调用这个公共方法集trait
class user1
{
use tPrint;
protected $name = '令狐冲';
protected $sex = '男';
protected $kungFu = '独孤九剑';
}
echo (new user1)->printer();
class user2
{
// 引用trait
use tPrint;
protected $name = '任我行';
protected $sex = '男';
protected $kungFu = '吸星大法';
}
(new user2)->printer();
class user3
{
protected $name = '东方不败';
protected $sex = '女';
protected $kungFu = '葵花宝典';
use tPrint;
}
(new user3)->printer();
实例效果
总结:
1、接口的场景:单接口、多接口继承、用抽象类实现部分接口等。看老师的实例,重复不断地写了三四次代码,才有点感觉,虽然不是很明白,总算有点进步。学编程,有了老师指导,我最缺的是练习,重复、重复、重复!真的没别的技巧。
2.trait是一种特殊类。关键字:use
功能1:代码复用。可创建公共方法集
在继承上下文环境中,具有优先级:
子类方法>trait方法>父类方法。
这个特点在某些环境中有用处,比如需要跨越父类方法而不能删除父类方法的场景。