面向对象入门--简单介绍类与对象

面向对象思想

英文全称OOP:Object Oriented Program 面向对象编程,在编程领域有两大编程思想:一者是传统的面向过程思想,杰出代表是C语言;一者是现代的面向对象思想,杰出代表有很多,如C++、Java、visualbasic等等。那么到底两者有什么区别呢?

传统的面向过程

在编程当中,传统的思想就是一步一步解决问题,只有你完成了上一步的问题,才能进入下一步的编程,这样就显得问题很繁琐,而且一旦中途出错导致修改代码苦不堪言。而面向过程很好的解决了这个问题!

现代的面向对象

万事万物皆可成为对象,比如说一个人,每个人既有所有人共有的属性,同时每个人还能做相应的任务,完成相应的功能,面向对象思想就是将要完成的工作拆分成“一个一个对象”的任务(功能),每个对象独立完成自己的任务,任务之间通过调用来相互联系已解决问题。现在面向对象已经成为了解决大问题的良好思维方式

举例:比如说报名流程,一个学生是一个对象负责缴费,负责收费开发票的老师又是一个对象,发书的老师又是一个对象,每个对象都有自己的功能,报名时,学生调用收费开发票的老师能完成的功能完成缴费,进而调用发书的老师领取书籍和分配班级完成报名。如果中途出错的话只需对某个对象完成修改即可。

 

面向对象基本概念

既然讲述完了什么是面向对象,我们就要来理解下到底怎样创造一个对象,这就必须先谈下什么是类?

什么是类?简单来说类就是“具有一些共同特征”的集合体,是某一事物的总称,比如人、脊椎动物、桌子、班级。进而我们对类有了一个更深的理解

什么是对象?先有类后才有对象,对象就是类的具体化,比如一个人王二、一个桌子和175班级,对象既满足的类的“共同特征”,同时还可能有自己独立的属性。

类里面有什么特征呢?从编程来讲,类里面既有属性:描述事物的抽象性概念,如外观、年龄等等;又有方法:描述事物的行为、动作、功能

由于对象是类的一个具体化,因此对象能够使用类中的属性及方法

类与对象的抽象化解释:

  • 类是定义好的某些对象的“模板/模型”
  • 对象是根据该模板/模型所“创建”的具体物体
  • 一个对象可以有哪些属性(数据),是由该类决定的
  • 一个对象可以有哪些事情(方法),也是由该类决定的。

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

可见类就是一些属性、方法、常量的集合体,要使用这些类中的属性等,只能使用该类创建的对象调用之使用

原来(面向过程)语法中,有如下几种代码:

  • 定义变量;
  • 定义函数;
  • 使用变量;
  • 调用函数;
  • 流程控制(if、switch、for、while等)

在面向对象中,有以下几种代码:

 

  1. 定义类,类中只有以下3种代码
    1. 定义属性(变量)
    2. 定义方法(函数)
    3. 定义常量(类常量)
  2. 创建类的对象;
  3. 使用对象
    1. 使用属性
    2. 使用方法;
    3. 使用常量

对象创建的基本形式:

方式1:

$对象名1 = new 类名();	//对象名就是变量名,类需定义

方式2:可变类名

方式3:

$对象名 3 = new self;	//self直代类本身,这行代码只能在类内部方法中使用。

方式4:通过对象创建对象

对象的传值

创建完对象后因为对象就是个变量可以用对象来传值,那么对象的传值与PHP中的传值有什么不同呢?

PHP变量传值方式有2种:

  • 值传递:传递完产生2份同样值但完全相互独立的数据
  • 传递完之后,数据仍然只有一份,但是2个变量共同指向该数据

则在面向对象这个层面来说,基本如此:默认是值传递;可以使用引用传递

先观察一个现象?

面向过程传递默认是值传递为什么对象指向的数据都改变了???

先来看一下对象的存储方式:

普通变量:$v1 =10;

存储方式如下:

对象对象(变量):$obj1 = new P();

存储方式如下:

则对象变量值传递会变成如下情况:

在回到上面那个问题,由于两个对象p1和p2存储对应的标识符一致,引用关系都指向同一个数据,所以才会改变p1指向的变量,p2指向的变量值也会改变

那么,我们断开$p1跟其存储的数据(标识符)之间的关系,结果是:$p2还有效

再来看引用传递:

将p3对象引用传递给p4对象,再创建一个p3变量,两者对应的标识符仍然相同,对应的属性仍然相同,而值传递的话就会不同,

注意:unset断开的是对象与标识符之间的引用关系

一个系统函数:get_class(对象)

作用:获得某个对象的“所属类名”—结果只是一个类名字符串。

 

类中成员

一个类的内部可以有三种代码:属性、方法以及类常量,统称为“类中成员”

然而,对任何属性与方法(类常量可看作一种静态属性)又分成一般属性以及静态属性、一般方法以及静态方法,下面介绍这四种的不同

一般属性:

属性可看作一个类中的变量,一般属性可看作是某个对象单独拥有的属性,可在类外面重新赋值等等

定义形式:

形式1: var $v1;		//定义不赋值
形式2: var $v2 = 2;	//定义的同时可以赋值,该值只能是“直接值”,常量(值)
						//不能是变量值,也不能是“计算表达式”
形式3:	public $v1;
形式4:	public $v2 = 2;	//其实var是”public”的一个别名,正式用public
错误形式: $v1 = 1;
	Var $v2 =1+3;
	Public $v3 = $v2;

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

说明:通常,可以出现变量的位置,就可以出现对象的属性

一般方法:

跟原来函数定义几乎一致,使用时通过类或类的对象来进行的,指某个具体对象的方法

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

方法中$this关键字

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

举例:

静态属性

那么静态属性与一般属性有什么区别?静态属性可看做是所有对象共同具有的属性,某个对象在类外面对其进行赋值,其他对象该属性的值也相应改变。在类中定义时将public换成static即可

静态属性的使用

语法:  ::(双冒号语法,又叫范围解释符)     类::静态属性名;

实际上,通过对象也可以使用静态属性(不推荐)

静态方法:

与静态属性的定义类似,在方法前面加上static关键字修饰就变成了静态方法。在解释上,静态方法同样也属于类,每个对象的该方法都一样。

使用:类名::静态方法名;

注意:

 

 

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

self:

含义:self代表当前类

使用:通常只能在某个类的某个方法内部代表该类的名称。

构造方法:

构造方法是类中的一个“特殊方法”,作用是在实例化一个对象的同时给该对象的属性赋值,使之定义时,就具有了本身特有的数据

解释如下:

  1. 该方法名字固定,为:__construct();           //有两个下划线
  2. 必须为一般方法
  3. 通常该方法应该是public
  4. 使用$this对属性赋值
  5. 通过new 类名()时,实则调用此方法
  6. 如果一个类中定义了构造方法,则实例化对象就会调用该方法,且参数需相应匹配

结果:

析构方法:

与构造方法类似,析构方法是在“销毁”对象时自动调用

系统方法通常用于在销毁对象的时候来清理数据,通常,php程序结束后,所有对象都会自动销毁(属于php内部的垃圾回收机制)

说明:

  1. 析构方法不怎么需要定义
  2. 析构方法不能调用
  3. 析构方法不能有形参
  4. 析构方法可以清理一些在PHP代码结束后不能清理的数据如生成的文件
  5. 析构方法是逆序销毁

对象销毁的几个情形

  1. 脚本程序运行结束后自动销毁
  2. 明确地unset()一个对象变量,则被销毁
  3. 改变对象变量的值,被销毁;

实际上,当一个对象创建后而没有任何一个变量指向它时该对象会自动销毁—自然,如果整个程序结束,也会销毁。

总结:

  • 静态方法中可使用:类常量、静态属性、静态方法
  • 一般方法中可使用:实例属性、类常量、const类常量、静态属性、静态方法、普通方法
  • 对象可使用:普通属性、普通方法、类常量、static静态属性、static静态方法(都能用除了析构方法)

总结为:一般的能使用静态的,静态的只能调用静态的(类常量可看作静态常量)

<?php
/*定义一个“教师类”,并由此类实例化两个“教师对象”。该类至少包括3个属性,3个方法,其中有个方法是“自我介绍”,就能够把自身的所有信息显示出来。*/
/*定义一个“学生类”,并由此类实例化两个“学生对象”。该类包括姓名,性别,年龄等基本信息,并至少包括一个静态属性(表示总学生数)和一个常量,以及包括构造方法和析构方法。该对象还可以调用一个方法来进行“自我介绍”(显示其中的所有属性和常量)。构造方法可以自动初始化一个学生的基本信息,并显示“xx加入传智,当前有xx个学生”。*/
class teacher{
	public $name = "匿名";
	public $teaching_year = 0;
	public $age = 18;
	function intro(){
		echo	"hi! 大家好,我叫". $this->name.",今年". $this->age."岁,教书已经". $this->teaching_year. "年了!<br />";
	}
	function __construct($name, $teaching_year, $age){
		$this->name = $name;
		$this->teaching_year = $teaching_year;
		$this->age = $age;
	}
	function __destruct(){
		echo	"<br />被销毁了";
	}
}
class student{
	public $name = "匿名";
	public $sex;			//跟js相同,可只定义不赋值
	public $age =18;
	static $student_num = 0;
	const number = '175';
	function intro(){
		echo	"hi!大家好,我叫{$this->name},今年{$this->age}岁了,来自".student::number."<br />";
	}
	function  __construct($name, $sex, $age){
		$this->name = $name;
		$this->sex = $sex;
		$this->age = $age;
		$student_num = ++student::$student_num;				//静态属性可在非静态方法中使用
		echo	"<b>{$name}加入了".student::number."班,当前有{$student_num}个学生<br /></b>";
	}
	function __destruct(){
		echo	"被销毁了<br />";
	}
}
$teacher1 = new teacher('小苏', 5, 25);
$teacher2 = new teacher('小王', 4, 23);
$teacher1->intro();
$teacher2->intro();
$student1 = new student('小红', '女', 16);
$student1->intro();
$student2 = new student('小狼', '男', 17);
$student2->intro();
$student3 = new student('小黑', '男', 16);
$student3->intro();
?>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值