开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第一阶段:范围解析操作符(类常量访问)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/711/detail/12666
范围解析操作符(类常量访问)
内容介绍:
一、概念
二、步骤
三、示例
四、小结
类的成员有三个:属性、方法和类常量。而属性、方法都用对象访问到了,但是唯独类常量访问不了,就用范围解析操作符,能够实现访问。本节的目标是理解范围解析操作符的概念和目标,掌握范围解析操作符的应用。
一、概念
范围解析操作符:由两个冒号组成“::”,是专门用于类实现类成员操作的,可以实现类直接访问类成员。
1.范围解析操作符是用于给类(类名)访问类成员使用的;
类名::类成员
2.范围解析操作符也可以被对象用来当做类使用。但不建议使用,因为有些东西虽然具有共用的方式,但对象应该用对象的访问符合来访问,访问解析操作符是给类访问的。
$对象名::类成员
3.类常量只能被类访问
二、步骤
定义类结构,定义的成员里确定要由类进行管理,比如类常量,此时就用类常量进行访问,用范围解析操作符帮助类实现类常量的访问。
三、示例
1、类常量的普通访问尝试:尝试使用对象进行访问。
普通尝试访问,定义一个类常量,
class saler{
#类常量
const PI = 3.14;
}
去访问时产生一个对象,
$s1 = new Saler();
对象之后去访问,
echo $s1->PI;
尝试能不能访问:
< ?php
#范围解析操作符
class Saler{
#类常量
const PI = 3.14;
}
$s1 = new Saler();
echo $s1->PI;
提示是未定义的属性,没有 Saler::$PI,系统将它解析为$PI,自然找不到了,因为它是常量,说明这种方法不可取,这是无法访问的。
2、具体操作用类来访问,因为类常量的定义本身就是归类管,是专门为类提供的成员,所以只能用类名来访问,类名直接 Saler::常量名。
#类访问类常量
echo Saler::PI;
输出3.14,说明类可以访问类常量。
3、对象本身也指向于类,对象要访问方法必须要找到类,因此也可以尝试访问,
echo $s::pI;
输出3.14,说明没有报错,这种方式是兼容的,范围解析操作符兼容对象:找到对象所属类最终进行访问,所以最终$s1变成 Saler 了才能访问。
这里虽然可以用,但是不建议使用,因为规定类常量属于类,应该由类来访问。
4、类常量是固定的,对象的属性是不同对象而不同的,每个人都有自己的名字,成员方法简单的理解也是为属性本身进行加工的,因为数据加工才会用到一些方法、逻辑,因此对应的类常量是专属于类的,而方法和属性是专门属于对象的,所以既然分工已经规定了谁归谁,那么访问时就应该谁来访问谁,类就访问类常量,对象就访问属性和方法。
注意类能够直接访问类里面的成员,那么类访问常量需要对象存在吗?答案是不需要。因为类访问常量是找类,跟对象没有关系。这样就会产生性能之争,要产生一个对象就会要额外的内存开销,变量找到对象,对象再找到类再去访问的过程,类直接访问的效率会高。但是对象的灵活性是不可替代的,因为类用这种方式永远只有一个固定的东西,而用不同的对象就会有不同的信息,所以对象有对象存在的价值,不是因为类效率高了,就只用类。
四、小结
1、类访问成员的方式是使用范围解析操作符“::”访问,由类名直接访问:类名::类常量。
2、类本身是通过同类类似的对象抽象而成,所以属性和方法本身都是由对象来访问,不用范围解析操作符,虽然也能用。
3、什么时候用到范围解析操作符,要看类是否有一些需求需要自身对数据和操作进行加工, 而不依赖于对象,比如人类的进化就不是某一个具体的个体,现在科技在某一种情况下可以直接实现整个人类的进化或者灭绝,此时,可能在类的概念上存在加工或操作,要定一些跟类相关的一些操作。