PHP常量定义define与const

一、const

PHP5.3以前,const只能在类内部声明变量,5.3+允许在外部声明变量,但还不能使用常量计算!

const ONE = 1;
const WORD = ‘hello world‘;

PHP5.6开始,const支持包括数值、字符串字面量以及其他常量在内的数值表达式,进行常量定义。并且更重要的是const开始支持定义常量数组!

const ONE = 1;
const TWO = ONE * 2;
const ARR = [‘a‘, ‘b‘];

需要注意的是const并不支持对变量及方法的常量定义,如:

$path = __DIR__;
const CURR_PATH = $path;
const CEIL_NUM = ceil(7.3);

以上代码将会报错“Constant expression contains invalid operations”。

二、define

在PHP5.6以前,const能做的,define都能做到!并且define是支持对变量及方法的常量定义的,如:

$path = __DIR__;
define(‘CURR_PATH‘, $path);
define(‘CEIL_NUM‘, ceil(7.3));

但是在PHP7.0以前,define并不支持定义数组常量,如果一定要类似地使用,你可能需要用到serialize和unserialize,但显然其成本太大。

define(‘ARR‘, [‘a‘, ‘b‘]);

以上代码在PHP7.0以前将会报错,7.0+则正常。

三、const和define的选择

撇开约定、规范而言,首要考虑的就是效率问题。因此我们必须要了解其各自的底层编译。

以下将使用PHP的扩展VLD对Opcode层进行分析,要重点关注的是OP数(number of ops:)以及系统级的函数调用(op)

1、先分析define,在php环境下,创建一个文件t.php,其代码如下:

define(‘S‘, 1);

执行VLD命令分析Opcode:

其中,OP数为5,执行操作用到了INIT_FCALL、SEND_VAL、DO_ICALL、RETURN 4个调用

2、接着分析const,将t.php的代码修改为:

const S=1;

执行VLD命名分析Opcode:

其中,OP数为2,执行操作用到了DECLARE_CONST、RETURN 2个调用

显然,const的效率远远超过define!

因此在const和define的选择上,建议优先采用const,除非需要定义的常量通过变量传递或者用方法处理时,才使用define。

时间: 2025-01-01 18:13:24

PHP常量定义define与const的相关文章

PHP常量:define和const的区别

常量,就是一个用于存储“不会(也不允许)变化的数据”的标识符.比如圆周率,在一定的应用场景中,就是一个固定的值(人为规定为某个值).常量默认大小写敏感.通常常量标识符总是大写的. (1)define()函数定义常量.define(‘常量名’, 对应的常量值); (2)const关键字定义常量.const 常量名 = 对应的常量值; 在php5.3.0以后,可以使用const关键字在类定义的外部定义常量,先前版本const关键字只能在类(class)中使用.一个常量一旦被定义,就不能再改变或取消定

PHP中定义常量define与const

我们通常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,也可减少团队开发的出错.那么define和const有什么区别呢? 1.const是一个语言结构:而define是一个函数,可以通过第三个参数来指定是否区分大小写.true表示大小写不敏感,默认为false define('PI', 3.14, true); 2.const简单易读,编译时要比define快很多. 3.const可在类中使用,用于类成员常量定义,定义后不可修改:define不能在类中使用,可用于全局变量

宏定义 #define 和常量 const 的区别

宏定义 #define 和常量 const 的区别 类型和安全检查不同 宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误: const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查 编译器处理不同 宏定义是一个"编译时"概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束与编译时期: const常量是一个"运行时"概念,在程序运行使用,类似于一个只读行数据 存储方式不同 宏定义是直接替换,不会分配内存,存储与

PHP定义常量define和const的区别

常量是一个简单的标识符.在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其实不是常量).常量默认大小写敏感.通常常量标识符总是大写的. 可以用define()函数来定义常量.在php5.3.0以后,可以使用const关键字在类定义的外部定义常量,先前版本const关键字只能在类(class)中使用.一个常量一旦被定义,就不能再改变或取消定义. 常量只能包含标量数据(boolean.integer.float和string).可以定义resource常量,但应尽量避免,因为会造成不可预料的结果

PHP常量定义之define与const对比

简要归纳PHP中两个常量定义关键字的区别: 1.define是函数,const是语言结构,PHP编译时const速度快.2.define只能用在类外,const类内类外皆可.3.define定义的常量是全局的,const定义的常量受命名空间限制.4.define可用在条件语句中,const不能.5.define可用表达式作为名称,const只可采用普通常量名称.6.const只能接受静态的标量,而define可以采用任何表达式.7.const定义的常量时大小写敏感,而define可以通过第三个参

PHP常量详解:define和const的区别

常量是一个简单的标识符.在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其实不是常量).常量默认大小写敏感.通常常量标识符总是大写的. 可以用define()函数来定义常量.在php5.3.0以后,可以使用const关键字在类定义的外部定义常量,先前版本const关键字只能在类(class)中使用.一个常量一旦被定义,就不能再改变或取消定义. 常量只能包含标量数据(boolean.integer.float和string).可以定义resource常量,但应尽量避免,因为会造成不可预料的结果

静态修饰符static,类中的常量定义修饰符

static可以用来区分成员变量.方法是属于类本身还是属于类实例化后的对象.有static修饰的成员属于类本身,没有static修饰的成员属于类的实例. 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失static是一个修饰符,用于修饰成员(成员变量和成员函数)静态成员随着类的加载而加载.静态成员优先于对象存在.静态成员被所有对象所共享静态成员多了一个中调用方式,可以被类名直接调用.静态的优缺点优点: 静态成员多了一种调用方式.可以直接被类名调用 格式 :类名.静态成员.也

define vs const vs enum

以前用C,习惯了define:const,enum 什么的基本不太会用,现在有时间整理一下. /***********************************************************************************************************/ define:宏定义,在预编译阶段,编译器将宏作简单替换.比如: #define SUNDAY 7 在预编译阶段,凡是文本中出现SUNDAY的地方,编译器就会将其用7来代替.这样的好处显

C++ 文件include规则 常量定义

总结一句话就是: C++的函数声明,变量声明,类定义写在头文件里,而函数实现,变量定义,类方法实现写在.cpp文件中:但是对于内联函数和模版类,函数的实现也要写在头文件里!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1. 将类的成员变量.类方法的定义写在.h中,将类方法的实现写在.cpp中,不要include .cpp文件,不要在.h文件中只写class MyClass; ,一定要写类成员变量和方法的全部定义!!!类方法的实现写在.cpp文件中. 2. 类模版或者模版的定义一定要