今天介绍PHP的类与对象。类与对象的概念是在编程进行到C++时代的时候开始流行的吧。估计到了JAVA就已经就已经是必须掌握的内容了。做为一个编程人,不知道类与对象就不是真正的猴子。不深入掌握,当然也算不上真正的程序员猿。在PHP中,类与对象和其他编程语言中的规范应该是没有多少差别的,但一些小的细节要留意。
我一直对中文的这个对象概念有意见,因为编程来自西方英语世界,在他们那里是叫做OBJECT的。这个英文词当然容易帮助学习编程的深刻理解这个概念。所以,在下面的文中,我会时不时用OBJECT来介绍对象的事情。
A class is an OOP (Object Oriented Programming concept, and PHP is both a procedural and OOP friendly language. 这句话的大体意思是:class 我们翻译成“类”,是面向对象编程的概念,PHP既是面向过程的语言也是面向对象的语言。
还是先举例后说明吧,因为凡是看此文的一定是有一定编程基础的。看图后解释:
首先发现了一个问题,在PHP7动态网站开发案例课堂第2版中,205页,它写到类的声明格式如下:
<?php
权限修饰符 class 类名 {
类的内容;
}
?>
但我在例子中加上权限修饰符的public的话,它就报错。在PHP手册中的英文却是:
Basic class definitions begin with the keyword class, followed by a class name, followed by a pair of curly braces which enclose the definitions of the properties and methods belonging to the class.
这个地方请高人指点,因为JAVA等的类前面可以加上PUBLIC等的。
初学者可以暂时不管这个,我们解释代码 class 后面是类的名称,跟function后面是函数名是一个道理,一般小写。类名后面没有()但函数有。类名后面是大括号,大括号里面有两个类的成员属性,好好别扭呀。并且不同的书上会有不同的叫法,比如,字段,特征等不一而足。其实我们可以直接理解成类里面的变量,其实就是变量,为什么又叫成员属性,还有将要提到的成员方法呢?是因为除了他们还有类属性和类方法。这两种有什么区别呢,简单的说, 成员属性,成员方法是隶属于用类造成的对象的(object)的,而类属性类成员是类自身的。记住,类的这些属性方法是用static来定义的,也叫静态属性,静态方法。对象是不能够访问的。并且初学者可以不管类的属性和方法,只注意成员属性和成员方法即可。
再往下看代码,function的这个叫方法,其实就是函数,只不过在类里面就换了马甲和名字。格式和函数是一模一样的。方法里面有一个很怪的东西叫
t
h
i
s
。
这
个
叫
什
么
是
人
们
设
计
的
,
当
然
,
现
在
P
H
P
里
面
只
能
这
么
叫
了
。
它
是
代
表
将
要
在
类
外
面
实
例
化
(
制
造
对
象
)
的
对
象
变
量
的
替
代
。
比
如
下
面
的
this。这个叫什么是人们设计的,当然,现在PHP里面只能这么叫了。它是代表将要在类外面实例化(制造对象)的对象变量的替代。比如下面的
this。这个叫什么是人们设计的,当然,现在PHP里面只能这么叫了。它是代表将要在类外面实例化(制造对象)的对象变量的替代。比如下面的one,就是对象,这个类里面的
t
h
i
s
就
是
代
表
他
的
,
如
果
制
造
的
更
多
的
对
象
,
他
就
代
表
更
多
的
对
象
。
当
然
只
是
在
类
里
面
代
表
,
否
则
如
何
实
现
对
象
通
过
−
>
这
个
符
号
访
问
属
性
和
方
法
呢
。
this就是代表他的,如果制造的更多的对象,他就代表更多的对象。当然只是在类里面代表,否则如何实现对象通过->这个符号访问属性和方法呢。
this就是代表他的,如果制造的更多的对象,他就代表更多的对象。当然只是在类里面代表,否则如何实现对象通过−>这个符号访问属性和方法呢。this->name =
n
a
m
e
是
属
性
(
变
量
)
n
a
m
e
将
其
值
赋
给
对
象
属
性
(
成
员
属
性
)
的
。
如
果
你
认
为
类
就
是
模
板
,
可
以
生
产
好
多
的
对
象
,
那
么
对
象
就
是
类
的
成
员
的
了
,
成
员
属
性
,
成
员
方
法
就
理
解
了
。
制
造
对
象
时
,
用
的
代
码
是
先
用
n
e
w
,
后
面
跟
着
一
个
和
类
名
字
相
同
的
函
数
,
这
里
也
就
方
法
,
叫
构
造
方
法
,
这
个
在
这
里
例
子
里
面
是
默
认
的
,
是
没
有
显
示
的
。
下
一
个
例
子
你
就
会
理
解
更
深
。
因
为
构
造
方
法
是
没
有
参
数
的
,
所
以
仅
仅
一
个
括
号
跟
着
后
面
。
如
果
是
类
名
的
话
,
类
后
面
是
没
有
括
号
的
。
所
以
这
个
是
方
法
,
本
质
是
函
数
,
不
是
类
名
。
我
们
再
看
第
二
张
图
,
通
过
v
a
r
d
u
m
p
(
)
内
置
函
数
,
我
们
可
以
看
到
变
量
的
结
构
。
这
个
变
量
属
于
对
象
变
量
,
所
以
前
面
有
o
b
j
e
c
t
(
S
t
u
d
e
n
t
)
的
字
样
。
这
个
对
象
变
量
指
向
了
一
个
包
含
2
个
元
素
的
数
组
。
看
到
N
U
L
L
了
吧
,
在
制
造
对
象
时
,
对
象
的
名
字
属
性
和
年
龄
属
性
没
有
设
置
,
所
以
是
N
U
L
L
。
而
第
三
行
是
我
们
赋
值
了
以
后
的
对
象
变
量
的
结
构
,
里
面
就
是
名
字
是
s
t
r
i
n
g
(
12
)
了
吧
。
仔
细
观
察
。
中
间
一
行
就
是
通
过
g
e
t
N
a
m
e
方
法
取
得
的
名
字
显
示
效
果
。
注
意
,
是
需
要
e
c
h
o
打
印
的
,
并
且
用
对
象
变
量
,
然
后
−
>
指
向
变
量
名
字
,
没
有
name 是属性(变量)name将其值赋给对象属性(成员属性)的。如果你认为类就是模板,可以生产好多的对象,那么对象就是类的成员的了,成员属性,成员方法就理解了。 制造对象时,用的代码是先用new, 后面跟着一个和类名字相同的函数,这里也就方法,叫构造方法,这个在这里例子里面是默认的,是没有显示的。下一个例子你就会理解更深。因为构造方法是没有参数的,所以仅仅一个括号跟着后面。如果是类名的话,类后面是没有括号的。所以这个是方法,本质是函数,不是类名。 我们再看第二张图,通过var_dump()内置函数,我们可以看到变量的结构。这个变量属于对象变量,所以前面有object(Student)的字样。这个对象变量指向了一个包含2个元素的数组。看到NULL了吧,在制造对象时,对象的名字属性和年龄属性没有设置,所以是NULL。而第三行是我们赋值了以后的对象变量的结构,里面就是名字是string(12)了吧。仔细观察。中间一行就是通过getName方法取得的名字显示效果。注意,是需要echo打印的,并且用对象变量,然后->指向变量名字,没有
name是属性(变量)name将其值赋给对象属性(成员属性)的。如果你认为类就是模板,可以生产好多的对象,那么对象就是类的成员的了,成员属性,成员方法就理解了。制造对象时,用的代码是先用new,后面跟着一个和类名字相同的函数,这里也就方法,叫构造方法,这个在这里例子里面是默认的,是没有显示的。下一个例子你就会理解更深。因为构造方法是没有参数的,所以仅仅一个括号跟着后面。如果是类名的话,类后面是没有括号的。所以这个是方法,本质是函数,不是类名。我们再看第二张图,通过vardump()内置函数,我们可以看到变量的结构。这个变量属于对象变量,所以前面有object(Student)的字样。这个对象变量指向了一个包含2个元素的数组。看到NULL了吧,在制造对象时,对象的名字属性和年龄属性没有设置,所以是NULL。而第三行是我们赋值了以后的对象变量的结构,里面就是名字是string(12)了吧。仔细观察。中间一行就是通过getName方法取得的名字显示效果。注意,是需要echo打印的,并且用对象变量,然后−>指向变量名字,没有符号的变量名字.这些细节都要注意到。
内容有点多了,下一次探讨自定义带有参数的构造函数的类。通过默认构造函数生产的对象,就像一个没有标签的对象。比如上面的,生产出来之时,没有名字,没有年龄。如果要生产有名字,有年龄,有其他特征的STUDENT来,下一次再讨论。