PHP | Define() 与 const

2024-01-09

在 PHP 中,可以通过两种方式声明常量:

  1. With define keyword

    define('FOO', 1);
    
  2. Using const keyword

    const FOO = 1;
    

  • 这两者之间的主要区别是什么?
  • 何时以及为何应使用其中一种,何时使用另一种?

从 PHP 5.3 开始,有两种方法定义常量 http://php.net/language.constants.syntax: 要么使用const关键字或使用define() http://php.net/define功能:

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

这两种方式的根本区别在于const在编译时定义常量,而define在运行时定义它们。这导致大多数const的缺点。的一些缺点const are:

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

     if (...) {
         const FOO = 'BAR';    // Invalid
     }
     // but
     if (...) {
         define('FOO', 'BAR'); // Valid
     }
    

    你为什么要这么做?一种常见的应用是检查常量是否已定义:

     if (!defined('FOO')) {
         define('FOO', 'BAR');
     }
    
  • const接受静态标量(数字、字符串或其他常量,例如true, false, null, __FILE__), 然而define()采取任何表达方式。由于 PHP 5.6 中允许常量表达式const还有:

     const BIT_5 = 1 << 5;    // Valid since PHP 5.6 and invalid previously
     define('BIT_5', 1 << 5); // Always valid
    
  • const采用简单的常量名称,而define()接受任何表达式作为名称。这允许做这样的事情:

     for ($i = 0; $i < 32; ++$i) {
         define('BIT_' . $i, 1 << $i);
     }
    
  • consts 始终区分大小写,而define()允许您通过传递来定义不区分大小写的常量true作为第三个参数(注意:从 PHP 7.3.0 开始不推荐定义不区分大小写的常量,并从 PHP 8.0.0 开始删除):

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

所以,这是事情不好的一面。现在让我们看看我个人总是使用的原因const除非出现上述情况之一:

  • const只是读起来更好。它是一种语言构造而不是函数,并且与在类中定义常量的方式一致。

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

  • const在当前命名空间中定义一个常量,而define()必须传递完整的命名空间名称:

     namespace A\B\C;
     // To define the constant A\B\C\FOO:
     const FOO = 'BAR';
     define('A\B\C\FOO', 'BAR');
    
  • 从 PHP 5.6 开始const常量也可以是数组,而define()还不支持数组。然而,PHP 7 中这两种情况都支持数组。

     const FOO = [1, 2, 3];    // Valid in PHP 5.6
     define('FOO', [1, 2, 3]); // Invalid in PHP 5.6 and valid in PHP 7.0
    

最后,请注意const也可以在类或接口中使用来定义类常数 http://php.net/manual/en/language.oop5.constants.php或界面常数。define不能用于此目的:

class Foo {
    const BAR = 2; // Valid
}
// But
class Baz {
    define('QUX', 2); // Invalid
}

Summary

除非您需要任何类型的条件或表达式定义,否则请使用consts 而不是define()s - 只是为了可读性!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP | Define() 与 const 的相关文章

  • 学说“没有命名的协会”

    将我添加到无法找出其学说映射出了什么问题的人列表中 我正在模拟国际象棋Game与一对多Halfmoves 有任何想法吗 DDL create table game game id int primary key create table h
  • php 打印 aa aaa ab aab 直到 zzz 的算法

    你好 我需要打印从 a 到 zzz 最多 3 个字母 例如我的输出应该是 A B Z AA AB AZ BA BB ZZ AAA AAB ZZZ 我在过去的 5 个小时里努力尝试 我找不到任何逻辑 我尝试了下面的代码 PHP 有一个方便的功
  • 如何在 Laravel 中创建一条包罗万象的路线

    我需要一个 Laravelroutes php将捕获所有流量到特定的条目example com premium section网站 以便我可以提示人们在访问优质内容之前成为会员 您还可以通过在参数上使用正则表达式来捕获 全部 Route g
  • 使用 .htaccess 启用 PHP 短标签

    我在自己的 Centos 服务器上设置了 Apache 并具有多个虚拟 Web 服务器 并且我希望仅为位于以下位置的其中一个 Web 服务器启用 PHP 短标记 var www ostickets html 我可以通过添加成功启用短标签sh
  • 如何防止 CakePHP 中重复表单提交?

    我发现 CakePHP 中的安全组件通过将令牌作为隐藏值添加到表单中来帮助防止 CSRF 我想知道是否有办法防止使用此组件或其他组件 帮助器重复表单提交 在之前的项目中 我使用了保存在会话中的唯一哈希值 该哈希值会在提交时读取并删除 重复提
  • PMA 4.5.2.0 file_exists():open_basedir 限制生效

    从 PPA 在我的 Ubuntu 服务器上安装 phpMyAdmin 后 https launchpad net nijel archive ubuntu phpmyadmin https launchpad net nijel archi
  • Laravel 验证:存在附加列条件 - 自定义验证规则

    在 Laravel 中指定存在验证规则时 是否有一种方法可以引用另一个字段 我希望能够说输入 a 必须存在于表 a 中 输入 b 必须存在于表 b 中 并且表 b 中列 x 的值必须等于输入 a 最好通过例子来解释 public rules
  • 为什么当尝试使用 $this->data 访问 CakePHP 时,密码字段为空?

    我正在实现一个身份验证组件 这是我的注册页面 create User array action gt login echo form gt input primary email array size gt 32 echo form gt
  • 从twitter api实体参数php获取图像url

    我正在尝试通过实体参数使用 php 获取并显示在推文中发布的图像 我的 url 中有 include entities 可以看到返回的 json 中的实体 在我的 foreach 循环中 我正在执行以下操作 foreach results
  • Javascript 函数与 php 一样吗?

    我在网站上使用 WebIM 提供聊天支持 我希望能够在客户端启动聊天会话时设置一个计时器 如果操作员 技术人员在 x 秒内没有响应 我希望页面重定向到客户端可以留言的另一个页面 有点像 请稍等 我们尝试联系您 这样 如果所有技术人员都太忙或
  • Facebook 中用户的时区是如何编码的

    我需要检查用户的时区 但我找不到它的真正定义 参考API http developers facebook com docs reference api user says 用户的时区与 UTC 的偏移量 现在在维基百科上这些是可能的时区
  • DOMPDF - 未找到“字体”类

    我正在尝试通过命令行添加字体 每次我尝试都会收到以下错误 Fatal error Class Font not found in home scripts public html MarketingPalv2 load font php o
  • PHP mkdir() 和 fopen() 不起作用 - 权限问题? umask问题?

    以下 PHP 脚本无法创建目录 它也将无法创建文件 当目录已经存在时 ini set error reporting E ALL define ABSPATH SERVER DOCUMENT ROOT echo ABSPATH br br
  • 如何在 Laravel 代码中使用 Artisan 命令?

    如何在我的 php caode Ex 中使用 Artisan 命令行 php artisan version to 您可以从控制器调用 Artisan 命令 如下所示 calling of migrate install Artisan c
  • Yii 查询时对相关模型的限制

    我遇到了极限问题 我正在使用的代码如下 model PostCategory model record model gt with array posts gt array order gt posts createTime DESC li
  • Laravel 8、Sanctum、Fortify /logout 在 Postman 中抛出“CSRF 令牌不匹配”

    我安装了 L8 Sanctum 和 Fortify 进行身份验证 我以前可以 login 使用了Pre request Script设置X XSRF TOKEN 我什至得到了 api user成功地 但当我这样做时 logout 我在 Po
  • 通过ajax执行后期操作时如何克服CORS重定向问题?

    我可以通过外部登录表单中的 post 方法类型提交表单来登录 roundcube 实例 托管在另一台服务器上 我收到此错误 通过 ajax 签名时 XMLHttpRequest 无法加载https 192 168 0 7 mail http
  • 与 array_intersect 相反?

    是否有一个内置函数可以获取数组 1 中不存在于数组 2 中的所有成员 我知道如何以编程方式执行此操作 只是想知道是否有一个内置函数可以执行相同的操作 所以请不要提供代码示例 这听起来像是一份工作array diff http www php
  • PHP 文件服务脚本:下载不可靠?

    这篇文章最初是关于 ServerFault 的一个问题 https serverfault com questions 131156 user receiving partial downloads https serverfault co
  • 如何移动 Zend_Layout 的“视图”

    通常它会是这样的结构 application modules somemodule views scripts index index phtml 我如何将其移动到 application templates somemodule temp

随机推荐

  • 安卓监控应用程序

    我想创建一个具有实时监控功能的Android应用程序 一种监控功能是审核音频流 另一个功能是与外围传感器交互 这些监控功能可以由其他功能触发 此外 为了节省功耗 音频功能将以轮询模式运行 即休眠一定时间并唤醒一定时间 我正在考虑如何设计An
  • Kubernetes CI/CD 管道

    我的公司已决定过渡到基于微 服务的架构 在过去的几个月里 我们一直在进行大量研究 以了解这个东西的架构到底是什么样子 到目前为止 我们已经确定 用于服务开发的 Dotnet 核心 尽管与语言无关是最终目标 用于消息代理的 Kafka Doc
  • IIS7 应用程序池无法加载具有固定基地址的库

    我的 NET 4 0 Web 服务正在使用 libeay32 dll 它是在 VS2010 中使用 FIXED 选项编译的 以便符合 FIPS 要求 这意味着 libeay32 dll 无法加载 除非它位于某个地址 0xfb00000 抛出
  • Java帮助:使用循环打印start arg和end arg之间的值的平方

    所以我是java新手 请原谅任何混乱的代码等 我必须编写一个程序 打印出命令行中声明的开始和结束参数的平方值 以及之间的值的平方 这是我到目前为止的代码 它非常粗糙 但我需要帮助来获取中间的变量以打印出来 public static voi
  • 将段落宽度限制为其父级 div

    我有以下 HTML 代码 div style width 100 div img src http www lappelducourty be test wp content uploads 2013 01 siesta 300x225 j
  • 创建浮动按钮以在电子表格中的单元格中添加/减去值

    为了简化现场数据输入 即使用平板电脑 我想在电子表格中创建按钮 用于在选定的单元格中添加或减去值 使用旋转按钮不是一种选择 因为我必须添加数百个这样的按钮 这个答案 https superuser com questions 1307146
  • 两端和之间有点的垂直线

    我一直在这里和谷歌上寻找解决方案 但没有成功 我想创建一条垂直线 其末端有点 沿线有一些点 例如img 我怎样才能用CSS实现这一点 我可以做一条有间距的虚线 但我不知道如何创建这条线 如果这可能的话 这是一个可能帮助您解决问题的快速片段
  • Python readline() 不起作用?

    我正在做一个小程序来帮助我学习Python 我对Python很陌生 我正在使用Python 3 2 在 Python shell 中 当我输入 f open filename txt r f readlines 它打印了所有内容filena
  • 如何知道代码是否在 TransactionScope 内?

    了解代码块是否在 TransactionScope 内的最佳方法是什么 Transaction Current 是一种可靠的方法吗 还是有什么微妙之处 是否可以通过反射访问内部 ContextData CurrentData Current
  • 面向 Python 程序员的 MATLAB

    我用过MATLAB http en wikipedia org wiki MATLAB以前断断续续 但现在我需要对它有一个很好的理解 而我最熟悉的语言是Python 想要描述与 Python 相比的 MATLAB 语言功能 惯用语 最佳实践
  • 在 window.open() 中使用 rel="noopener"

    所以我知道我可以申请rel noopener in an a使用时标记target blank 但我试图将其作为参数传递给window open ie window open http cats com blank rel noopener
  • Google Web Optimizer - 距离获胜组合还有多长时间?

    我已经运行了 A B 测试谷歌网络优化器已经六个星期了 而且还看不到结束的迹象 谷歌仍然表示 我们还没有收集到足够的数据来显示任何重大结果 当我们收集更多数据时 我们应该能够向您展示一个获胜的组合 有什么方法可以判断谷歌距离做出决定还有多远
  • 谷歌在没有地图的情况下放置图书馆

    我正在尝试使用谷歌地点库来执行附近的搜索请求 https developers google com maps documentation javascript places place search requests https deve
  • 使用 cv2.imshow 时获取此黑色窗口而不是图片

    我不知道应该使用什么术语来表示我得到的窗口 因此我附上了窗口的屏幕截图以供参考 在我运行此代码的 10 次中 大约有 7 次出现此窗口 import cv2 import numpy as np import face recognitio
  • 使用英特尔 MKL 计算“trans(a)*inv(b)*a”的正确方法

    我在用英特尔的 MKL LAPACKE 和 CBLAS https software intel com en us mkl developer reference c cblas gemm计算 yn trans a inv zt a tr
  • 如何在ember中绑定js输入值?

    我有一个 ember 组件 它有一个 html 输入框 例如 从我的组件中 我在输入具有如下值的搜索框时触发操作 App TopBarComponent Ember Component extend keyUp function event
  • 将 java.util.Date 转换为 java.time.LocalDate

    转换的最佳方法是什么java util Date反对新的 JDK 8 JSR 310java time LocalDate Date input new Date LocalDate date 简短回答 Date input new Dat
  • Python 3 中的相对导入不起作用[重复]

    这个问题在这里已经有答案了 我有以下目录 mydirectory init py file1 py file2 py 我在 file1 py 中定义了一个函数 f 如果在 file2 py 中我这样做 from file1 import f
  • 声纳 - 无法请求服务器版本 | HTTP 状态 404

    我正在为 Java 设置一个声纳系统 我的本地测试 SonarServer 4 0 成功连接并处理我的 antscript 我使用的是 sonar ant task 2 2 jar 但我的目标服务器 3 7 3 甚至不提供服务器版本 我尝试
  • PHP | Define() 与 const

    在 PHP 中 可以通过两种方式声明常量 With define keyword define FOO 1 Using const keyword const FOO 1 这两者之间的主要区别是什么 何时以及为何应使用其中一种 何时使用另一