为什么要谨慎使用PHP中的常量?

Zend Framework文档中写道:常量包含数字字母字符和下划线,数字允许作为常量名。 常量名的所有字母必须大写。类常量必须通过 "const" 定义为类的成员,强烈不鼓励使用 "define" 定义的全局常量。

作为PHP的官方框架,为什么会有这样的要求?

让我们一起分析一下吧。

1. define容易产生意想不到的错误

PHP常量是定义后就不能修改和再次赋值。但是如果再次赋值会怎么样?

define('C', 12345);

define('C', 123);

?>

这段代码会报个notice错误。带来的后果是:在你定义之前,其它人要是定义了同名的常量,你可能真的不知道里面究竟是什么值。

2. 如何判断PHP常量是否被定义?判断方法易写错

define('C', 12345);

// 错误方法1,经常犯

if (isset(C)){……}

// 错误方法2,经常犯

if (defined(C)){……}

// 正确方法

if (defined('C')){……}

?>

3. 执行效率低

define('FORUM_THEME',$forum['theme']);

$this->display('/'.FORUM_THEME.'@Public:login');

// 系统会从整个执行流程中查找FORUM_THEME

?>

因为php处理常量的时候要进行多次查找,所以效率低。

总结:PHP常量的问题,在于PHP处理常量的方法过于宽松导致的,如果能够严格一些,就会避免很多的问题。在实际过程,能用变量就不要用常量,因为变量的效率高使用更加方便。

因此若非要使用常量或者类变量,可使用以下方法:

class foo {

const WEBSITE = "www.zhuyinghao.com";

protected $_forum_theme;

function name()

{

echo WEBSITE;

$this->_forum_theme = $forum['theme'];

}

function displace()

{

echo $this->_forum_theme;

}

}

?>

类名和函数名相同时的作用

在PHP 4中,类的构造函数需要和类名相同,子类的构造函数名与子类名相同,在子类里父类的构造函数不会自动执行。要在子类里执行父类的构造函数,必须执行类似以下语句:

$this->[父类的构造函数名()]

在 PHP 5.0 以上版本里,统一使用construct()作为构造函数,但仍兼容了 4.0 版本的构造函数的定义规则。如果同时定义了4.0的构造函数和 construct()函数,则construct() 函数优先。

用PHP EOL来替换/r/n进行换行

写程序时会经常用到换行,用PHP内置常量PHP_EOL来进行换行。

一个小小的换行,在不同的平台有着不同的实现。在unix世界换行就用\n来代替,但是windows为了体现他的不同,就用\r\n,更有意思的是在mac中用\r。因此unix系列用 \n,windows系列用 \r\n,mac用 \r。

因此系统会根据平台系统的不同,转换成不同的换行。如果要在浏览器中换行,就要使用PHP_EOL变量进行换行

php内部常量_PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)相关推荐

  1. php中预定义常量的,php预定义常量_PHP教程

    php预定义常量_PHP教程 这些常量在 PHP 的内核中定义.它包含 PHP.Zend 引擎和 SAPI 模块. PHP_VERSION (string) PHP_OS (string) PHP_E ...

  2. php如何定义和使用常量,PHP中如何定义和使用常量_PHP教程

    1.自定义常量 * 必须用函数define()定义 * 定义完后其值不能再改变了 * 使用时直接用常量名,不能像变量一样在前面加$s 例如:define("PI",3.14);定义 ...

  3. c语言中 字符串常量的界定符,C字符串操作函数

    1.7. 分割字符串 很多文件格式或协议格式中会规定一些分隔符或者叫界定符(Delimiter),例如/etc/passwd文件中保存着系统的帐号信息:$ cat /etc/passwd root:x ...

  4. java 定义一组常量用什么最好_Java语言中定义常量注意事项解析

    一.常量定义的基本注意事项. 在Java语言中,主要是利用final关键字(在Java类中灵活使用Static关键字)来定义常量.当常量被设定后,一般情况下就不允许再进行更改.如可以利用如下的形式来定 ...

  5. 11.JDK8内存模型、本地方法栈、虚拟机栈、栈帧结构(局部变量表、操作数栈、方法出口、虚拟机栈与本地方法栈的关系、寄存器、方法区、堆(Heap)、jvm中的常量池、Metaspace(元空间))

    11.JDK8内存模型 11.1.本地方法栈(Native Method Stacks) 11.2.虚拟机栈(Java Virtual Machine Stacks) 11.3.栈帧结构 11.3.1 ...

  6. python的常量和变量_python中的常量和变量代码详解

    局部和全局变量: # name='lhf' # def change_name(): # # global name # name='帅了一比' # print('change_name',name) ...

  7. JavaScript中的常量:什么时候使用它,有必要吗?

    本文翻译自:Const in JavaScript: when to use it and is it necessary? I've recently come across the const k ...

  8. Objective-C中的常量

    我正在开发一个Cocoa应用程序,并且我使用常量NSString作为存储我的首选项的键名的方法. 我知道这是一个好主意,因为它可以在必要时轻松更改密钥. 此外,它是整个'将您的数据与逻辑分离'的概念. ...

  9. 好好说说Java中的常量池之Class常量池

    前言 在Java中,常量池的概念想必很多人都听说过.这也是面试中比较常考的题目之一.在Java有关的面试题中,一般习惯通过String的有关问题来考察面试者对于常量池的知识的理解,几道简单的Strin ...

最新文章

  1. Windows server 2008普通用户不能远程登录问题
  2. VB无所不能之五:建立“标准”DLL动态链接库文件(1)
  3. 怎么写显示商品图片_shopee商品描述怎么写,shopee商品排名靠前的是
  4. 公益性岗位计算机考试内容,公益性岗位公共基础知识:计算机概述-计算机硬件系统(1)...
  5. 2.数据湖DeltaLake之DDL操作
  6. 批处理中for的参数的用法
  7. android单片机wifi通信原理,基于单片机计算机之间无线通信实现.doc
  8. 如何在MySQL中缩小/清除ibdata1文件
  9. axure下载及汉化
  10. linux运行asm文件,linux – 尝试在Ubuntu上的NASM上运行.asm文件时出错
  11. 软件工程~数据字典例子解释
  12. 表格用计算机做成横版的WPS,WPS表格怎么将表格横过来图文教程
  13. XJOI1131换零钱
  14. 成功架构设计的关键要素
  15. 干货 | 携程平台化常态化数据治理之路
  16. WinForm自定义分页控件实现Datagridview分页效果附引用Demo
  17. Android学习笔记:实现app启动界面跳过倒计时功能
  18. 计算机如何连接iphone,iphone怎么连接到电脑的方法详解【图文】
  19. 浅析中国汽车融资租赁行业
  20. 【计算机毕业设计】029网上购物商城系统

热门文章

  1. python开发web运维工具_Python web 开发工具箱
  2. 3.3.1网络原理数据链路层之差错控制(检错编码和纠错编码)-(奇偶校验码、CRC循环冗余码、海明码)
  3. 2.2.3 C语言中的整数类型及类型转换(为什么强制类型转换值发生改变?带你从机器码的角度分析)
  4. java 同步块 抛出异常_java问题合集(一)
  5. 概要设计说明书案例_逆向前行,趁势而为外贸学院线上教学优秀案例展(七)...
  6. 酷狗音乐怎样复制歌词到计算机,酷狗怎么复制歌词和歌曲到mp3上
  7. Linux进程间通信——使用共享内存
  8. C/Cpp / C++ 构造函数和析构函数可以是虚函数吗
  9. 对uC/OS-II内二维指针的研究
  10. KEIL、uVision 和 MDK 区别和联系