PHP基础知识点【四】常量

           常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量)。常量默认为大小写敏感。传统上常量标识符总是大写的。

           我们通常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,常量名和其它任何 PHP 标签遵循同样的命名规则。合法的常量名以字母或下划线开始,后面跟着任何字母,数字或下划线。常量可以在脚本中使用。

【1】define函数定义常量

在PHP5.3.0之前的版本中,常量只能用 define() 函数定义。之后可以用const关键字

判断常量是否定义用defined()函数。

  • 函数用法
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
   参数:
	name 必选参数,常量名称,通常大写
        value必选参数,常量的值,通常标量类型(bool,int,float,string,null)
        case_insensitive 小大写不敏感,默认是false。如果设置成true则不敏感
   返回值:
        成功返回true,失败返回false。
bool defined (string $name)
    参数:name常量的名字
    返回:定义返回true,未定义返回false
  • 举个例子
//合法命名
define('ABC','123');
define('O2O','o2o');
define('_A_','100');
//非法命名
define('1A','1');
//避免以左右两个下划线定义,防止冲突魔术常量
define('__FOO__','function');

// 区分大小写的常量名
define("NAME", "My name is tacks!");
echo NAME;    // My name is tacks!
echo Name;   //  未定义报错notice

// 不区分大小写的常量名
define("AGE", "20",true);
echo AGE;    // 20
echo Age;   // 20

//默认全局范围有效
function getName(){
    echo NAME;
}
getName();//My name is tacks!
  •       如果使用用了一个未定义的常量,如下代码。那么它首先会去判断是否定义bar常量,但是没有定义,报notice错误,但是仍然可以输出,这是因为php自动将裸字符串(没有引号的字符而且不对应任何已知符号)转化一个起值为裸字符串的正常字符串。所以如果没有定义bar,php会自动代替为'bar'。

  •       注意:如果使用一个没有声明的常量,则常量名称会被解析一个普通的字符串,但是会比直接使用该字符串慢近8倍左右,所以在声明字符串的时候一定要加上但单引号或者双引号。

//例1
$foo[bar] = 'tacks';
e//ho $foo[bar];//报notice  输出tacks
//例2
echo A;//报notice  输出A
  • 那么我们来使用一下defined()函数来判断一下
if(defined('TEST')){
    echo TEST;//如果定义则输出
}
  • define函数定义的时候,可以有表达式
define('BBB',1+2);
echo BBB;//3

for($i=0;$i<5;$i++){
    define('A_'.$i,$i*2);//常量的名是动态的,常量的值也是动态的
}
echo A_4;//8

【2】const关键字

      PHP 5.3.0 后支持const关键字,或者说是语言结构。使用 const 关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。这就意味着不能在函数内,循环内以及 if 语句之内用 const 来定义常量。可以在类内和类外定义常量。一般来说const在类内定义常量,define在类外定义常量。

const PLACE = 'China';
echo PLACE;//China  类外定义常量
//if(1){ const A = 1;}#不能再if 语句 循环 函数 中定义
class Person{
    const PLACE = 'earth'; //定义类常量
    function show(){
        echo self::PLACE;
    }
}
echo Person::PLACE;
 
// 自 5.3.0 起
$classname = "Person";
echo $classname::PLACE; //earth  静态获取

// 自 PHP 5.3.0 起
$class = new Person();
$class->show();//earth      通过实例化对象访问方法
echo $class::PLACE; //earth 对象获取类常量

简单说一下const和define的区别:

  • const是一个语言结构 ,define是一个函数,还有第三个参数是否区分大小写;

  • const可以在类中定义,用于类成员常量定义。define不能再类中使用。用与全局变量;

  • const在编译时定义,因此必须处于最顶端的作用域。不能再函数,判断,循环中使用;

  • const只能用确切的常量名,静态常量。define可以有表达式;

【3】constant函数与get_defined_constants函数

  constant — 返回一个常量的值

 get_defined_constants用来返回所有定义的常量名和值,这个包含php代码创建的,也包括扩展所创建的。

  • 函数用法:
constant ( string $name ) : mixed
    当你不知道常量名,却需要获取常量的值时,constant() 就很有用了。也就是常量名储存在一个变量里,或者由函数返回常量名。
get_defined_constants ([ bool $categorize = false ] ) : array
    返回值:categorize=true的时候是返回多维数组
  • 举个例子:
define('AAA','123');
$name = 'AAA';//常量名是动态的
echo constant('AAA');//123   获取常量AAA的值
echo constant($name);//123   相当于动态常量也可以获取的常量AAA的值


define("MAXSIZE", 100);
define("MINSIZE", 0);
var_dump(get_defined_constants(true));//获取多维数组,可以看一下自己定义的常量在最后面user里
/*
...
  'user' => 
    array (size=3)
      'AAA' => string '123' (length=3)
      'MAXSIZE' => int 100
      'MINSIZE' => int 0
*/

【4】魔术常量

      PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。

      预定义常量也叫做魔术常量。有八个魔术常量它们的值随着它们在代码中的位置改变而改变。要好好记下这些个特殊的常量

魔术常量说明
__LINE__文件中的当前行号
__FILE__文件的完整路径和文件名
__DIR__文件所在的目录,等同于dirname(__FILE__)
__FUNCTION__函数被定义时名称
__CLASS__类的名称
__TRAIT__trait的名字
__METHOD__类的方法名
__NAMESPACE__当前命名空间的名称
var_dump(__LINE__);
var_dump(__FILE__);
var_dump(__DIR__);
function foo(){
    var_dump(__FUNCTION__);
}
class Common{
    function get(){
        var_dump(__CLASS__);
        var_dump(__METHOD__);
    }
}
$obj = new Common;
$obj->get();

【5】系统预定义常量

      PHP中,除了自己可以定义常量,还预定义了一些系统常量,可以在程序中直接使用来完成一些特殊的功能。不过很多常量是通过扩展库来定义的,只有在加载了这些扩展库时才会出现,或者在动态加载后,或者在编译PHP时已经包括进去了。下面来看一下常见的预定义常量。

var_dump(PHP_OS);//string 'WINNT' (length=5)  操作系统
var_dump(PHP_VERSION);//string '5.5.12' (length=6) PHP版本
var_dump(DIRECTORY_SEPARATOR);//string '\' (length=1) 系统目录分割符
var_dump(E_ERROR);//int 1  错误,导致php脚本运行终止
var_dump(E_WARNING);//int 2警告,不会导致php脚本运行终止
var_dump(E_PARSE);//int 4  解析错误,有程序计解释器报错
var_dump(E_NOTICE);//int 8 非关键报错,提示
var_dump(M_PI);//float 3.1415926535898 数学中的Π

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值