面向对象的主要特征有抽象,继承,封装和多态
1.抽象:说到抽象大家可能会联想到抽象类,抽象方法之类的。这样有助于大家理解,就是不去定义具体的实现,比如定义一个方法,没有具体的实现,它的实现由子类来完成,不同的子类可能有不同的具体实现,但是都拥有同一个方法。
<?php
abstract class Test {
public abstract function a ();
}
2.继承:这个有点类似遗传学,同样的,如果一个类继承了另外一个类,也就继承了父类的方法或者实例变量,并且子类是可以修改或者增加新的方法以适应新的需要。
<?php
class A {
private $a = 1; //只能在类的内部能访问,子类不能访问,可以理解为不被子类继承
protected $b = 2; //可以在类的内部,或者子类中可以访问
public $c = 3; //类的内部,子类中,类的外部都可以访问
private function t1 () {
echo "this is t1 function\r\n";
}
public function t2 () {
echo "this is t2 function\r\n";
}
public function t3 () {
echo "this is t3 function\r\n";
}
}
class B extends A {
public function t3() {
echo "this is sub t3 function\r\n";
}
}
$foo = new A();
$bar = new B();
$foo->t2();
$bar->t2();
$foo->t3();
$bar->t3();
看下输出结果:
print.png
3.封装:封装就是对类的内部的变量,方法加了保护,我们经常会看到的访问控制权限有,private,protected,public 这三种,具体的描述请看上面的那个例子里面的注释。
4.多态:多态是指允许不同类的对象对同一消息做出不同的响应,比如在开完会后老板叫大家回去继续工作,假设员工来自不同的部门,那实际上不同的部门负责不同的工作,老板并没有吩咐大家具体做什么工作,具体的工作由每个部门自行完成。因为不同的语言由不同的特性,因此实现多态的方式也会不一样。我们重点来看下php的实现:
<?php
abstract class employee {
abstract function working();
}
class teacher extends employee {
public function working() {
echo '教书';
}
}
class coder extends employee {
public function working() {
echo '敲代码';
}
}
function doprint($obj) {
if (get_class($obj) == 'employee') {
echo 'Error';
} else {
$obj->working();
}
}
doprint(new teacher());
doprint(new coder());
doprint(new employee());
看到这里,有同学可能会说那我可以直接调用coder类或者teacher类的working()方法,岂不是更快?,确实是可以,但是这种调用方法不是我们要说的多态。
思考:
1.其他语言多态的实现方式,比如C,C++,Java
网友评论