<?php
/*
?* WEB开发笔记 www.chhua.com 每日练习 PHP 设计模式初级 PHP生成对象的方法
?*/
/*
?* 场景说明:老板,老板的方法——解雇员工,员工,员工作出反应
?*/

abstract class Employee {//员工的抽象基类
?protected $name;
?
?function __construct($name){//构造方法
??$this->name=$name;
?}
?
?abstract function fire();//抽象方法
}

class minion extends Employee{//员工的具体实现的子类
?function fire(){//覆写父类的抽象方法
??echo $this->name.”:我要起诉你!”;
?}
}

/*class NastyBoss {//角色为老板的类
?private $employees=array();//包含很多员工,数组内容为员工实例对象
?
?function addEmployess($employeeName){//添加员工方法
??$this->employees[]=new minion($employeeName);//每当添加就按照名字生成一个员工对象,放在员工数组里
?}
?
?function projectFails(){//老板的一个解雇方法
??if (count($this->employees)>0){//解雇最后一个加入的
???$emp=array_pop($this->employees);//得到最后一个加入的对象
???$emp->fire();//调用最后一个加入的员工的方法
??}
?}
}

$boss=new NastyBoss();//实例化老板
$boss->addEmployess(“BOB”);//加入一个员工
$boss->addEmployess(“MARY”);//加入一个员工
$boss->addEmployess(“Harry”);//加入一个员工

$boss->projectFails();*///Harry:我要起诉你!
/*
?*注:以上就是通过用PHP组合来实现多态的最简单的例子。
?*注意观察对象的生成和关系,类和类之后组合完成一个工作,但类和类之间又是相互独立的。
?*
?*然而以上的方法会出现一个问题,例如:不同的员工可能会有不同的方法和属性,那么就必须声明其它的类改造如下:
?*
?*/

class goto extends Employee {
?function fire(){
??echo $this->name.”:我直接走人!”;
?}
}

class NastyBoss {//角色为老板的类
?private $employees=array();//包含很多员工,数组内容为员工实例对象
?
?function addEmployess(Employee $employeeName){//添加员工方法,以对象当参数
??$this->employees[]=$employeeName;//每当添加就按照名字生成一个员工对象,放在员工数组里
?}
?
?function projectFails(){//老板的一个解雇方法
??if (count($this->employees)>0){//解雇最后一个加入的
???$emp=array_pop($this->employees);//得到最后一个加入的对象
???$emp->fire();//调用最后一个加入的员工的方法
??}
?}
}

$boss=new NastyBoss();//实例化老板
$boss->addEmployess(new minion(“BOB”));//加入一个员工
$boss->addEmployess(new goto(“MARY”));//加入一个员工
$boss->addEmployess(new minion(“Harry”));//加入一个员工

$boss->projectFails();//Harry:我要起诉你!
$boss->projectFails();//MARY:我直接走人!

?>