php学习14 ---初探面向对象

  从今天开始我们开始学习面向对象的思想。

一、面向对象编程思想的介绍

  1.面向过程编程

    面向过程的编程就是将任务分割成若干个步奏一步一步的进行下去,当每一步都完成了之后,任务就算完成了。

      

  2.面向对象编程

    面向对象的编程思想(oop),其基本的特征就是将不同的任务交给不同的对象去做,每个对象的有自己的方法和属性,我们不用关心他完成的内部机制,只管让他去做就行可以了,每个对象都有自己的职责,相互配合完成任务。

      

 

二、面向对象的基本概念

  1.类和对象

    对象:万物皆对象;

    类:任何对象,都可以人为“规定”为某种类型;

    php中的类:

        class  Person{

          var  $name;

          var  $age;

          var  $edu;

        }

        class  Teacher{

          var $name;

          var $age;

          var  $edu;

          var  $major;

        }

      

      

    由此可以见:

      类是描述一类事物的总称,是具有相同特性的该类事物的一个总称;

      对象是一个明确的具体的物体,是类中的某一个实例,对象离不开类,对象一定隶属于类,一定先有类再有对象。

  2.属性和方法

    属性:就是一样来的‘变量’,只是它现在隶属于一个类了,即写在一个类中,就称为属性。

    方法:就是原来“函数”,只是它现在隶属于一个类了,就称为方法。

    注意:

      属性和方法,他个函数有一定的区别了,不能‘自由使用’了,而是通过这个类或这个类的对象去使用它。

      使用属性的时候,把它当做变量去使用就好了,只是变了一下形式:对象->属性名;

      使用方法,就把它当做一个‘函数’去使用,形式也要改一下:对象->方法;

      

      一个类定义了一些属性和方法,则这个类所创建出来的对象也就自然有了这些属性和方法;

  3.创建对象的几种形式

    创建对象有以下几种方式;

      

 

  4.对象的传值方式

    对于对象,值传递和引用传值方式对对象的数据的改变的结果是一样的。

    那么为什么对于对象,值传递和引用传递,几乎没有区别?这要从对象的数据的存储方式来理解了:

    $o1 = newC1();//这里创建了一个对象o1,其存储结果如图:

      

    这里,实际上,变量$o1中,存储的数据只是一个‘对象编号#1’,这个对象编号,才会去指向对象数据new c1();该编号数据,我们不能控制,只能是系统内部的分配。

    则$o2 = $o1 ;作为值传递,实际是复制了该对象的编号:

      

    在语法上,对对象变量进行的属性操作,其实就是通过该编号来指向对象而操作的。

    $o1->p 2 ;//此时,就是通过对象编号#1区修改了对象(new C1())的内部数据。

    echo $o2->;//此时相当于取得变量$o2所包含的编号#1中所指向的对象(new C1();)的内部数据p1;

    那么对于引用传递,情况如下:

    $o3 = new C1();//创建一个对象:

      

    $o4 = &$o3;//引用传递:

      

    所以:

      $o3->p = 2;

      echo $o4->p;//输出2

三、类中的成员

  1.类中成员的概述

    面向对象编程,是需要通过“对象”去做什么事情(以完成某件任务),而对象总是来源于类,所以,面向对象编程,一切都是从定义类开始;

    类中成员分为3大类:

        常量,属性,方法

    形式上,大致如下:  

        class  类名{

          常量定义;

          属性定义;

          方法定义;

        }

    说明:

      以上各项,没有顺序问题,习惯上是常量,属性,方法的顺序来写;

    再详细一点分的话:

      属性:普通属性    静态属性

      方法:普通方法   静态方法  构造方法   析构方法

  2.类常量

    当一个类中定义一个常量时,该常量就称为类常量--其本质还是常量;

    class 类名{

      const  常量名 = 常量值; //  不可以是用define()来定义;

    }

    常量的使用,是通过类名,并使用范围解析符(::)来取用的;

       类名::常量名;

    举例:

      

 

  3.普通属性(实例属性)

    实例的单词为:instance;实例其实就是对象,普通属性,就是一个可以在该类实例化出的对象上使用的属性!

    class 类名{

      var $属性名 = 属性值;

      var $属性名;

      //上面的var 也可以用public来代替;

      public $属性名 = 属性值;

      public $属性名;

    }

    普通属性的使用方法:

      $对象->属性名;

      因为,属性的本质就是变量,所以可以当做变量来看待;

  4.静态属性

    静态属性,本质上也是“变量”,但其有一个特点:该变量只隶属于“类”,即:一个类中的静态属性,就只有“一份数据”,但,一个类的实例属性,就可以有多分数据----每创建一个对象出来,就会有一份数据;

      class  类名{

      static  $属性名 = 初始值;

      static  $属性名;  //此属性没有初始值;

      }  

    静态属性的使用方法和常量的使用差不多都需要范围解析符来操作:

      类名::$静态属性名;  //属性名带$符号

    举例:

      

    可见:

      实例属性,是每个对象都可以不一样的数据,也只是没有对象独自拥有的数据;  

      静态属性,它不属于任何一个对象,而只属于该类本身,也可以理解为所有的对象共有的数据;

  5.普通方法

    一个类中定义的方法,可以为这个类的所有对象调用的方法,也可以理解为,这个类的所有对象,都有各自的方法;

    class  类名{

      function 方法名(形参1,形参2...){...}

    }

    调用形式;

      $对象名->方法名(实参1,实参2,...)

  6.静态方法

    一个类中定义的方法,只隶属于这个类本身,而不是隶属于这个类的对象。

    定义形式:

      class  类名{

        static function 方法名(形参1,形参2...){...}

      }

    调用形式:

      类名::方法名(实参1,实参2...)

    举例:

      

       

  7.构造方法

    构造方法,就是一个特殊的方法:

      其名字是固定的:__construct;

      该方式通常不要我们自己调用,而是在new一个对象的收会自动调用

      该方法主要的目的是为了在new一个对象的时候,给该对象设置一些初始值;

      构造方法的参数没有规定,通常是根据实际的需要来定义,目的是为了对象属性数据的初始化;

      

      以上这种方式,对对象的属性的数据初始化不太方便,我么可以利用构造方法来改进:

      

  8.析构方法

    析构方法是一个特殊的方法,名字为固定的词:__desctuct;

    析构方法是一个在对象被销毁的时候自动调用的方法--我们无法调用它;

    析构方法不能带参数,但方法中也可以使用$this这个词,代表当前对象;

      

    对象在哪些情况下会被销毁

    1.如果程序结束,所有的变量都会被销毁,自然,变量所代表的对象也会被销毁;

    2.当一个对象没有任何变量指向的它时候,即使程序还没结束,也会被销毁;

      

 

      

posted @ 2016-09-21 16:43  time呦_呦  阅读(137)  评论(0编辑  收藏  举报