面向对象

传统的面向过程:讲一个工作分成若干步骤,然后根据步骤一步一步完成,最终达成目的。

现代的面向对象:是设计思想的升华--面向过程是解决简单问题的自然的思维过程,面向对象是解决大规模的复杂问题的良好思想;面向对象就好比讲工作分散给若干部门共同完成,最后进行整合调用。

面向对象基本概念

类与对象

类:是描述 某一些具有共同特征的物体的概念,是某一类物体的总称。

  通常,一个类所具有的共同特征包括2大方面的信息:

    外观,形状,描述,数据。。。。属性

    行为,动作,功能,。。。。。。方法

对象:是指一个具体的物体,该物体隶属于某个类别,比如:张三这个人类属于人类

通常,对象离不开类,没有类,就不能有对象。

在面向过程的语法中,我们的代码有如下几种代码:

  定义变量;

  定义函数;

  使用变量;

  调用函数;

  控制语句;

在面向对象的语法中,则发生了变化:

1、定义类:

  1-1 定义属性(变量)

  1-2 定义方法

  1-3 定义常量(类常量)

2、创建类的对象

$对象名=new 类名();

3、使用对象

  3.1使用其属性:因为属性就是“变量”,则使用其属性,也就是跟以前使用变量一样。

  3.2使用其方法:因为方法就是“函数”,则使用其方法,也就是跟以前使用函数一样。

  3.3使用其常量:类似使用以前的普通常量。

对象的传值

php中,变量传值方式有2个:

值传递:传递的时候,拷贝的是数据本身。默认都是值传递。

结果:传递完之后,有了2份同样的数据,但两个变量“相互独立”没有关系。

引用传递: 传递的时候,拷贝的是引用关系。需要使用“&”才能实现引用传递。

结果:传递完之后,数据仍然只有一份,但是两个变量共同指向该数据。

 

在面向对象这个层面,基本来说,仍然如此:

默认是值传递:

可以使用引用传递:

先观察一个现象:

<?php
class p{
  var $v1=10;      
}
$p1=new p();
$p2=$p1;
$p1->v1=20;
echo "<br>p1->v1为:".$p1->v1;//20
echo "<br>p2->v1为:".$p2->v1;//20

为什么$p1的值改了$p2也改了?

原来,对象的存储跟普通变量的存储有所区别:$p1并不是具体的值而是一个对象,面向对象并不是复制一份数据而是复制了一份对象标识符

引用传递:

复制的是引用关系。

类中成员:

  属性

  方法

  类常量

  它们统称为“类中成员”。

  属性就是放在一个类中的变量

  定义形式:

  形式1:       var  $v1 ;             //定义不赋值

  形式2:    var  $v2 = 2;         //定义的同时可以赋值,该值只能是“直接值”,常量(值)

  形式3:public $v1;

  形式4: public $2=2;   //不能是变量值,也不能是“计算表达式”

错误形式:

$v1 = 1;

var  $v2 = 1+3;                  //右边不能是计算表达式

public   $v3 = $v2;             //右边不能是变量

使用形式:$对象->属性名;属性名前没有$符号

一般方法:

方法定义跟原来函数定义几乎一样。

使用是通过类或类的对象来进行的。

方法前可以加修饰词:public, protected,private,省略就算“public”

方法中$this关键字

$this是一个“伪对象”,代表当前所属类的当前对象

一些简单说法:

类是定义好的某些对象的“模板/模型”

对象是根据该模板/模型所“创建”出来的具体物体

一个对象可以有哪些属性(数据),是由该类来决定的。

一个对象可以做那些事情(方法),也是由该类来决定。

通常认为,一个类(对象),就是拥有一些数据,并通过它自己的方法可以去处理这些数据的“独立体”

静态属性

静态属性有什么用?

对比来说:一般属性,他的值是隶属于该类的具体某个对象(虽然定义在类中),或者说,每个对象的同样的属性的值,有可能不一样。

静态属性就是:只隶属于类本身——也可以看做是所有对象的“共有数据”。

静态属性的使用:

通过特殊的语法:::(双冒号语法,也叫范围解释符)

类::$静态属性名

对比普通属性的使用:

对象->普通属性名;           //普通属性也可以叫做“实例属性”,相应的,对象也叫“实例”

如果在一个方法的前面加上static关键字修饰,则就变成了静态方法。

静态方法同样隶属于类,而不是隶属于具体对象。使用方法跟静态属性类似:

类名::静态方法名();

从理念上,可以认为,静态方法是只隶属于类,而为所有对象所“共有”。

 

如果通过类名来调用静态方法,则该方法中不可以出现$this关键字。

注意1:$this在静态方法中不能使用

  静态方法中不应调用非静态方法

构造方法

构造方式是类中的一个“特殊”方法,其作用是在实例化一个对象的同时,给该对象的属性赋值,使之一创建完成,就具有了其本身的特有数据(属性值)。

1,该方法名字是固定的,为:_ _construct();

2,该方法必须是普通方法(不能是静态方法)

3,通常该方法应该是public

4,通常该方法中使用$this这个关键字来对属性进行赋值

5,当new 类名()的时候,其实是在调用该构造方法

6,如果一个类中定义了构造方法,则实例化该类时就会调用该方法,且实例化时的参数需要跟构造方法的参数匹配

析构方法

构造方法是“创建”对象的时候会自动调用。

析构方法是“销毁”对象的时候会自动调用。

 

系统方法通常用于在销毁对象的时候来“清理数据”(打扫战场)——如果需要,就可以利用这个机会去处理。

 

通常,php程序结束后,所有对象都会自动销毁(其实属于php内部的垃圾回收机制)

说明:

1,析构方法通常不太需要去定义。

2,析构方法不能调用。

3,析构方法不能有形参。

4,析构方法中可以用于清理一些在php代码结束后不能清理的数据,如生成的文件。

对象销毁的几个情形:

  脚本程序运行结束,自动销毁;

  明确地unset()一个对象变量,则被销毁;

  改变对象变量的值,被销毁;

实际上,更本质来说,当一个对象(new 出来的对象)没有任何一个变量指向它的时候,该对象就会被自动销毁——自然,如果整个程序结束,也会销毁。

posted on 2018-03-05 17:01  啦噜噜  阅读(105)  评论(0编辑  收藏  举报