const没define好用 php,3分钟短文|PHP 定义常量,我该用define还是const?这下不迷茫了...

引言

我们今天说一下 PHP 编程中,定义一个常量所使用的两种方法。有哪些区别,以及哪种是最佳实践?

a6018e0478dba4f08342e48bffeb2da7.png

问题

有开发者说,我在学习编写 PHP,可是定义常量的方法很是让人迷惑。比如有下面这样的写法:

define('FOO', 1);const FOO = 1;

而且在框架中,也大量地掺杂着两种定义方法的混用。到底哪一个好?

深层原因

对于 PHP5.3 及以上,定义一个常量有两种方法,一个是用 const 关键字,一个是使用 define 函数。比如这样写:

const FOO = 'BAR';define('FOO', 'BAR');

这两种方式之间的根本区别是const在编译时定义常量,而define在运行时定义常量。这导致了大多数const的缺点。下面列举一些:

1 - const不能用于有条件地定义常量。要定义全局常量,必须在最外层范围中使用它:

if (...) { const FOO = 'BAR'; // 无效}// 但是if (...) { define('FOO', 'BAR'); // 有效}

一种常见的应用是检查常量是否已经定义:

if (!defined('FOO')) {define('FOO', 'BAR');}

2 - const只能接受一个静态标量(数字,字符串或其它常量值true,false,null,__FILE__),而define()可使用任何表达式。

const BIT_5 = 1 << 5; // VPHP 5.6 以下版本均无效define('BIT_5', 1 << 5); // 有效

3 - const只能采用简单的常量名称,而define()接受任何表达式作为名称。这样可以执行以下操作:

for ($i = 0; $i < 32; ++$i) { define('BIT_' . $i, 1 << $i);}

4 - consts始终区分大小写,而define()允许您通过将其true作为第三个参数传递来定义不区分大小写的常量。

define('FOO', 'BAR', true);echo FOO; // BARecho foo; // BAR

const 的优点

除了上一节所说的 const 的缺点外,我一般都会坚持使用 const。因为它实在太好用,太可爱了。

1 - const使代码更好读。

它是一种语言构造,而不是函数,并且与您在类中定义常量的方式保持一致。

2 - const作为一种语言构造,可以通过自动化工具进行静态分析。

3 - const在当前名称空间中定义一个常量,同时define()必须传递完整的名称空间名称:

namespace A\B\C;// 定义常量 A\B\C\FOO:const FOO = 'BAR';define('A\B\C\FOO', 'BAR');

4 - 由于PHP 5.6const常量也可以是数组,而define()尚不支持数组。但是,PHP 7中的两种情况都支持数组。

const FOO = [1, 2, 3]; // PHP 5.6 及以上有效define('FOO', [1, 2, 3]); // PHP 7.0 及以上有效

5 - const还可以在类或接口内使用它来定义类常量或接口常量。define没这功能。

class Foo {const BAR = 2; // 完全支持}// 但是class Baz {define('QUX', 2); // 不能这么写}

写在最后

除非特别需要,我一般不使用 define 定义常量,可读性不强。

加上框架中强制的 OOP 方式,使得我们自觉不自觉地形成 const 定义类常量的习惯。而且对于 IDE 的自动索引也极为友好,写代码顺溜的不得了。

Happy coding :_)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot+mybatis集成自定义缓存ehcache用法笔记

今天小编给大家整理了springbootmybatis集成自定义缓存ehcache用法笔记&#xff0c;希望对大家能有所办帮助&#xff01;一、ehcache介绍EhCache 是一个纯Java的进程内缓存管理框架&#xff0c;属于开源的Java分布式缓存框架&#xff0c;主要用于通用缓存,Java EE和轻量级容器。…

Java取绝对值

在Java中可以使用Math.abs()方法来方便的进行绝对值计算&#xff0c;例如&#xff1a; 输入的是正数的时候直接返回即可&#xff0c;当是负数的时候返回它的相反数即可。 使用三目运算符可以使用一行代码就能做到 int value Math.abs(-90);System.out.println(value);System…

PHP怎么做一个加法口诀,神奇的手指速算口诀,100以内的加减法一分钟学会

手指速算是一套手、心、脑并用的科学计算方法&#xff0c;教孩子学会&#xff0c;既能开发大脑、增强动作协调能力和记忆力&#xff0c;还能增强学习兴趣哦~学起来并不难哦&#xff0c;爸爸妈妈可以和孩子一起算一算&#xff0c;比比看谁更快&#xff01;手指速算秘诀准备&…

Android_Layout (一)

layout &#xff08;布局&#xff09; --->Android 有五大布局&#xff0c;分别是&#xff1a; LinearLayout : 线性布局&#xff0c;子组件按照垂直或者水平方向来布局。RelativeLayout &#xff1a;相对布局&#xff0c;按照控件之间的相互位置进行参照物的概念排布&…

前端:uniapp封装网络请求笔记

uniapp作为开发移动端的前端框架&#xff0c;目前国内是非常流行的&#xff0c;使用HbuilderX开发工具基于uniapp框架开发的系统可以方便的转换为小程序、APP等移动端程序&#xff0c;大大降低了移动开发的成本。网络请求更是每个前端项目必备的技术&#xff0c;所以有必要进行…

java中instanceof使用详细介绍

instanceof是Java语言中的一个二元运算符&#xff0c;它的作用是&#xff1a;判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例&#xff0c;即它左边的对象是否是它右边的类的实例&#xff0c;该运算符返回boolean类型的数据。 boolean result obj…

javaWEB总结(9):自定义HttpServlet

前言:我们知道 MyHttpServlet是MyGenericServlet的子类&#xff0c;MyHttpServlet会继承父类的方法&#xff0c;可是却很少去追问MyHttpServlet中的doGet方法和doPost方法是如何进行判断的&#xff0c;本文主要做一个小例子&#xff0c;进一步理解HttpServlet。有些代码前文多次…

Java中局部变量必须初始化

Java中有两种变量&#xff0c;局部变量和成员变量。 成员变量可以不进行初始化&#xff0c;虚拟机也会确保它有一个默认的值。 局部变量不能这样做&#xff0c;我们必须对它进行赋值&#xff0c;才能使用它。

php 直播服务器搭建,基于Nginx搭建RTMP/HLS视频直播服务器

1、Nginx环境搭建(基于lnmp环境)//下载并安装lnmp环境wget -c http://soft.vpser.net/lnmp/lnmp1.3.tar.gz && tar zxf lnmp1.3.tar.gz && cd lnmp1.3 && ./install.sh lnmp安装完成安装完成后访问服务器地址会出现如下界面lnmpPS&#xff1a;安装时生…

办公:office办公软件Excel表格的打印技巧

很多新手使用办公软件过程中&#xff0c;对于Excel的打印出现了诸多问题&#xff0c;今天我们就一起来看看表格打印的几个技巧&#xff01; 打印预览时网格线怎么不见了&#xff1f; 如何调整打印区域的页边距&#xff1f; 如何设置单色打印&#xff1f; ...... 这些打印时遇到…

线程池和线程详细教程

1. 线程池的概念&#xff1a; 线程池就是首先创建一些线程&#xff0c;它们的集合称为线程池。使用线程池可以很好地提高性能&#xff0c;线程池在系统启动时即创建大量空闲的线程&#xff0c;程序将一个任务传给线程池&#xff0c;线程池就会启动一条线程来执行这个任务&#…

虚拟主机 php .htacess,LiteSpeed添加虚拟主机+支持htaccess图文教程

上次给大家简单介绍了Debian下手动安装LiteSpeedMySQLPHP的教程(点击查看)&#xff0c;但是这个教程还没完&#xff0c;想要使用litespeed还要进入后台进行设置&#xff0c;包括添加虚拟主机和.htaccess伪静态的支持&#xff0c;本文就继续这个话题给大家详细做个图文教程吧~为…

前端:uniapp封装组件用法笔记

大家在做前端项目开发的时候&#xff0c;经常会遇到公用的一些页面&#xff0c;比如搜索、列表、商品详情卡片、评论列表等。为了提高开发效率、使代码看起来更加简洁&#xff0c;这个时候封装相应的组件是最好的解决方案。今天小编给大家介绍一下如何在uniapp中封装组件&#…

Angular的工作原理

首先上一小段代码&#xff08;index.html&#xff09;&#xff0c;结合代码我们来看看&#xff0c;angular一步一步都做了些什么。 <!doctype html> <html ng-app><head><script src"angular.js"></script></head><body>&…

网络知识:四个网络命令ping、arp、tracert、route的用法介绍

网络相关的从业人员&#xff0c;都需要面对检测和解决网络故障的各种问题&#xff0c;实际案例中因为网络导致的故障也是最多的&#xff0c;今天我们和大家一起来学习一下解决网络故障时使用最多的四个网络命令。希望对大家以后的实际工作中的故障排除起到作用。 1、Ping命令的…

jQuery掷骰子

网上找的jQuery掷骰子效果&#xff0c;测试兼容IE7及以上浏览器&#xff0c;IE6没有测试 js代码如下&#xff1a; 1 $(function(){2 var dice $("#dice");3 dice.click(function(){4 $(".wrap").append("<div iddice_mask><…

电脑知识:台式电脑如何使用无线网上网

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

电脑维修:如何给笔记本电脑升级内存条

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

Object o = new Object()在内存中占几个字节

CAS&#xff1a; Compare and Swap&#xff0c;即比较再交换。 jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的&#xff0c;这是一种独占锁&#xff0c;也是…