从今天开始我们开始学习面向对象的思想。
一、面向对象编程思想的介绍
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.当一个对象没有任何变量指向的它时候,即使程序还没结束,也会被销毁;