PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)_php技巧

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

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

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

让我们一起分析一下吧。

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

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

<?php
 define('C', 12345);
 define('C', 123);
?>

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

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

<?php
 define('C', 12345);
 // 错误方法1,经常犯
 if (isset(C)){……}
 // 错误方法2,经常犯
 if (defined(C)){……}
 // 正确方法
 if (defined('C')){……}
?>

3. 执行效率低

<?php
  define('FORUM_THEME',$forum['theme']);
  $this->display('/'.FORUM_THEME.'@Public:login');
  // 系统会从整个执行流程中查找FORUM_THEME
?>

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

总结: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常量
谨慎注意义务、字符常量占几个字节、面试技巧和注意事项、投标注意事项及技巧、招聘技巧和注意事项,以便于您获取更多的相关知识。

时间: 2024-09-29 17:24:40

PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)_php技巧的相关文章

c++-为什么网上的“常量指针”和《C++ Primer》中的“常量指针”是相反的?应该以哪个为准?

问题描述 为什么网上的"常量指针"和<C++ Primer>中的"常量指针"是相反的?应该以哪个为准? <C++ Primer>第五版,中文版.56 页. <C++ Primer>里好像没有"指针常量",只有"指向常量的指针". 解决方案 c++primer 第五版 指向常量的指针和常量指针C++之 常量指针C++中的常量指针 解决方案二: 一) 常量指针. 常量是形容词,指针是名词,以指针

Java中的常量:如何避免反模式

在应用中,我们往往需要一个常量文件,用于存储被多个地方引用的共享常量.在设计应用时,我也遇到了类似的情况,很多地方都需要各种各样的常量. 我确定需要一个单独的文件来存储这些静态公共常量.但是我不是特别确定是应该用接口还是类(枚举不满足我的需求).我有两种选择: 使用接口,如: package one; public interface Constants { String NAME="name1"; int MAX_VAL=25; } 或 package two; public cla

PHP中的常量

  PHP预先定义了几个常量,并提供了一种机制在运行时自己定义.常量和变量基本上是一样的,不同的是:常量必须用DEFINE函数定义,常量一旦定义好,就不能被重新定义了. PHP中预先定义好的常量: __FILE__ 这个默认常量是 PHP 程序文件名.若引用文件 (include 或 require)则在引用文件内的该常量为引用文件名,而不是引用它的文件名. __LINE__ 这个默认常量是 PHP 程序行数.若引用文件 (include 或 require)则在引用文件内的该常量为引用文件的行

C/C++中字符串常量的不相等性及字符串的Copy

#include <iostream> void main(void){ if("test"=="test") { cout<<"相等"; } else { cout<<"不相等"; }} 上面的代码我们测试两个内容为test的字符串常量是否相等,按照常理,应该是相等的,这些在一些过程式语言中会得到相等的结论,但在c/c++却不是这样. 为什么呢? 答案在这里:因为字符串常量存储在计算机内存

探讨PHP中OO之静态关键字以及类常量的详解_php技巧

闲着没事随便找了点PHP的关于OO的点资料看看,访问控制修饰符,self,parent,const,static几个关键字,箭头操作符(书上也这么叫..即"->"),范围解析操作符(即双冒号"::"),不过觉得这个跟C#语言里的OO很多是一样的,很容易理解不过还是看看理清PHP里的OO思路还是应该的吧.--------------------------------------------------------------------------------

java-Java中静态常量可以被覆写吗?

问题描述 Java中静态常量可以被覆写吗? Java中静态常量可以被覆写吗?在一个类中定义一个静态常量,它的子类类中定义一个同名的静态常量,这样可以吗? 解决方案 子类可以定义与父类同名的静态常量的,但是各是各的,没有关联的. 解决方案二: 你说的复写是什么意思.首先,静态成员根本就没有继承的概念,所以不存在复写(override) 解决方案三: 因为静态成员通过类名访问,你不能通过派生类得到基类定义的静态成员,反之也是,所以根本不存在什么复写不复写.用什么类名访问的就是什么. 解决方案四: 如

GO语言中的常量_Golang

常量是程序中最基础的元素,在定义之后就不能再重新赋值了.Go语言中的常量类型有布尔常量.整数常量.浮点数常量. 字符常量.字符串常量和复数常量 . 布尔常量 复制代码 代码如下: const x = true fmt.Print(x) //输出true 整数常量 复制代码 代码如下: const x = 20 fmt.Print(x) //输出20 浮点数常量 复制代码 代码如下: constx = 0.618 fmt.Print(x) //输出%f0.618 字符常量 复制代码 代码如下: c

PHP 面向对象 PHP5 中的常量_php基础

在PHP5中 const定义的常量与定义变量的方法不同,不需要加 $ 修饰符.const PI = 3.14; 这样就可以. 而使用const 定义的常量名称一般都大写,这是一个约定,在任何语言中都是这样. 如果定义的常量由多个单词组成,使用 _ 连接,这也是约定. 比如, MAX_MUMBER 这样的命名方式.一个良好的命名方式,是程序员必须注意的. 类中的常量使用起来类似静态变量,不同点只是它的值不能被改变.我们使用 类名::常量名 来调用这个常量. 复制代码 代码如下: <?//声明一个f

剖析C++中的常量表达式与省略号的相关作用_C 语言

C++ 常量表达式常量值是指不会更改的值.C + + 提供了两个关键字,它们使你能够表达不打算修改对象的意图,还可让你实现该意图. C++ 需要常量表达式(计算结果为常量的表达式)以便声明: 数组边界 case 语句中的选择器 位域长度规范 枚举初始值设定项 常量表达式中合法的唯一操作数是: 文本 枚举常量 声明为使用常量表达式初始化的常量的值 sizeof 表达式 必须将非整型常量(显式或隐式)转换为常量表达式中合法的整型.因此,以下代码是合法的: const double Size = 11