自PHP 5开始,PHP就提供了完善的面向对象支持。面向对象思想可以使得程序更加符合人类看待事物的规律。同时,面向对象的引入使得程序的代码更简洁、更易于维护,并且具有更强的可重用性。面向对象编程的难点不在于语法,而在于如何将一个事物正确地抽象成一个类。
类与对象的关系?
类可以理解为一些属性和能力的集合。例如,人是一个类,即人类。猫也是一个类,即猫类。PHP中的类也是类似的,它是一个属性和方法的集合。对象即这个类的一个实例。例如每一个人都是人类的一个实例,每一只猫都是猫类的一个实例。而这些实例都是相互独立的,一个实例的变化不会影响到其他的实例。这就是类与对象关系的一个形象的说明。
1、如何抽象出一个类?
首先是我们最熟悉的人类,我们首先需要为这个类定义一个名称以此来称呼这个类,当然这个名称没有太多的限制,小伙伴们可以随意指定,这里我们指定为人类。我们首先可以总结出人的一些共有的特性,这里我们只随意指定几个:
有高智商;
可以直立行走;
擅长使用工具;
身高;
体重;
性别;
生日。
有了上面这些属性,我们就可以抽象出一个类了。
现在我们回到PHP代码,PHP中定义一个类使用的关键字是class,定义一个类的语法结构如下:
class 类名{
类的属性和能力;
}
我们可以看到类的定义方法还是非常简单的,那么我们就可以以伪代码的形式来定义人类,如下所示:
class 人类{
高智商;
行走;
身高;
体重;
性别;
生日;
}
就像上面这样,我们就以代码的形式定义了一个人类,当然这段代码在PHP中是不可以使用的,但是只需要进行很少的更改即可成为正确的PHP代码。
定义一个类最重要的就是找出这个类的实例所共有的特征。例如有一只猫天生就没有尾巴而我们却不可以将这个特性抽象到猫类中,因为极大多数的猫都是有尾巴的。当然我们完全可以抽象一个类,这个类的特点就是没有尾巴。下面我们就来找出猫的一些特性:
四条腿;
有尾巴;
昼伏夜出;
会捉老鼠;
攀爬能力较强。
我们同样可以就这些特性定义一个类,如下所示:
class 猫类{
四条腿;
有尾巴;
昼伏夜出;
会捉老鼠;
较强的攀爬能力;
}
我们说过类的名字并没有太多的约束,因此我们完全可以将具有以上特点的类定义为牛类,如下所示:
class 牛类{
四条腿;
有尾巴;
昼伏夜出;
会捉老鼠;
较强的攀爬能力;
}
如上面的定义的牛类是完全正确的。
类的定义并非是只可将一类实例的特点定义为一个类,我们完全可以定义一个例如有尾巴的动物类这样的类。我们将这个类定义如下的特点:
有尾巴;
有四条腿;
是动物。
它的定义可以如下的伪代码的表示:
class 有尾巴的动物{
有尾巴;
四条腿;
动物;
}
以上我们就定义了一个有尾巴的动物类,它的实例可以是猫,牛,羊,长颈鹿,狮子等等动物。而蛇不可以属于这个类,因为它没有四条腿;毛绒玩具狗也不属于这个类,因为它不是动物。
以上就是抽象出的多个类的过程,我们可以看到理解起来还是非常的简单的,这也就印证了面向对象会使得代码更加符合人类看待事物的规律的特性。
2、实例化一个类
类是一些属性和方法的集合,我们不可以直接拿来使用。这个理解起来也是比较容易的,就像人类,它是一个概念,是一个规定。它规定了人类必须有哪些属性和能力才能算是人类,而它并不是一个实例。符合一个类的实例可以被称为类的对象;而我们也可以根据类来实例化一个对象。在PHP中更多的是根据类来实例化一个对象。实例化类的对象使用的关键字是new,实例化对象的语法如下:
new 类名(参数)
我们实例化一个猫类的对象代码如下:
new 猫类();
同样我可以实现有尾巴的动物类的多个实例,代码如下:
new 有尾巴的动物类();
new 有尾巴的动物类();
new 有尾巴的动物类();
以上的三行代码就实例化了有尾巴的动物类的三个对象。以上都是使用伪代码的形式来演示的这些知识。
下面我们就以实际的PHP代码来演示这一过程,由于现在我们还没有学习类中定义属性和方法的知识,因此这里我们就只以一个空类来讲解。空类即没有任何属性和方法的类,如下所示:
class 类名{
}
但是在PHP中这是一个合法的类,我们可以将它实例化。
<?php class ren{ //定义人类 } class mao{ //定义猫类 } new ren(); //实例化人类 new mao(); //实例化猫类 new mao(); //实例化猫类 new mao(); //实例化猫类 ?>
运行上代码没有任何输出,那么我们如何才能知道确实实例化了这些类呢?我们可以使用var_dump函数输出这些实例化代码的类型来验证。
<?php class ren{ //定义人类 } class mao{ //定义猫类 } echo '实例化一个人类:'; var_dump(new ren()); //实例化人类 echo '<br />实例化两个猫类:'; var_dump(new mao()); //实例化猫类 var_dump(new mao()); //实例化猫类 ?>
上述代码运行结果为”
实例化一个人类:object(ren)#1 (0) { }
实例化两个猫类:object(mao)#1 (0) { } object(mao)#1 (0) { }
从运行结果的输出类型中的“object(ren)”即表示为“ren”类的一个对象,而“object(mao)”则表示“mao”类的一个对象。
我们可以看出这些类确实被实例化成了对象,但是很多的小伙伴就会就此疑惑了,因为实例化对象所用的代码完全一样,怎么才能分别使用这些对象呢?其实这些对象是有区别的,只不过是这些区别只有PHP核心知道。这就类似于手机生产商生产手机,通常在出厂之前会有一个内部的工程机代号。使用“new”关键字实例化一个类后会返回一个独一无二的标识。那么我们就可以使用一个变量来保存这个代号,就可以分别标识每个对象了,代码形式如下:
变量=new 类名(参数列表)
<?php class ren{ //定义人类 } class mao{ //定义猫类 } $ren1=new ren(); //实例化人类 $mao1=new mao(); //实例化猫类 $mao2=new mao(); //实例化猫类 echo '输出变量$ren1的类型:'; var_dump($ren1); //查看变量的类型 echo '<br />输出变量$mao1的类型:'; var_dump($mao1); echo '<br />输出变量$mao2的类型:'; var_dump($mao2); ?>
上面代码运行结果:
输出变量$ren1的类型:object(ren)#1 (0) { }
输出变量$mao1的类型:object(mao)#2 (0) { }
输出变量$mao2的类型:object(mao)#3 (0) { }
从以上代码的运行结果我们可以看出这些变量正确保存了对象的标识符。
3、类的成员
在前面小节中将事物抽象成一个类的时候会总结出一些实例的共有特性,这些特性就组成了类的成员。例如猫类的:
四条腿;
有尾巴;
昼伏夜出;
会捉老鼠;
攀爬能力较强。
这些特性就是猫类的成员。而更根据成员的特点,我们又将成员分为成员属性和成员方法。例如,描述属性的成员我们就可以将其归为成员属性,表现在PHP代码中就是变量或者常量。例如攀爬、捉老鼠这些能力我们就将其归为成员方法,表现在PHP代码中就是函数。
成员属性通常在类中表示该类的对象应有的属性,它通常为变量或者常量。下面我们就来详细学习类的成员属性。
为了学习本小节的内容,我们首先来简单定义一个猫类,它有如下的成员:
年龄(age);
体重(weight);
毛色(color);
将以上这些成员构成的类如下所示:
class mao{
age;
weight;
color;
}
但是这并不是正确的PHP代码。我们在将其改写为正确的PHP代码前首先需要学习一些新的知识。陌小雨把他放到下节课来讲。