查看: 78|回复: 0

    学会面向对象编程只需要300秒,10万程序员都在看

    [复制链接]
  • TA的每日心情

    2018-1-24 18:38
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    21

    主题

    27

    帖子

    156

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    156

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2018-1-9 12:46:49 | 显示全部楼层 |阅读模式
          面向对象编程思想简介
      什么是编程思想?
      所谓的编程思想,就是人们用计算机来解决实际问题的时候的一种思维方式,或者说是一种基本的策略;
      常见的编程思想有面向过程和面向对象,很多语言的语法各不相同,但是,基本的编程思想却是差不多的!
      PHP同时支持面向对象和面向过程两种编程思想的语言!
      面向过程的编程思想
      传统的面向过程的编程思想总结起来就八个字——自顶向下,初步细化! 基本策略如下:
      ü将要实现的功能描述为一个从开始到结束的按部就班的连续的“步骤”(面向过程)
      ü依次逐步完成这些步骤,如果某一个步骤的难度比较大,又将该步骤再次细化为若干个子步骤,依次类推,一直到结束得到想要的结果!
      ü程序的主体是函数,一个函数就是一个封装起来的模块,每个模块都可以实现特定的功能,各个子步骤往往就是通过各个函数来完成的,从而实现代码的重用和模块化编程!
      案例:大家去学校“报名上学”这件事,可以分成哪些步骤?
      所谓的面向过程,就是将上面分析好了的步骤,依次执行就行了!
      面向对象的编程思想
      所谓的面向对象,就是在编程的时候尽可能的去模拟现实世界!
      现实世界中,任何一个操作(动作)或者是任何一个业务逻辑的实现都需要一个实体去完成,实体就是操作(动作)的支配者,没有实体,就没有动作发生!
      思考:上述报名的每一个步骤都有哪些动词?
      提出 提供 分配 增加
      有动词就一定有实现这个动词的实体!
      所谓的模拟现实世界,就是使计算机的编程语言与解决相关的业务逻辑的时候,与真实的现实世界中的业务逻辑的发生保持一致!需要使某个动作都是依赖于一个实体的“动作/操作/行动”,可以看做是一个一个的实体在发挥其各自的“能力”并在内部进行协调有序的调用过程!
      如果采用面向对象的思想,解决上面的报名的问题应该如下:
      1,分析哪些动作是由哪些实体发出的!
      提出 提供 分配 增加
      学生提出报名->学生缴费->学校收费->老师分配教室->班级增加学生信息
      于是,在整个的报名过程中,一共出现了多少个实体?
      四个:学生、x学校、老师、班级
      在现实中的一个具体的实体,就是计算机编程中的一个具体的对象!
      2,定义这些实体,为其增加相应的属性和功能(功能就是能完成的动作,在面向对象的专业术语中叫作方法,其实也就是函数)
      1,让实体,去执行相应的功能或动作!
      学生提出报名
      学生缴费
      机构收费
      教师分配教室
      班级增加学生信息
      班级管理学生信息
      所以说,面向过程主要是针对功能,但是面向对象主要是针对能够实现这些功能的主体(实体)
      从面向过程到面向对象编程思想的转变
      以前写代码,首先想到的是需要实现什么功能——可以调用系统函数,也可以自己定义函数,或者按部就班的执行!
      以后写代码,首先想到的是应该有什么样的实体(主体)去完成什么样的功能,再把这些实体的属性和功能进行封装,最后才去实现这些实体的功能!
      面向对象不是一种技术,而是一种思想,是一个解决问题的最根本的思维方式!
      所以,面向对象的核心思想是:不仅仅是简单的将某些功能进行封装,而是对调用该功能的主体进行封装,如果一个实体拥有多个功能的话,在使用的过程中,先得到相关的对象,再使用对象去调用其相关的功能!
      面向对象与面向过程的对比
      1,都可以实现代码重用,以实现模块化编程,但是面向对象的模块化更深,数据更封闭,也更加安全!
      2,面向对象的思维方式更加贴近现实生活,所以也更容易解决大型的复杂的业务逻辑!
      3,从前期开发的角度来看,面向对象比面向过程要复杂的多,但是从维护和升级的角度来看,面向对象远比面向过程简单!
      面向对象基本概念
      面向对象的阶段概念
      OOA:面向对象分析、OOD:面向对象设计、OOP:面向对象编程
      对象的概念,什么叫做对象,object,现实业务逻辑中的一个动作实体,就对应着OOP编程中的一个对象!
    所以:
      对象是采用属性(property)来保存数据!
      对象是采用方法(method)来管理数据!
      对象如何产生呢?又如何规程对象的属性和方法呢?
      在PHP中,对象是由类实例化而来的,也就是说,在PHP中,要想产生一个对象,必须先有一个类!
      什么是类?
      类其实就是得到对象的一种方法而已!只不过在大多数的面向对象编程语言中,都是通过类来产生对象,但是,也有的面向对象的语言,产生对象的时候是不需要类的!
      为什么要引入类的概念?
      其实类本来也是对现实世界的一种模拟,在现实世界中,任何一个实体都有一个类别!
      类就是具有相同或相似的特征特性的该类事物的一个通用的名称!
      比如:我们都属于人类,人类又都属于灵长动物类,灵长动物类又都属于动物类,动物类又都属于生物类!
      所以,在php中,一个对象是指现实中的一个具体的实体,而既然现实中的每一个实体都有一个类别,所以OOP中的对象也应该都有一个类!
      一个对象的所有应该具有的特性特征信息,都是由其所属的类决定的!但是每个对象又很有可能有自己不同的特征特性信息,比如我自己这个对象名字叫圣骑士,性别男,会写程序,会教书;另外一个对象可能叫章子怡,性别女,会演戏!
      类的定义
      使用class关键字来定义的!
      这就是一个类,只不过里面什么都没有!
      其中,类名不区分大小写,由字母数字和下划线构成,第一个不能为数字,一般类名采用大驼峰法命名(主要是区别方法名或函数名,我们一般使用小驼峰法来表示函数名和方法名)
      思考:类中可以有什么呢?
      先回忆一下以前面向过程中,我们的代码有什么?
      定义常量和变量、定义函数
      使用变量和常量(增删改查)
      调用函数、流程控制(if—else for while do-while 、foreach等)
      语法上,一个类的内部可以具有自己的“变量”和“函数”,但此时技术术语上应该称为“属性”和“方法”,而且,一个类也可以有自己的常量(类常量),
      上面的属性、方法、常量就称之为是类的“成员”!
      所以,定义一个类,其实就是定义三种成员:定义属性(变量)、定义方法(函数)、定义常量(类常量)
      一个需要注意的地方就是,需要对成员进行声明才可以使用!
      声明采用的是访问修饰限定符来声明的,一共有三个:public,protected,private,暂时全部用public来声明,其中另外两个后面才学习!
      有两个特殊的:
      1,public可以用var来代替!只是对低版本的一种兼容!
      2,方法的前面可以省略掉访问修饰限定符!默认的就是为public
    相当于:
      上面就定义了一个含有名字和Money金额和一个缴费方法的学生类!
      注意,在定义类的时候,如果没有给某个属性赋值,默认的就有null型,但是如果给其附上一个初始值,就必须是一个“直接值”,不能是一个表达式计算后的值!
    利用类得到对象
      注意:类本身什么都做不了,必须利用类得到对象,这个过程就叫作类的实例化!
      类的实例化是通过关键字new来完成的!
      语法是:new 类名;
      上面已经实例化了一个对象,不过对象一般都是放到一个变量里面!
      对象如何访问?使用箭头-> 实现对对象成员的访问!
    可以实例化多个对象:
      对象的编号不同,就说明它们占用不同的内存空间!
      instanceof运算符
      可以利用instanceof运算符来判断某个对象是否是由某个类实例化而来的!
    方法中$this关键字
      $this是一个“伪对象”,代表当前所属的类的当前对象!
      $this的自我告白:谁调用我,我就属于谁!
      思考:属性和方法都属于对象的成员,为什么访问属性的时候不需要$this关键字呢?
      再次强调:属性不能在方法内直接访问!需要找到其对象才能访问,一个典型的做法就是使用$this->属性名来访问当前对象的属性
      构造方法
      通常实例化完一个对象后,都要对对象的属性进行初始化才有意义
      也就是说,每次实例化完一个对象后,都要对该对象进行一次初始化操作!比较麻烦!
      思考:如何改善?
      可以类中建立一个专门给属性进行初始化的方法,实例化完之后,直接调用这个方法,一次完成对象的属性的初始化!
      上面的代码可以完成对象的属性的初始化,但是还是不够方便,每一次new完一个对象后都必须手动调用init方法才能进行属性的初始化工作!
      如果new的时候,能够自动调用init是最好的!
      于是,构造方式就横空出世了!
      事实上,在实例化一个对象的时候,php会自动的调用一个名字叫__construct()的方法!
      该方法,由于专门负责对新对象进行初始化,称之为“构造方法”!
      该方法的最大的特点是,不需要人为的手动调用,而是由系统在实例化一个对象的时候自动调用!
      问题是,调用该方法的时候如何将实参传递给该方法的形参呢?
      需要在实例化对象的时候顺便在类名后面增加一对小括号,里面传递实参列表
      注意:
      在php早期版本当中,构造方法有一个比较老的语法,就是使用和类名相同的方法作为构造方法!
      1,如果既有老语法的构造方法名,又有新语法的构造方法名,系统会主动调用__construct方法!
      2,存在一个最兼容的写法:
    析构方法
      概念:与构造方法是一对,构造方法是 在一个对象“出世”的时候由系统自动调用的!而析构方法是在一个对象“消失”的时候由系统自动调用的!
      名字是:__destruct() 注意:该方法里面不能有参数!
      思考:析构方法是在对象消失之前调用的还是对象消失之后调用的?
      对象消失的几种情况:当一个脚本周期结束的时候,明确的使用unset去删除一个对象的时候,改变对象变量的值,也会自动销毁!
      析构方法的作用
      注意:析构方法主要的作用就是释放对象所占用的额外的资源,而不是对象本身
      我们应该在对象消失的时候,增加析构方法,释放该对象占用的额外的 资源
      注意:析构方法通常都需要需要额外的定义,只有在对象执行的过程中,占用了额外的资源的时候才使用!
      总结一下构造方法和析构方法的特点:1,都是以__开头 2,都是由系统自动调用 3,都是某个特定的情况发生的时候,调用相应的方法!
      对象的传值与克隆
      对象的传值
    值传递
    引用传递
      所以,对象的值传递和引用传递其实效果是完全一样的!
      也就是说,对象间的复制,无法开辟一个新的对象空间,有时候,也叫作“浅复制”!
      那么,我们如何利用一个已有的对象,得到一个新的对象呢?(单独开辟内存空间)
      这个时候就需要使用对象的克隆!
      对象的克隆:所谓的克隆,不是通过类的实例化得到新的对象!而是通过一个已有的对象得到一个新的对象!语法如下:新对象 = clone 对象
      克隆一个对象的时候,会不会触发构造方法?
      回答:不会!因为构造方法只有在实例化一个对象的时候才会触发,但是克隆一个对象不是实例化!
      但是,存在一个克隆对象的时候自动调用的魔术方法!
      __clone方法
      该方法就是在克隆一个对象的时候,负责对新对象进行相关的初始化!
      为什么要有__clone方法?
      很有必要,因为客观世界不存在两个完全相同的对象!





    上一篇:我的网站用了两个PHP+mysql的源码,一个是phpcmsV9,一个是Anwsion问答系统 ...
    下一篇:五分钟教你如何学会PHP网页工作原理
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|好站群 ( 苏ICP备15018248号-1

    GMT+8, 2018-4-25 09:08 , Processed in 0.066842 second(s), 37 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表