PHP面向对象核心(二)
(原创内容,转载请注明来源,谢谢)
三、继承与多态
3.1 继承
1、继承是类级别的复用,关键词为extends;多态是方法级别的复用。
2、类的组合:一个类作为另一个类的属性;类的继承:子类继承父类的全部内容。
3、范围解析运算符(::)
当子类需要调用父类的方法或者属性时使用此运算符;
当调用类常量和静态方法时使用此符号调用。
4、决定采用组合还是继承,目标是低耦合,即使模块之间尽量独立。
继承扩展简单,但破坏封装,且紧耦合;组合缺点是代码量大。
5、当类不是设计用于继承的,可以加上final,避免被继承。
当方法不想被覆盖,也可以加上final,父类方法被子类覆盖。
属性没有final,只有类和方法可以定义为final。
3.2 多态
1、多态可以理解为同一对象在允许时的具体化。
2、重载不等于多态,重载是多态的一种表现形式。
3、多态的实现方式——通过PHP的get_class()方法
PHP执行结果如下:
PHP源码如下:
<?php
class plane{}
class car{}
class other{}
function muti($obj){
$now_class= get_class($obj);
if($now_class== 'plane'){
echo$now_class.'的执行结果是:fly<br />';
}elseif($now_class == 'car'){
echo$now_class.'的执行结果是:drive<br />';
}else{
echo$now_class.'的执行结果是:error<br />';
}
}
muti(new plane());
muti(new car());
muti(new other());
四、接口
1、接口可以视为类与类之间的协议,对于采用接口(implements)的类,都要实现接口内部定义的方法,否则会报fetal错误。
2、PHP接口的不足在于内部接口较少,且没有契约限制,即允许继承接口的类实现接口没有定义的方法。
3、Iterator迭代器接口,实现此接口的类可以采用foreach输出。该接口有五个方法,分别是:current、key、next、rewind、valid。
PHP的SPL中有一个类DirectoryIterator,该类实现了Iterator接口。
IteratorAggregate 接口替代实现所有的Iterator 方法。IteratorAggregate 只需要实现一个方法 getIterator(),即可实现输出结果。
4、traits
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制,可以认为是一种加强型接口。
优先级方面,从基类继承的成员会被trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。
例如:classB::functionName instance of classA,则定义A、B两个类中同名的方法functionName采用B定义的内容。
但是,对于属性,Trait 定义了一个属性后,类就不能定义同样名称的属性,否则会产生 fatal error。除非属性是兼容的(即同样的访问可见度、初始默认值)。
简单示例:
<?php
trait TraitA{
public$a = 10;
public function echoA{
echo $this->a;
}
}
class ClassA{
use TraitA;
}
$a = new ClassA();
$a->echoA();//输出 10
——written by linhxx 2017.06.20