怪我咯2017-04-10 16:55:391楼
拿C语言来说,语言层面根本就不支持C++、Java那种性质的面向对象,但像PHP、Apache、Nginx、Linux这些C程序,不一样能做到良好的模块化么?像Go和Rust这两门极具代表性的新生代语言,都没有采用Java/C++那种类型的面向对象和异常处理,由此可见,这两个东西的确存在缺陷。所以,在PHP编程中不要盲目像Java那样教条主义地使用面向对象和异常处理。从Linux C库的API和PHP内置的库函数其实都可以看出,其组织形式并不是Java类库那种“面向对象”的方式,但使用起来却非常方便,所以说封装成函数,一样是能够实现代码重用的。
拿人吃饭来说:
面向过程强调的是"吃饭","人"只是一个参数.比如mysqli_connect生成的连接对象作为mysqli_系列函数的一个参数.
面向对象强调的是"人","吃饭"只是一个动作.比如new mysqli生成的连接对象,可以直接调用mysqli类的方法和变量.
不是什么时候都必须要用面向对象的,哪个方便就用哪个。
王垠看待面向对象编程:
http://www.yinwang.org/blog-cn/2015/04/03/paradigms/
王垠这篇文章中关于OOP的见解,提到了,面向对象=过程式+抽象,同时指出了完全面向对象导致过度抽象的问题,过度抽象反而会增加耦合.
“对象思想”作为数据访问的方式,是有一定好处的。
然而“面向对象”(多了“面向”两个字),就是把这种本来良好的思想东拉西扯,牵强附会,发挥过了头。很多面向对象语言号称“所有东西都是对象”,把所有函数都放进所谓对象里面,叫做“方法”,把普通的函数叫做“静态方法”。实际上只有极少需要抽象的时候,需要使用内嵌于对象之内,跟数据紧密结合的“方法”。其他的时候,你其实只是想表达数据之间的变换操作,这些完全可以用普通的函数表达,而且这样做更加简单和直接。把所有函数放进对象的做法是本末倒置的,因为函数本身并不属于对象,它们只是对象上面的变换操作。绝大部分函数是独立于对象的,它们不能被叫做“方法”。强制把所有函数放进它们本来不属于的对象里面,把它们全都作为“方法”,导致了面向对象代码逻辑过度复杂。很简单的想法,非得绕好多道弯子才能表达清楚。很多人至今不知道自己所用的“面向对象语言”里面的很多优点,都是从过程式语言继承来的。
大多数的面向对象语言里都缺乏正确的实现一等函数的机制。Java语言是一个极致,它完全不允许将函数当作数据来传递。你需要将全部的函数都封装进类,然后称它们为“方法”,但就像我说的,这是绑架。缺乏一等函数是为什么Java里需要这么多“设计模式”的主要原因。一旦有了一等函数,你将不再需要大部分的这些设计模式。