Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:不要被接口, trait,抽象类等吓住, 其实都是类, 只不过比较特殊而已, 就像是一个国家的少数民族, 本质仍是国家成员一部分
简单的继承,只能实现单继承,如果想要多继承的话,就必须使用interface
(接口),通过多个接口的继承,来达到目的,通过这个案例来了解一下。
接口技术主要用来实现,三大特性中的多态,那多态是什么呢?
多态最直接的定义就是让具有继承关系的不同类对象,可以对相同名称的成员函数调用,产生不同的反应结果
interface
;实例:
// 这里一个接口,里面有三个抽线方法,接口可以理解为一种抽象类,因为里面的类默认就是抽象的,变量也是抽象的
interface iShopping
{
const money = '5000';
public function buyPhone($type);
public function buyComputer($type);
}
interface iGoshopping
{
const distance = '50';
public function goWalk($time);
public function goTaix($money);
}
// 实现类
class User implements iShopping,iGoshopping
// 可以看到User继承了两个类,就间接的实现了多继承,
// 但注意必须将接口的方法全部实现,少一个都不行
{
public function goWalk($time)
{
if($time > 2):
echo '走不过去'.'<br>';
else:
echo '能走过去'.'<br>';
endif;
}
public function goTaix($money)
{
if($money > 50):
echo '太贵了,打不起车'.'<br>';
else:
echo '可以打车'.'<br>';
endif;
}
public function buyPhone($type)
{
echo '可以买'. $type.'<br>';
}
public function buyComputer($type)
{
echo '可以买的电脑'.$type.'<br>';
}
}
$user = new User;
$user -> goWalk(5);
$user -> goTaix(20);
$user -> buyComputer('华为');
$user -> buyPhone('小米');
输出:
走不过去
可以打车
可以买的电脑华为
可以买小米
看上去有点像类又像接口,既有类的常规属性,又有抽象的方法,其实都不是,trait可以看作是类的部分是按,可以引用到现有的多个PHP类中,起作用只有两个:表明类可以做什么;提供模块化实现。Trait是一种代码复用技术,为PHP的单继承限制提供一套灵活的代码复用机制。
当有一个方法需要在很多的类中使用时,该怎么处理?
通常一般的处理方式是,写一个基础类,在基类中实现这个方法,然后所有类都继承这个基类。
这是一种处理方法,单不是最好的处理方式。通常采用继承的情况是:几个类具有很大的相似性。比如人作为一个基类,学生、工人、等继承‘人’ 这个基类来扩展。
由此,trait的作用就出来了,trait可以在多个类中使用
示例:
// trait实例
// trait的代码复用,与优先级
trait iFruit
{
// 常规属性
protected $fruit = 'banana';
public function getFruit()
{
return '名称'.$this->fruit.'<br>';
}
// 静态
public static $weight = '1.9';
public static function getWeith()
{
return '重量'.self::$weight.'<br>';
}
// 抽象
// 抽象静态属性
public static $source;
// 抽象静态方法
abstract public static function getSource();
}
class Dad
{
public static function getWeith()
{
return '父类中的方法'.__METHOD__.'<br>';
}
}
class Banana extends Dad
{
// 可以看到子类继承了父类,但是trait中的同名方法将父类中同名方法重写了
// 继承关系:子类 > trait > 父类
// trait的功能之一,代码复用
use iFruit;
public static function getSource()
{
return '产地'.self::$source;
}
public function print()
{
echo $this->getFruit(). self::getWeith() .self::getSource();
}
}
banana::$source = '泰国';
$banana = new Banana();
$banana -> print();
输出:
名称banana
重量1.9
产地泰国
接口可以实现多继承,也实现面向对象中的多态,就是对相同名称的函数的调用,而产生不同结果,trait提供了代码复用技术,在一些需要重复使用的方法或属性,我们就可以用trait
把他们做好,在子类中引用就行,总的来说面向对象编程主要就围绕着两方面在讲,三个特性,封装,继承,多态,设计与实现,所有的技术都可以总结到这个上面,这可能就是代码的艺术,不仅仅是代码,让代码变得更加灵活多变。