PHP 类常量怎么用
不少刚接触PHP的开发者,都会混淆“常量”和“变量”——毕竟两者都能存值,但用法天差地别。比如你在写一个电商系统时,要定义一个全国统一的运费标准,这个数值不能改,要是用变量存,很容易不小心被后面的代码覆盖,造成订单运费算错的大麻烦。这时候,PHP的“类常量”就是专门用来解决这类“固定值复用”问题的工具,比普通常量更贴合面向对象的开发场景。
什么是类常量?和普通常量有啥区别?
先别急着记术语,用生活例子就能懂:普通常量就像小区门口的“门禁密码”,是整个项目共用的,所有地方都能改;而类常量更像你家房门的“密码锁固定密码”,属于你家这个“类”,只有家里人能改,外面人碰不了。

具体到代码里,普通常量用define('常量名', 值)定义,全局可用;类常量要写在类的内部,用const定义,而且必须是固定值,不能是变量或函数返回值。比如你做一个宠物饲养小程序,定义一个宠物的“基础食量”,就适合用类常量:
`php
class Pet {
// 类常量:基础食量,所有宠物都适用,不能改
const BASE_FOOD = 50;
}
`
这时候你只要记住:类常量是类的“专属固定值”,专门服务于这个类的功能,不会被其他代码乱改,比普通常量更安全。
类常量怎么用?分3种常见场景
类常量的用法其实很简单,核心是通过“类名”或“实例对象”来调用,不用加美元符号$,这也是和类变量(属性)最明显的区别,记不住的话可以想:常量是“固定值”,不用变,自然不用加$。
类内部调用:直接用`self::常量名`
类里面的方法要调用自身的类常量,用self::代替类名就行,就像你家孩子喊“我们家的密码是123”,不用报地址。还是用宠物的例子,写一个计算宠物当天食量的方法:
`php
class Pet {
const BASE_FOOD = 50; // 基础食量
const GROWTH_MULTIPLIER = 1.2; // 生长阶段加成
public function calculateFood() {
// 内部调用,用self::,不用类名重复写
return self::BASE_FOOD * self::GROWTH_MULTIPLIER;
}
}
`
调用这个方法时,会自动算出60的食量,而且基础食量是固定的,不会被误改。
类外部调用:用`类名::常量名`
如果是类外面要用到这个固定值,直接写类名加::就行,就像快递员喊“XX小区的密码是123”,直接报地址找对应的密码。比如你要统计所有宠物的总食量,就可以这么用:
`php
// 外部调用,直接用类名::常量名
$base = Pet::BASE_FOOD;
echo "所有宠物的基础食量统一是:" . $base . "克";
`
输出的结果会是“所有宠物的基础食量统一是:50克”,不管你实例化多少个宠物对象,这个值都是固定的,不会乱。
继承时调用:用`parent::常量名`
如果有子类继承了父类,子类可以用parent::调用父类的类常量,就像孩子喊“我爸妈家的密码是123”,复用父类的固定值,不用重复写。比如你写一个“宠物猫”的子类,要用到父类的基础食量:
`php
class Cat extends Pet {
public function catFood() {
// 调用父类的类常量,用parent::
return parent::BASE_FOOD;
}
}
$myCat = new Cat();
echo "我家猫的基础食量是:" . $myCat->catFood() . "克";
`
结果会输出“我家猫的基础食量是:50克”,完全不用再在子类里重新定义基础食量,省了很多重复代码。
用类常量要注意2个坑
虽然类常量好用,但有两个细节要避开:第一,类常量的值必须是固定的,不能是变量或函数返回值,比如const A = 10 + 5就会报错,得写成const A = 15;第二,类常量不能被修改,写Pet::BASE_FOOD = 60会直接报错,正好符合它“固定值”的定位,避免了很多低级错误。
总的来说,PHP类常量就是给类配的“专属固定值”,专门用来存那些不会变、只服务于当前类的参数,不管是内部调用、外部复用还是继承,都比普通常量更规范,也更符合面向对象的开发逻辑,是新手必须掌握的基础知识点。