好,今天来给大家总结一下我觉得的面向对象。

首先,我们带着问题去想。

问题就是:什么是面向对象?

过去一些学校老师每当讲到面向对象的章节,都会猫不犹豫的定义一些class(类)。那么,这就是面向对象了么?过去我也是这么认为的,但现在看来,其不然。

那么到底什么才是面向对象呢?

相信到这里大家都有一些疑惑。那平时咱们写那么多的类,难道都不是面向对象?我很遗憾的告诉你,并不全是。包括我一年前刚入职写了很多代码,也维护过很多'前辈'的项目,当时又傻又天真的以为:'哇,这代码真特么牛逼,一个类就几百几千行'。

现在回头一想,哎呀我去,我都没眼看了,那些代码,跑着跑着,是会出bug的,他们的质量不过关就,那上去跑了,跑条毛啊,最终还不是返回来给我们改bug。

到目前为止,我已经慢慢开始转变了这些想法。其实那都不是叫面向对象,因为他们把不同类本身该有的事情都综合起来一个类里面,所以它本身只是个类,并不具备面向对象的基本特质。

回来正题,继续探究面向对象。想想我们人类。举个简单的例子:

/** 
 * 抽象人类,人们说的人类,反正就是随你想的
 */
Interface Human
{
    public function setLastName($last_name);

    public function getLastName();

    public function setFirstName($first_name);

    public function getFirstName();
}

/** 
 * 我老爸
 */
class Father implement Human
{
    /** 
     * 姓,在国内,姓是不能随便改的,当然也是可以改。所以这里修饰成保护
     */
    protected $last_name;

    public $first_name;

    public function setLastName($last_name)
    {
        $this->last_name = $last_name;

        return $this;
    }

    public function getLastName()
    {
        return $this->last_name;
    }

    public function setFirstName($first_name)
    {
        $this->first_name = $first_name;

        return $this;
    }

    public function getFirstName()
    {
        return $this->first_name;
    }
}

/** 
 * 儿子 - 我
 */
class Son extends Father
{

}

$father = new Father();
$father->setLastName('黄');

$son = new Son();
$son->setFirstName("总");
// 打印我的名字
echo $son->getLastName() , $son->getFirstName();

既然我继承我老爸,当然是跟我老爸姓的啦。要改姓也可以,得问问老爸是否同意先。

不过一般我们的做法是

直接定义一个'Son'类,然后里面各种方法,甚至一些人类不可以做到的方法,比如会飞(不借助工具),反正就是一个类里头夹杂各种不可思议的方法,真的是万万没想到。那么如果是这样,那其实我就不认为这是面向对象了,而是简单的定义类而已。

其实面向对象是有一系列的继承关系,实现关系,依赖关系组成。写代码,做开发,其实和生活是息息相关的,多留意自己的生活,多拿生活例子在开发工作中举例,其实,原理就一目了然了。

继续回来上面的话题,继续面向对象。

比如说,我老爸会使用工具,但是我也会,而且过程,结果大不相同,而且使用的工具也不一样,而且这个工具是需要买,或者找别人借的,不是自己家的。结合上面的小例子稍微修改一下。

/** 
 * 抽象人类,人们说的人类,反正就是随你想的
 */
Interface Human
{
    ......   // 代码省略
    public function useTools(ToolInterface $toolInterface = null);
}

/** 
 * 我老爸
 */
class Father implement Human
{
    /** 
     * 姓,在国内,姓是不能随便改的,当然也是可以改。所以这里修饰成保护
     */
    ...... // 代码省略
    public function useTools(ToolInterface $toolInterface = null)
    {
        $result = $toolInterface->useTool();
        ......//代码省略,自由发挥
        // 用工具得到结果,经过老爸一系列加工,变成了不一样的东东
        return $result
    }
}

/** 
 * 儿子 - 我
 */
class Son extends Father
{
    ...... // 代码省略
    public function useTools(ToolInterface $toolInterface = null)
    {
        // 使用工具,我想调整一下这个工具再使用
        ......// 调整中
        $result = $toolInterface->useTool();
        ......//代码省略,自由发挥,加工结果
        return $result
    }
}

Interface ToolInterface 
{
    public function useTool();
}

class Nokia implements ToolInterface
{
    // 代码自己想想
    public function useTool();
}

class IPhone20Plus implements ToolInterface
{
    // 代码自己想想
    public function useTool();
}

$father = new Father();
$father->setLastName('黄');

$son = new Son();
$son->setFirstName("总");
// 打印我的名字
echo $son->getLastName() , $son->getFirstName();
// 使用工具, 我不管他们怎么使用,反正我就是给了他了。而且,只要是个工具(实现ToolInterface)就行了
$father->useTool(new Nokia());
$son->useTook(new IPhone20Plus());

那么其实到这里,你可以很清晰的看到,其实这,才算是"我理解"的面向对象。每个类都有自己单独,独有的方法,不同的操作。

而且在后面工具的哪里,我并没有强制的在内部是使用工具,而是在外部通过注入的方式去实现想要的。

再想想现实中,我们用的iPhone,安卓,到底是哪里来的呢?就是买来的嘛,总没有说自己出一款,就算是自己出的,零件也是需要依赖各个地方的吧。所以其实我们整个生活圈就是一个很大的生态系统,你在编程世界里面有的,基本上在生活当中都能找到影子。

而且这样有一个很好的好处,就是你会不知不觉的,降低了类与类之间的耦合性了,我们面向对象,要的不就是这个效果吗?再结合学过的知识,面向对象的特性,好好思考这些问题,不断考量,改善自己的这些想法。

希望这篇文章可以帮助到一些对这方面还有困惑,不解的小白。有什么地方说的不足的,还请各位大大指点,感谢各位。

By Jan(我也是一个一年多的小白)


黄总
778 声望110 粉丝

不能因为菜刀能砍人你就以为菜刀只能砍人