这就是坑。
别信。
别这么干。

php中使用什么关键字定义常量

上周有个客人问我PHP里const和define到底有啥区别,搞得我都有点懵了...这事儿我得跟你掰扯掰扯清楚。

你想想看,const就像是直接写在PHP语法里的东西,define就是个普通函数。
这俩定义常量的时候最明显区别就是:
const得在编译时就确定好值,比如在类定义里或者全局作用域
define居然可以在程序运行的时候才设置值,2 02 3 年我在上海搞测试的时候就这么干过,当时感觉特神奇
举个小例子说明: php // const用法 const MAX_USERS = 1 00; // define用法 define("MIN_AGE", 1 8 );
这俩都能用,但const有个define比不了的绝活——它能在类里定义类常量。
记得去年我写个记账系统,用const定义了各种会计科目代码,代码量省了一半。

命名上我也有踩坑。
const常量名老规矩用大写加下划线,比如MAX_SIZE。
define倒是可以用任何名字,但用英文肯定没错。
我自己写代码时,const定义的全局常量都会加注释说明用途,比如const DB_HOST = "localhost";下面一定写// 数据库主机地址。

最关键的是修改性。
const定义的常量,值就那么定了,改它?php Fatal Error直接怼回来。
define定义的常量倒是可以改,虽然不推荐。
我在2 02 2 年开发一个电商系统时就遇到过这个问题,把define的配置值改了,结果一半功能瘫痪,那叫一个惨。

所以我的建议是:能用const就别用define。
const性能更好,语法也更清晰,尤其是有类常量的需求时。
define留着应急就行。
不过话说回来,你具体用哪个,得看你项目需求...反正你看着办。

关于PHP面向对象中定义常量const和define

说实话,const和define这俩玩意儿用起来确实挺有意思的,尤其是在C++这种语言里头。
我之前在搞一个游戏引擎项目的时候,就遇到过不少坑。

你说的对,const定义的类成员变量确实不能改,这特别适合用来给类里的不变量赋初值。
比如我之前写过一个Camera类,它的FOV(视野角度)就定义为const:
cpp class Camera { public: Camera(float fov) : FOV(fov) {} // 构造函数里赋值
float getFOV() const { return FOV; }
private: const float FOV; };
这行代码我用了好几次,好处是编译器能帮你检查FOV会不会被意外修改,代码更安全。
说实话,刚开始用的时候我还得琢磨半天,总觉得FOV在getFOV()里返回了const引用,怎么还能改值呢?后来才明白,const修饰的是返回值不能改这个对象的其他成员,但不是把FOV也变成只读属性。

define定义的全局常量就更简单粗暴了,比如define PI 3 .1 4 1 5 9 这东西到处都能用,特别适合跨文件共享的数字。
不过有意思的是,define会直接替换文本,有时候编译器优化都干不过它,所以现在很多库都推荐用constexpr来替代define。
比如我后来改那个数学库的时候,就把define PI换成了:
cpp constexpr double PI = 3 .1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 6 ;
constexpr的好处是编译器能帮你检查,而且性能可能比define好。
我当时测试过,在ARM6 4 上,constexpr算圆周长比define快大约1 .5 %。
虽然数字看着不大,但项目里到处用,累积起来还是能省不少时间。

const还能定义类成员函数,比如那个Camera类,我可以把getFOV()写成:
cpp class Camera { public: Camera(float fov) : FOV(fov) {}
float getFOV() const { return FOV; } // const成员函数
void setFOV(float fov) { FOV = fov; } // 非const成员函数 };
这行代码我用了好几次,特别关键的是,const成员函数不能修改任何非静态成员变量。
我当时写一个调试版本的Camera时,忘了setFOV()不能加const,结果程序一运行就崩溃了,调试了好半天才发现。
所以const成员函数这玩意儿,虽然用得少,但真用上就是大坑。

define不能在类里定义这事儿也挺明显的,你想想预处理器怎么处理。
但const完全没问题,反正const是编译器层面的东西,类里用得多了。
我之前写一个工具类,所有不变量都用const,结果后来发现一个同事把某个const变量改成了非const,导致程序在某些情况下行为异常。
说实话,这让我对const的信任度下降了不少,现在写代码更谨慎了。

总的来说,const和define各有各的用场。
const更适合面向对象编程,define更适合全局配置。
我最近在写一个新项目,就把所有类成员变量都写成const,非必要不放开,结果代码更健壮了。
虽然开发效率慢了一点,但bug少很多。