多态的概念
- 可以理解为多种表现形式,即“一个对外接口(方法),多个内部实现”。
- 在面向对象的理论中,多态性的一般定义为:同一个操作(函数)作用于不同的类的实例,将产生不同的执行结果。也即不同类的对象收到相同的消息时,将会得到不同的结果。
实例
- 体会PHP中正常的流程控制的不可取与多态的实用性设计
问题:流程控制的弊端
class Light
{
public function show($type = 0)
{
//流程控制假如灯光颜色非常多,后期添加就会非常麻烦
switch ($type) {
case 0:
echo '灯光是红色。<br>';
break;
case 1:
echo '灯光是白色。<br>';
break;
case 2:
echo '灯光是蓝色。<br>';
break;
case 3:
echo '灯光是紫色。<br>';
break;
default:
echo '灯光是血红色。<br>';
break;
}
}
}
class User
{
function openLight($type = 0)
{
$light = new Light();
$light->show($type);
}
}
$cc = new User();
$cc->openLight();//灯光是红色。
解决一:多态之继承实现
class Light
{
function show()
{
echo '灯光随机演示。' . '<br>';
}
}
class BlueLight extends Light
{
function show()
{
echo '灯光是蓝色。' . '<br>';
}
}
class RedLight extends Light
{
function show()
{
echo '灯光是红色。' . '<br>';
}
}
class Demo
{
function show()
{
echo '我不是灯光。' . '<br>';
}
}
class User
{
/**
* @param $obj
* 开灯
* (Light $obj)限定类型为Light(之后新添颜色继承自Light类)
*/
function openLight(Light $obj)
{
$obj->show();
}
}
$user = new User();
$light = new Light();
$blueLight = new BlueLight();
$redLight = new RedLight();
$demo = new Demo();
$user->openLight($light);//灯光随机演示。
$user->openLight($blueLight);//灯光是蓝色。
$user->openLight($redLight);//灯光是红色。
$user->openLight($demo);//报错,非继承自Light类
解决二:多态之接口实现(推荐)
interface Light
{
function show();
}
class BlueLight implements Light
{
function show()
{
echo '灯光是蓝色。' . '<br>';
}
}
class RedLight implements Light
{
function show()
{
echo '灯光是红色。' . '<br>';
}
}
class Demo
{
function show()
{
echo '我不是灯光。' . '<br>';
}
}
class User
{
/**
* @param $obj
* 开灯
* (Light $obj)限定类型为Light(之后新添颜色继承自Light类)
*/
function openLight(Light $obj)
{
$obj->show();
}
}
$user = new User();
$blueLight = new BlueLight();
$redLight = new RedLight();
$demo = new Demo();
$user->openLight($blueLight);//灯光是蓝色。
$user->openLight($redLight);//灯光是红色。
$user->openLight($demo);//报错,非继承自Light类