面向对象编程的深入理解

面向对象编程就是把需要处理的逻辑对象,当做一个整体,把需要的参数配置赋值给对象,对象内部处理逻辑完全对客户端封闭。只暴露接口给客户端调用。

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
image-20211012161328201

现在每个职业都有自己的职业名称,每个职业的工资算法都是不一样的,所以我们创建了三个类

面向对象理解 (1)

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().'每个月';
    }
}

这样处理在增加职业的时候,我们只需要新增职业类和修改调用客户端就可以了,符合开放封闭原则。

原文地址:https://www.cnblogs.com/echoou/p/15405426.html