批改状态:合格
老师批语:不要被接口, 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把他们做好,在子类中引用就行,总的来说面向对象编程主要就围绕着两方面在讲,三个特性,封装,继承,多态,设计与实现,所有的技术都可以总结到这个上面,这可能就是代码的艺术,不仅仅是代码,让代码变得更加灵活多变。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号