PHP 变动:用于创建常量数组的 define() 与 const

文章目录

  • 参考
  • 环境
  • 常量数组
      • 不可变性
      • 版本限制
  • const
  • define()
      • 构造
      • 大小写不敏感的常量
      • $case_insensitive 参数
          • PHP7.3
          • PHP8
  • 若 define() 在不支持常量数组的版本中运行

参考

项目描述
搜索引擎BingGoogle
AI 大模型文心一言通义千问讯飞星火认知大模型ChatGPT
PHP 手册PHP Manual

环境

项目描述
PHP5.5.05.6.87.0.07.2.57.4.98.0.08.2.9

常量数组

不可变性

在PHP中,常量数组是指 包含在一个常量中的数组。与普通变量不同,常量一旦被定义,就不能被修改或重新赋值。常量数组允许你在代码中定义一个不可更改的数组,这在某些情况下可能非常有用。对此,请参考如下示例:

<?phpconst ARR = [1, 2, 3];# 尝试修改常量数组将导致异常的发生
ARR[0] = 999;var_dump(ARR);

执行效果

上述示例中,我们尝试修改常量数组中的内容,这导致 PHP 抛出 Fatal error 异常,PHP 程序随之终止。


Fatal error: Cannot use temporary expression in write context in C:\test.php on line 7
PHP Fatal error:  Cannot use temporary expression in write context in C:\test.php on line 7

版本限制

PHP 在 5.6 开始支持常量数组,此版本以前的 PHP 仅支持 Scalar Values(int、 float、string、boolean 或 null) 作为常量值,若将数组作为常量的值,则 PHP 将抛出 Fatal error 异常。对此,请参考如下示例:

<?phpconst ARR = [12, 3, 4];var_dump(ARR);

执行效果

尝试在 PHP5.5.0 版本中执行上述代码将产生如下结果:


Fatal error: Arrays are not allowed as constants in C:\test.php on line 4
PHP Fatal error:  Arrays are not allowed as constants in C:\test.php on line 4

const

在 PHP 中,const 是用于定义类常量的 关键字。自 PHP5.6 开始,const 开始支持定义值为数组的常量,即数组常量。

define()

构造

const 的功能类似,define() 也是 PHP 中用于定义常量的函数。define() 函数 在 PHP7.0.0 版本开始支持定义值为数组的常量。

define(string $constant_name, mixed $value, bool $case_insensitive = false): bool

其中:

项目描述
$constant_name该参数的值需为一个 字符串,用于指示 常量的名称
$valuse用于指定常量的值,自 PHP7.0.0 开始,该参数在支持 Scalar Values(int、 float、string、boolean 或 null)的基础上,开始支持数组作为此参数的值。
$case_insensitive默认值为 false,若该值为 true,则该函数将创建对 变量名大小写不敏感的常量

大小写不敏感的常量

const 相比,define() 比较特殊的是该函数能够创建 大小写不敏感 的常量。对此,请参考如下示例:

<?phpdefine('ARR', array('One' => 'Hello', 'Two' => ' ', 'Three' => 'World', ), true);
define('arr', array(1, 2, 3));var_dump(ARR);
var_dump(ARR == arr);
var_dump(ARr == aRr);

执行效果

由于将 $case_insensitive 参数的值设置为 true,故创建了一个对变量名称大小写不敏感的常量数组。也正因此,名为 ARRarrARraRr 的几个数组常量被认为是相等的(PHP 中,数组的比较不是引用的比较)。

PHP Notice:  Constant arr already defined in C:\test.php on line 5Notice: Constant arr already defined in C:\test.php on line 5
array(3) {["One"]=>string(5) "Hello"["Two"]=>string(1) " "["Three"]=>string(5) "World"
}
bool(true)
bool(true)

$case_insensitive 参数

PHP7.3

在 PHP7.3 版本中,define() 函数 中的 $case_insensitive 参数不再被支持设置为 true。您在这些版本中使用 $case_insensitive = true 仍然能够创建对大小写不敏感的常量,只是 PHP 将为此抛出 Deprecated 异常,但程序并不为此立即停止。对此,请参考如下示例:

<?phpdefine('ARR', array('One' => 'Hello', 'Two' => ' ', 'Three' => 'World', ), true);var_dump(ARR);

执行效果

PHP7.4.9 中执行上述代码将得到如下结果:

PHP Deprecated:  define(): Declaration of case-insensitive constants is deprecated in C:\test.php on line 4Deprecated: define(): Declaration of case-insensitive constants is deprecated in C:\test.php on line 4
array(3) {["One"]=>string(5) "Hello"["Two"]=>string(1) " "["Three"]=>string(5) "World"
}
PHP8

PHP8 中,$case_insensitive 参数被 正式废除,为了 向前兼容,您仍然能够使用 $case_sensitive = true,只是该值将被忽略,false 为该参数的 实际参数值,且 PHP 将为此抛出 Warning 异常。对此,请参考如下示例:

<?phpdefine('ARR', array('One' => 'Hello', 'Two' => ' ', 'Three' => 'World', ), true);var_dump(ARR);
var_dump(arr);

执行效果

尝试在 PHP8.0.0 版本中执行上述代码,得到结果如下:

PHP Warning:  define(): Argument #3 ($case_insensitive) is ignored since declaration of case-insensitive constants is no longer supported in C:\test.php on line 4
PHP Fatal error:  Uncaught Error: Undefined constant "arr" in C:\test.php:7
Stack trace:
#0 {main}thrown in C:\test.php on line 7Warning: define(): Argument #3 ($case_insensitive) is ignored since declaration of case-insensitive constants is no longer supported in C:\test.php on line 4
array(3) {["One"]=>string(5) "Hello"["Two"]=>string(1) " "["Three"]=>string(5) "World"
}Fatal error: Uncaught Error: Undefined constant "arr" in C:\test.php:7
Stack trace:
#0 {main}thrown in C:\test.php on line 7

由于使用了 $case_sensitive = true ,导致 PHP 产生 Warning 异常。我们假定 $case_sensitive = true 会起作用,但 PHP 为此产生了 Fatal error 异常,导致程序立即终止。
上述示例代码若在 PHP7.3PHP8(不含此版本) 之间的 PHP 版本中运行,将仅产生 Warning 异常,程序将继续正常执行。

若 define() 在不支持常量数组的版本中运行

define() 函数在 不支持常量数组的 PHP 版本 中运行,在你使用常量数组时,PHP 将 否认数组为该常量的值并假设常量名的字符串形式为该常量的值。对此,请参考如下示例:

<?phpdefine('I_AM_A_CONSTANT', [1, 2, 3, 4]);var_dump(I_AM_A_CONSTANT);

执行效果

Warning: Constants may only evaluate to scalar values in C:\test.php on line 4Notice: Use of undefined constant I_AM_A_CONSTANT - assumed 'I_AM_A_CONSTANT' in C:\test.php on line 6
string(15) "I_AM_A_CONSTANT"
PHP Warning:  Constants may only evaluate to scalar values in C:\test.php on line 4
PHP Notice:  Use of undefined constant I_AM_A_CONSTANT - assumed 'I_AM_A_CONSTANT' in C:\test.php on line 6

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

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

相关文章

VS2022创建控制台应用程序后没有Main了,如何显示Main?

文章目录 问题描述原因解决方案简单的顶级语句试用计算器 其他文章 问题描述 用VS2022创建一个控制台应用后&#xff0c;没有名称空间和Main函数了&#xff0c;只有一个WriteLine&#xff0c;如下所示。 // See https://aka.ms/new-console-template for more information Co…

使用cpolar端口映射的方法轻松实现在Linux环境下SVN服务器的搭建与公网访问

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

家居服务小程序发展指南

随着互联网的快速发展&#xff0c;越来越多的企业开始关注并投资于线上平台的建设&#xff0c;以满足用户的多样化需求。家居服务行业也不例外&#xff0c;通过打造小程序平台&#xff0c;可以更好地服务用户&#xff0c;提供更便捷的家居服务体验。 首先&#xff0c;我们可以选…

部署和使用dinky问题总结

flink1.16 dinky&#xff08;dlink&#xff09;0.7.4 官方部署文档&#xff1a;http://www.dlink.top/docs/0.7/deploy_guide/build/ github部署文档&#xff1a;https://github.com/DataLinkDC/dinky/blob/v0.7.4/docs/docs/deploy_guide/deploy.md github issues&#xff1a;…

基于SpringBoot+Bootstrap的旅游管理系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 登录模块的实现 景点信息管理界面 订票信息管理界面 用户评价管理界面 用户管理界面 景点资讯界面 系统主界面 用户注册界面 景点信息详情界面 订票信息界面 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言…

【pytest】 allure 生成报告

1. 下载地址 官方文档; Allure Framework 参考文档&#xff1a; 最全的PytestAllure使用教程&#xff0c;建议收藏 - 知乎 https://github.com/allure-framework 1.2安装Python依赖 windows&#xff1a;pip install allure-pytest 2. 脚本 用例 import pytest class …

Socks5代理、IP代理与其在爬虫开发中的应用

在当今数字化时代&#xff0c;网络安全和数据获取变得愈发重要。代理服务器作为一种关键的技术手段&#xff0c;为网络工程师和爬虫开发人员提供了有力的工具。本文将深入探讨Socks5代理、IP代理以及它们在网络安全和爬虫应用中的角色与意义。 1. 代理服务器简介 代理服务器是…

PHP开发框架及特点

PHP有许多开发框架&#xff0c;每个框架都有其独特的特点和用途。以下是一些常见的PHP开发框架以及它们的特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.Laravel Laravel是一个流行的PHP框架…

XML文件反序列化读取

原始XML文件 <?xml version"1.0" encoding"utf-8" ?> <School headmaster"王校长"><Grade grade"12" teacher"张老师"><Student name"小米" age"18"/><Student name&quo…

【Spatial-Temporal Action Localization(六)】论文阅读2021年

文章目录 1. MultiSports: A Multi-Person Video Dataset of Spatio-Temporally Localized Sports Actions摘要和结论引言&#xff1a;针对痛点和贡献数据特点 2. Actor-Context-Actor Relation Network for Spatio-Temporal Action Localization摘要和结论引言&#xff1a;针对…

视频监控平台客户端开发记录

效果图 所用到的核心技术 QT信号槽机制;布局器;QStylesheet;QStackedWidget;QTreeView;QTableView;QNetworkAccessManager;Tr();QT信号槽机制 信号槽机制是QT的精华,主要解决UI界面中事件与事件响应的关联关系。QT将界面的操作(如点击按钮、拖动窗口等)定义为信号,…

语音助手开发小记(2023.9.25)

通道问题 在使用函数swr_alloc_set_opts给SwrContext传递输入输出的音频参数时&#xff0c;需要设置通道&#xff0c;这里通道为2&#xff0c;但是通道布局不能传递2.比如AV_CH_LAYOUT_STEREO 实际值为3 如果要计算通道布局的通道数使用函数av_get_channel_layout_nb_channels…

如何管理好公司的公海客户呢?

销售周期比较长&#xff0c;线索处理比较繁琐&#xff0c;想知道用哪些系统可解决这一问题&#xff1f; 很简单&#xff0c;针对客户管理繁杂&#xff0c;线索复杂的问题&#xff0c;crm系统中的公海池就可以轻松解决。 接下来我将以简道云为例为大家进行详细的公海池介绍 ht…

深度学习-Python调用ONNX模型

目录 ONNX模型使用流程 获取ONNX模型方法 使用ONNX模型 手动编写ONNX模型 Python调用ONNX模型 常见错误 错误raise ValueError...&#xff1a; 错误&#xff1a;Load model model.onnx failed 错误&#xff1a;CUDAExecutionProvider is not in available provider 错…

TouchGFX界面开发 | 项目代码结构分析

项目代码结构分析 本文介绍TouchGFX项目中TouchGFX Designer自动生成的代码&#xff0c;以及需要用户编写的扩展代码。 一、生成的代码和用户代码 TouchGFX Designer生成的代码将与用户编写的代码完全分离。 事实上&#xff0c;自动生成的代码位于generated/gui_generated文…

美国零售电商平台Target,值得入驻吗?如何入驻?

Target 是美国最大的零售商之一&#xff0c;在品牌出海为大势所趋的背景下&#xff0c;它在北美电商中的地位节节攀升。Target 商店在众多垂直领域提供各种价格实惠的自有品牌&#xff0c;吸引越来越多的跨境商家入驻&#xff0c;如美妆、家居、鞋服、日用百货等&#xff0c;随…

【kubernetes】使用virtual-kubelet扩展k8s

1 何为virtual-kubelet&#xff1f; kubelet是k8s的agent&#xff0c;负责监听Pod的调度情况&#xff0c;并运行Pod。而virtual-kubelet不是真实跑在宿主机上的&#xff0c;而是一个可以跑在任何地方的进程&#xff0c;该进程向k8s伪装成一个真实的Node&#xff0c;但是实际的…

QT运行错误设置弹窗提示

在Qt中,您可以使用QMessageBox类来弹出警告信息框。QMessageBox类提供了多种类型的弹出框,包括警告框、信息框、询问框等。以下是一个简单的示例,演示如何弹出一个警告信息框: #include <QApplication> #include <QMessageBox>int main(int argc, char *argv[…

Goby 漏洞发布|Cockpit 平台 upload 文件上传漏洞(CVE-2023-1313)

漏洞名称&#xff1a;Cockpit 平台 upload 文件上传漏洞&#xff08;CVE-2023-1313&#xff09; English Name&#xff1a; Cockpit File Upload Vulnerability(CVE-2023-1313) CVSS core:7.2 影响资产数&#xff1a;3185 漏洞描述&#xff1a; Cockpit 是一个自托管、灵活…

MATLAB m文件格式化

记录一个网上查到的目前感觉挺好用的格式化方法。 原链接&#xff1a; https://cloud.tencent.com/developer/article/2058259 压缩包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1ZpQ9qGLY7sjcvxzjMPAitw?pwd6666 提取码&#xff1a;6666 下载压缩包&#xf…