面向对象编程就是把需要处理的逻辑对象,当做一个整体,把需要的参数配置赋值给对象,对象内部处理逻辑完全对客户端封闭。只暴露接口给客户端调用。
ps: 有一个问题困惑了我很久,就是数据库的增删改查与业务逻辑的搞混,数据库增删改查应该与逻辑对象分开来,放到数据层。
示例:
需求: 有n种职业,每种职业的不同名称,不同的薪资
新建person表
CREATE TABLE person (
`id` INT(11) NOT NULL auto_increment,
`name` VARCHAR(20) NOT NULL COMMENT '姓名',
`job` TINYINT(1) NOT NULL DEFAULT '1' COMMENT '1老师, 2程序员, 3司机',
PRIMARY KEY(`id`)
) ENGINE=INNODB CHARSET=utf8
现在每个职业都有自己的职业名称,每个职业的工资算法都是不一样的,所以我们创建了三个类
Person抽象类
abstract class Person
{
protected $person;
public function __construct(appcommonmodelPerson $person)
{
$this->person = $person;
}
abstract public function getJobName();
abstract public function getSalary();
public function getName() {
return $this->person->name;
}
}
老师职业
class Teacher extends Person
{
public function getJobName()
{
return "老师";
}
public function getSalary()
{
return 400;
}
}
司机职业
class Diver extends Person
{
public function getJobName()
{
return "司机";
}
public function getSalary()
{
return 500;
}
}
程序员职业
class Programmer extends Person
{
public function getJobName()
{
return "程序员";
}
public function getSalary()
{
return 100;
}
}
客户端调用
class Index
{
public function index($id)
{
$person = Person::get($id);
switch ($person->job){
case 1:
$people = new Teacher($person);
break;
case 2:
$people = new Diver($person);
break;
case 3:
$people = new Programmer($person);
}
return $people->getName(). "是". $people->getJobName(). ' 工资是'.$people->getSalary().'每个月';
}
}
这样处理在增加职业的时候,我们只需要新增职业类和修改调用客户端就可以了,符合开放封闭原则。