考虑这个问题,先考虑为什么编程思想要进化。
其实初衷很简单——告别ctrl+c,ctrl+v。两个字概括重用。
为了保证代码的可重用性,我们需要对业务进行解耦,降低业务的耦合度,那么首先我们需要封装模块。
面向对象的第一个特征就是有一定弹性的封装,与function或结构这样的封装体不同,面向对象的类可以很灵活的通过private,public,protect限制访问。
那么有了类,考虑在一个类结构中的代码重用。我们就有了继承。父类干什么,子类也干什么。
但显然这样的灵活度不够,我们希望限制父子的行为模式,而非行为内容。比如几个儿子都爱打球,可是老大打羽毛球,老二打乒乓球。于是我们有了抽象类,父子限定对球的喜好,但是喜好的方式和内容交给不同的儿子去实现。
然而灵活度依然不够,我们希望不同家庭喜好球的人进行归类,他们都会购买球拍,关心球赛,于是出现接口。通过接口我们让不同的类出现一致的结构。
有时候我们不仅仅希望不同的类之间有一致的结构还希望他们有一致的行为,就像继承类那样,于是出现了多继承,在PHP这样不支持多继承的语言中出现了traits与接口配合这样的技术方式。
于是在一些复杂的PHP框架中我们就不难理解为什么会出现继承抽象类实现接口,然后在结构体中use各种traits的复杂货色.——框架本身就有胶水的特征。
所以我们看到,面向对象的特征是技术特性,解耦是途径,重用是目标。目的是构建更好的代码逻辑结构,更精简的代码量,更易维护的代码集。
学面向对象不要为了对象而对象,溯本追源,得鱼忘筌或许更好。