Go to comments

PHP 变量

一、变量概念

1、变量名、变量的值、存储地址,这三个概念之间的关系

声明一个变量$a并赋值23的时候发生了什么?

1. 首先在内存的变量表里面有了一个$a

2. 然后开辟一块内存空间,该空间的值是23,变量名$a指向23所在的地址(空间) 

$a = 23;


打印变量$a的时候发生了什么?

1. 首先从变量表里找到$a

2. 再根据$a的地址,找到其空间

3. 然后从其地址读出 23

$a = 23;

echo $a; // 23


这三个概念

变量名是 => $a

变量值是 => 23

存储地址是 => 存储23的内存


声明变量$a,内存里面仅仅存的是一个名字,想存$a的值等于23,会另外开辟一个块内存空间,让$a的地址指向23的空间,变量名、变量值这两者要区分清楚。


明白了变量的基本概念

$b = 23; // $b是钥匙,房间里面的内容的是他的值

echo $b; // 打印,根据钥匙 -> 找到房间 -> 然后读取房间内容23


重新赋值

$b = 23;

echo $b;

$b = 45; // 重新赋值的过程:先根据$b找到其房间,然后把里面的值换成45

echo $b; // 45


二、变量名命名规则与大小写

PHP变量怎么声明?

1. PHP中变量用  $ + 变量名  来声明

2. PHP变量名命名规范,用  [0-9][A-Z][_]  任意组合,但是变量名的第一个字符不能[0-9],既不能以数字开头


以$符号开头,变量名以字母、下滑线、数字的组合,并且数字不能作为开头,下面的变量声明都是合法的

$_ = 1;

$_price = 2;

$name1 = '张三';

$name2 = '李四';

echo $_price,$_,$name1,$name2; // 21张三李四


*号开头的变量名是不和法的

$*abc = 123;


PHP变量名是区分大小写的, $A  和  $a  是两个不同的变量

$a = 'Glee';

$A = 'LiLi';

echo $a,'" "',$A; // Glee" "LiLi


总结

1. 用 $ 开头

2. 用字母下划线数组组合,并且数字不能开头

3. PHP变量名是区分大小写的


在PHP5以及PHP6中变量命名更加宽泛,甚至可以用中文来做变量名,但是严重不推荐,这种写法耗资源也不够规范

$姓名 = '居然可以';

echo $姓名; // 居然可以


三、变量类型

PHP中有八种变量类型(后3种单独来学,今天只了解前5种)

1. 整型(100, 2, 456)

2. 浮点型(45.20)

3. 字符串('hello world')

4. 布尔型(true/false)

5. NULL型(null)

6. 数组(array)

7. 对象(object)

8. 资源型(resource)


1、整型

整形对应的是数学中的整数,

比如 1,0,2,-3,99... (整数是无穷的)可以是0也可以是负数 -1,-2,-3 …


年龄(age)一般都是算整数

$age = 28;

echo $age,'<br/>'; // 28

$age = 99;

echo $age,'<br/>'; // 99


下面看两个坑

1. 第一个坑

整数028

PHP5 输出的是2

PHP7 输出的是报错信息 Parse error: Invalid numeric literal

$age = 028;

echo $age; // 为什么028输出是2?记住这个坑


2. 第二个

为什么整数 027 打印出的是23 ?

因为027是用八进制来表示的,八进制的27就是十进制的23,记住这个坑

$age = 027;

echo $age; // 23


2、浮点型

浮点型对应数学中的小数,比如 0.23,87.53,62.4

$float = 0.23;

echo $float,'<br/>'; // 0.23

$float = 85; // 修改值为85,浮动型突然变成了整形

/**
 * 可不可以把上面的浮点类型的值,修改为整数类型?
 * 在php中可以任意的修改变量的 值 与 类型
 * C语言中声明变量是int整形就只能是存整形,存浮点型就不允许(c语言中在下一行代码是不允许的改类型的)
 */

echo $float,'<br/>'; // 85


浮动类型的小测试,

在数学上  0.3 - 0.2 = 0.1 是正确的,运行结果是 "0.3 - 0.2 不等于0.1"

if((0.3 - 0.2) == 0.1){
  echo '0.3 - 0.2 等于0.1','<br/>';
}else{
  echo '0.3 - 0.2 不等于0.1','<br/>'; // "0.3 - 0.2 不等于0.1"
}


为什么运行结果 0.3 - 0.2 不等于0.1 ?

先把数据类型看完,这也是一个坑


改成全等于 === 也是一样的结果, 因为 0.3 - 0.2  的返回值就是浮动型,0.1是浮动型,都是浮动型,类型是相等的

if((0.3 - 0.2) === 0.1){
  echo '0.3 - 0.2 等于0.1','<br/>';
}else{
  echo '0.3 - 0.2 不等于0.1','<br/>'; // "0.3 - 0.2 不等于0.1"
}

为什么输出 0.3 - 0.2 不等于0.1 ?因为浮点型是约数不够准确


3、字符串型

怎么定义字符串呢?

用单引号或双引号包起来

$msg = 'wait for you!';
echo $msg,'<br/>'; // wait for you!

$msg = "wait for me!";
echo $msg,'<br/>'; // wait for you!

双引号、单引号有什么区别呢?在后面专门的章"字符串与数组"部分会学到


4、布尔型

布尔型(Boolean)只有两个值,要么是真、要么是假

$isMan = true;

$isWoman = false;

echo $isMan,$isWoman; // 1

$isWan 打印出来一个"1",

$isWoman 没打印出来,这个牵扯到变量类型的转换


为什么$isWan打印不出true?

因为true是逻辑上的东西,而我看到的true是字符串,

echo布尔型的时候,布尔型被转成了字符串,true被转换成字符串"1",false转换成空字符串  '' ,echo一个空字符串当然看不见了(手册:语言参考 - 类型- 布尔类型)


布尔值只有这两种情况,但布尔值的运算很重要,比如:逻辑与、逻辑或、逻辑反(求反)、异或(在后面运算符中详解)


希望查看完整的布尔型

可以用  var_dump()  函数,还可以用  print_r()  来打印,

$isMan = true;
$isWoman = false;

var_dump($isMan); // bool(true) 

var_dump($isWoman); // bool(false)

用var_dump函数打印的时候,显示bool(true)或bool(false),意思是类型是bool值是false


用print_r的时候依然只看到了 "1",空字符依然没有显示出来

$isMan = true;
$isWoman = false;

 
print_r($isMan); // 1

print_r($isWoman); // 空字符串


下面三个输出打印函数的区别?(面试时候可能会问到这个问题)

echo   就是用来输出变量,适合输出整形,浮点型,字符串型这种标量类型

print_r   适合对象、数组这种二维或多维结构的数据

var_dump   比较厉害,不仅可以打出数据本身,还可以打印出数据类型,比如打印1不仅想知道是1,还想知道是字符串"1"还是数字的1,功能比较强大,但提示的文字也比较多


5、NULL型

NULL代表空,这种类型只有一个值即 NULL 意味着空


举一个例子

我有一张银行卡,先存1000元,后又取1000元,账面还有0元,

李四没有身份证,他根本就没有银行卡,

我银行卡是0元 和 李四连银行卡都没有,是有区别的,

我的账户0是一个整形值,而李四就没有,他这种情况就没有值,这种情况是NULL


一个变量什么时候为null?

1. 给一个变量赋值为null,相当于银行账户取消了

$user = null;

var_dump($user); // NULL


2. 变量被unset掉,函数unset()是销毁一个变量

error_reporting(E_ALL & ~ E_NOTICE);

$age = 22;

unset($age);

var_dump($age); // NULL


/**
 * Notice: Undefined variable 这不是报错,Notice是注意的意思,提示变量没有赋值
 *
 * ini_set("error_reporting","E_ALL & ~E_NOTICE");
 */


3. 变量只声明不赋值

ini_set("error_reporting","E_ALL & ~E_NOTICE");

$class;

var_dump($class); // NULL

变量$class没有指向地址,自然也就没有一个值


四、动态变量

动态变量:变量名还可以是一个变量名,PHP语法非常灵活允许变量名字仍是一个变量


 $$str  怎么理解?

$str = 'hello';

$hello = 'welcome to BeiJing';

echo $str,'<br/>';   // hello

echo $hello,'<br/>'; // welcome to BeiJing

/***
 * $$str怎么理解?
 * 现在变量名都不固定了
 * 1.把"$$str"拆成两部分"$"和"$str",$后面是一个变量$str
 * 2.$str的值是hello,hello又被充当了下一个变量的名字($ + $str)
 * 3.$+hello=$hello打印结果是$hello的值welcome to BeiJing
 */
 
echo $$str; // welcome to BeiJing


用动态变量做一个小游戏,$_GET地址栏传值

$who = $_GET['who'];

$zhangSan = '张三';
$liSi = '李四';
$wangEr = '王二';

echo $$who;

/**
 * $who有可能是zhangSan、liSi、wangEr
 * 
 * index.php?who=zhangSan 打印 张三
 * index.php?who=liSi 打印 李四
 * index.php?who=wangEr 打印 王二
*/


下面使用了三个  $$$a  符号输出的是什么?

$a = 'hello';

$hello = 'world';

$world = 'china';

echo $$$a; // china

/**
 * 从右到左分析一下:
 * $a的值是hello
 * $$a等于$hello,$hello的值world
 * $$$a等于$world,最终打印的是china
*/

PHP中变量的名字,还可以是一个变量来表示


五、变量的检测

1. 变量是否声明或存在 isset

2. 变量类型 in_int, is_float, is_bool, is_null

3. 获取变量类型 gettype

 

1、isset检测变量是否声明或存在

上面学习NULL的的时候,

有些变量根本没有声明过,或者被unset销毁掉了,再去引用变量的时候会提示Notice(Notice: Undefined variable)


能不能使用这个变量之前,先判断一下这个变量有没有,如果有这个变量再进下一步操作?

可以用 isset 函数,来检验一个变量是否存在

$age = 23;

if(isset($age)){

    echo 'age变量已经声明<br/>'; // 变量已经声明

}else{

    echo '这个变量根本就不存在<br/>';

}


不声明变量$user,检验 $user 存不存在

if(isset($user)){

    echo 'user变量已经声明<br/>';

}else{

    echo '这个变量根本不存在<br/>'; // 这个变量根本不存在

}


2、判断的变量类型

不仅要判断变量是否存在,还想判断变量是什么类型的(浮点型、整型、布尔型、null型)

$a = 123;   // 整型
$b = '123'; // 字符串型
$c = 78.9;  // 浮点型
$d = null;  // NULL型
$e = true;  // 布尔型


if(is_int($a)){
    echo '$a是int型<br/>'; // $a是int型
}else{
    echo '$a不是int型';
}


if(is_string($b)){
    echo '$b是string型<br/>'; // $b是string型
}else{
    echo '$b不是string型';
}


if(is_float($c)){
    echo '$c是float型<br/>'; // $c是float型
}else{
    echo '$c不是float型'; 
}


if(is_null($d)){
    echo '$d是null型<br/>'; // $d是null型
}else{
    echo '$d不是null型';
}


if(is_bool($e)){
    echo '$e是bool型<br/>'; // $e是bool型
}else{
    echo '$e不是bool型';
}


3、gettype()方法,直接获取变量类型

$a = 123;   // 整型
$b = '123'; // 字符串型
$c = 78.9;  // 浮点型
$d = null;  // NULL型
$e = true;  // 布尔型

echo gettype($a).'(整型)<br/>';     // integer(整型)

echo gettype($b).'(字符串型)<br/>'; // string(字符串型)

echo gettype($c).'(浮点型)<br/>';   // double(浮点型)

echo gettype($d).'(NULL型)<br/>';   // NULL(NULL型)

echo gettype($e).'(布尔型)<br/>';   // boolean(布尔型)


六、变量的销毁

unset()函数把变量的钥匙给毁了,指向的房间也清除了

$age = 3;

if(isset($age)){
    echo 'age变量已设置<br/>'; // age变量已设置
}else{
    echo 'age变量未设置';
}

unset($age); // 销毁age变量 


if(isset($age)){
    echo 'age变量已设置';
}else{
    echo 'age变量未设置'; // age变量未设置
}


什么要销毁变量?

因为内存空间是有限的,销毁变量,可以腾出空间


七、变量的传值赋值和引用赋值

变量的传值方式,面试的时候经常要考,工作的时候经常要用


变量的两种传值方式

1. 传值赋值

2. 引用赋值


1、传值赋值

$liAge = 25; // 李四的年龄是25

$wangAge = $liAge; // 王五说,他的年龄等于李四的年龄,王五的年龄肯定是25


看下面

$a = 3;

$b = 5;

$a = $b; 


/**
 * 等号是赋值用的
 * $b = $a; 这发生了什么呢?
 * 
 * 1. 变量$a和变量$b,分别给他们开一块内存空间,存的值分别是3和5
 * 2. $a = $b发生的是,把$b的值,读出来,再把值,放到$a的空间里,即赋值给$a(此时3就被替换成5)
 * 3. 就是把$b的值,传递给$a,叫做"传值赋值"
 * 4. 此时$a的地址和$b的地址都是 5
 *  
 * 此时打印$a,输出的肯定是5
 */

echo $a,'<br/>'; // 5

/**
 * 在这个过程中,仅仅是参考了一个$b的值,然后把$b的值,复制一份到$a的空间
 * 之后$a、$b两个变量还是没有关系,因为$a和$b的值还是各自存放在自己的内存空间
 *
 * 此时打印$a ,$a,输出的结果是 55
 */

echo $a, $b,'<br/>'; // 55

/**
 * 紧接着
 * 1.再修改$b的值为99
 * 2.再打印$a、$b
 * 3.输出:5~99
 */ 

$b = 99; 

echo $a, '~' ,$b; // 5~99

看下图,5把3覆盖了

image.png


2、引用赋值

$a = 3;

$b = 5;

$a = &$b; 

/**
 * $a = &$b
 * 前面加一个&符号
 * $a = &$b 发生了什么?
 * 把$a这把钥匙的指向,指向了$b的地址(空间),即$a、$b指向同一个地址
 * 就像两把钥匙指向同一个房间,所以读出来的值是一样的
 * 打印$a、$b,输出的是55
 */

echo $a, $b, '<br/>'; // 55

/**
 * $b的值改为9
 * 再打印$a、$b,输出的是99
 * 因为两个变量始终指向一个空间,因此无论修改$a还是$b,对方都要受到影响
 */

$b = 9;

echo $a, $b; // 99

image.png


认真理解下面这道题

$a = 3;

$b = 5;

$a = &$b; // $a、$b两个变量指向同一个空间($b的空间)

$b = 9; // $b的值更改为 9

unset($b); // 销毁掉变量$b

echo $a; // 9


/**
 * 为什么打印9,原因很简单
 * 1. 因为有$a, $b两个变量指向同一个地址
 * 2. $b销毁了,但是$a没销毁
 * 3. 变量有一个机制,当某段地址存的值,有一个变量在指向他的时候,就不会被回收
 * 4. 举一个例:
 *    张三、李四两个人一起吃饭,张三走了但是李四没走,服务员不会清理桌子。
 *    因为还有一个人坐在桌子前
 *    如果,把李四也给unset掉,那么桌子上的饭菜才可以真正清理掉。
 */


看一看,上面的0.3 - 0.2不等于01的问题

if((0.3 - 0.2) == 0.1){

 echo '0.3-0.2 等于0.1','<br/>';

}else{

 echo '0.3-0.2 不等于0.1','<br/>';

}


/**
 * 这是一浮点数的问题:
 * 1. "三分之一"用计算机表示.只能表示1/3 = 0.333333333333333
 * 2. 但是从数学的角度是一直往后写"3"(0.333333333333333...)
 * 3. 但计算机不能无限的存储,所以"三分之一"就到十五位或三十位后就停 0.333333333333333
 * 4. 0.33333333333333在乘以3就等于0.999999999999999(0.33333333333333 * 3 = 0.999999999999999)
 * 5. 所以1除以3再乘以3最后还不等于1了
 *    1 / 3 = 0.33333333333333
 *    0.33333333333333 * 3 != 1
 *
 * 要是按照数学来理解,一除以三再乘以3肯定等于1   (1/3) * 3 = 1
 * 但计算机存储浮点数的时候不可能无限精确,它损失了一定的精度,所以就导致了"0.3 - 0.2不等于0.1"情况的发生。
 */


八、常量

变量说明“变量的值”随时可能发生变化,既然有变量,与之相对的就有不变的量,一旦定义了后就不能够改变,这种特性我们叫常量

1、先通过一个场景学习常量

学知识的时候,往往容易稀里糊涂,不知道为什么要学这个知识,所以学新知识最好找到某一个场合。这个场合自然引出,让我们领悟到要是能有“常量”这样的一个东西就太好了,有这样一个场景对新的概念更容易理解。

下面这个场景让我们领悟到,这个变量的值不能被别人修改就太好了,意识到这一点,常量就自然迎刃而解了。

圆周与圆面对的计算:

/**
 * 圆周长公式: 圆周长 = 直径 × 圆周率
 *                     半径 × 2 × 圆周率
 * 圆面积公式: 圆面积 = 半径 x 半径 x 圆周率
 * 圆体积公式: 圆体积 = 圆周率 × 半径的平方 × 高(3.14 * 半径 * 半径 * 高)
*/

$pi = 3.14; // "圆周率"约等于3.14
$r = 5; // 半径为5 

$s = 2 * $r * $pi; // 计算圆周长
echo $s,'<br/>'; // 31.4

$area = $r * $r * $pi; // 计算圆面积
echo $area,'<br/>'; // 78.5


$height = 10;
$cube = $pi * $r * $r * $height;
echo $cube,'<br/>'; // 785


/**
 * 变量是可以随意赋值的
 * 引入"include.php"文件,变量$pi被的值被更改($pi = 3.1415926)
 * $pi被很多公式参考的变量,被重新赋值了,影响了所有的公式
 */

include('include.php');

$s = 2 * $r * $pi;
echo $s,'<br/>'; // 31.415926

$area = $r * $r * $pi;
echo $area,'<br/>'; // 78.539815

$height = 10;
$cube = $pi * $r * $r * $height;
echo $cube,'<br/>'; // 785.39815

include.php文件

// include.php文件

$pi = 3.1415926;

echo '<hr>';

问题很明显,重要的值,如果赋值给变量,容易被修改

解决方法:

常量的值一旦定义了,就不能修改。

于是引出常量的概念,接下来探讨,常量的语法和具体规范。


2、常量的定义

定义常量用define函数

常量的定义: define('常量名', '常量值'); 

常量的引用: echo 常量的名; (注意:没有"$"符号)

define('HEIGHT', 8848); // 定义珠穆朗玛峰的高度8848

echo HEIGHT; // 8848


3、常量的特点

01/

一旦定义,值不能被修改

define('HEIGHT', 8848);

HEIGHT = 8888; // Parse error: syntax error, unexpected '=' in

重新赋值直接提示语法错误:“Parse error: syntax error, unexpected '=' in……”,unexpected '=' in不希望的等于号

02/

一旦定义,也不能重复定义)

既然常量不能用等号重新赋值,那能不能用define再定义一次,并且定义一个新值?

define('HEIGHT', 8848);

define('HEIGHT', 8888); // Notice: Constant HEIGHT already defined in……

保错信息:Notice: Constant HEIGHT already defined in

Notice:注意的意思

Constant HEIGHT:常量HEIGHT

already defined in:已经在(多少行)被定义过了

上面 define('HEIGHT', 8888);  常量重复定义,虽然被提示了一下,但重新定义的值到底有没有改变成8888呢?

define('HEIGHT', 8848);

echo HEIGHT.'<br/>'; // 8848

define('HEIGHT', 8888); // Notice: Constant HEIGHT already defined in...

echo HEIGHT; // 打印结果还是8848

常量所具备的这两个特点是变量所不具备的,这个两个非常重要的特点以外,还有一个非常重要的特点。

03/

常量的第三个重要特点全局有效,说白了,就是页面任意一处都能访问到

/**
 * 定义一个常量 HEIGHT
 * 定义一个变量 $height
 */
define('HEIGHT', 8848);

$height = 1234;


/**
 * 这里引用常量,也引用变量
 */
echo HEIGHT,'<br/>';  // 8848

echo $height,'<br/>'; // 1234

echo "<hr/>";


/**
 * 在函数内部也引用"常量",也引用"变量"
 */
function test(){

    echo HEIGHT;  // 8848
    
    echo '<br/>';

    /**
     * echo $height; 打印变量报错:Notice: Undefined variable: height in...
     * 为了看的更清晰用var_dump打印$height
     * 提示报错信息:Notice: Undefined variable: height in……
     * Undefined variable:意思是未定义的变量值
     */
    var_dump($height); // Notice: Undefined variable: height in……
}

test();

思考:

函数体内的变量有一个作用域的概念。

1). 比如,整个页面是操场,函数是操场内的一间小屋子,在操场上有一个用户叫张三。

2). 我们在小屋子里喊张三,PHP程序会认为在小屋子的范围内寻找张三。

3). 而且小屋子里的张三和操场上张三不是一个人

     也就是说函数有自己的一片小空间,有函数自己的变量范围,所以出现上面 Undefined variable 的问题。

但是常量(HEIGHT)被打印出来了

- 这就是,常量一旦定义在页面的任何旮旯里角落里都能够访问到。

- 常量一旦定义了,在全局、函数、面相对的方法内都能访问到。

- 这就是我们说的常量的第三个特性


4、常量的命名规则

常量的命名规则和变量一样,但是习惯上大写这是事实标准(语法上允许小写)

变量怎么写常量怎么写

define('height', 8848);

echo height; // 8848

常量也区分大小写

defind('height', 8844);

echo height;

echo HEIGHT; // 引用大写的常量报错,Fatal error: Call to undefined function defind() in...

PHP5中,如果引用了一个未曾定义的常量(HEIGHT),因为没定义该常量自然找不到值,所以会把常量名(HEIGHT)当成字符串输出,PHP7不会输出为定义的常量字符串。


5、常量的值有几种类型

变量的值有八种类型,常量的值有几种类型呢?

整形、浮点型、字符串、布尔、NULL,这五种成为标量可以作为常量的值,其它三种array、object、resource都不行。

整形可以赋给常量

$height = 23;

define('HEIGHT', 23);

echo $height,' ',HEIGHT,'<br/>'; // 23 23

浮点类型也可以赋给常量

$height = 23.7;

define('HEIGHT', 23.7);

echo $height,' ',HEIGHT,'<br/>'; // 23.7 23.7

字符串类型也可以赋给常量

$height = '八八四八';

define('HEIGHT', '八八四八');

echo $height,' ',HEIGHT,'<br/>'; // 八八四八 八八四八

boolean类型也可以赋给常量

$bool = true;

define('BOOL', true);

var_dump($bool); // 用var_dump函数打印输出数据类型:bool(true)

echo '<br/>';

var_dump(BOOL); // 用var_dump函数打印输出数据类型:bool(true)

NULL类型可以赋给常量

$kong = NULL;

define('KONG', NULL);

var_dump($kong); // NULL

echo '<br/>';

var_dump(KONG); // NULL

数组类型不可以赋给常量

$arr = array(1, 2);

var_dump($arr); // array(2) { [0]=> int(1) [1]=> int(2) }

define('ARR', array(3, 4));

var_dump(ARR); // Constants may only evaluate to scalar values in……

/**
 * PHP5输出的报错信息Constants may only evaluate to scalar values in……
 * PHP7可以var_dump输出,并print_r打印
 * var_dump(ARR); // array(2) { [0]=> int(3) [1]=> int(4) }
 * print_r(ARR); //  Array ( [0] => 3 [1] => 4 )
 */

整数、浮点数,字符串型,布尔型,NULL,这5种可以赋成一个常量,其它三种array,object,resource都不可以赋给常量。

整数、浮点数,字符串型,布尔型,NULL,这5种成为标量,简单的一维的量叫做标量,数组有多层结构是多维的矢量。

注意:PHP7可以输出定义长常量的数组。


6、常量的检测

我们知道一个变量,是否已声明可以用isset()方法检测。

开发时如果想知道某个常量有没有定义,如果没有定义,我们去定义,怎么样判断一个常量是否定义过呢?

defined('常量名') 来检测,已定义返回true、未定义返回false

if(defined('HEIGHT')){

    echo '"HEIGHT"常量已经定义<br/>';

}else{

    echo '"HEIGHT"常量还没有经定义,接下来我帮你定义<br/>'; // "HEIGHT"常量还没有经定义,接下来我帮你定义

    define('HEIGHT', 8848);

}


echo "<hr/>"; // 把这段代码,连续运行两遍,线上面与线下面分别是什么?


if(defined('HEIGHT')){

    echo '"HEIGHT"常量已经定义<br/>';  // "HEIGHT"常量已经定义

}else{

    echo '"HEIGHT"常量还没有经定义,接下来我帮你定义<br/>';

    define('HEIGHT', 8848);

}

常量用defined定义,常量的检测也用defined检测


7、动态常量

变量可以是动态的,即变量名还可以是一个变量,这个常量能不能也动态呢?

/**
 * 动态根据传来的值,显示不不同常量
 *
 * index.php?who=ZHANGSAN
 * index.php?who=LISI
 * index.php?who=WANGWU
 */

$who = $_GET['who']; // 准备传:ZHANGSAN、LISI、WANGWU

define('ZHANGSAN', '张三');

define('LISI', '李四');

define('WANGWU', '王五');

/**
 * index.php?who=ZHANGSAN
 * 变量值是ZHANGSAN,打印自然是ZHANGSAN
 * 问题是,我们想把ZHANGSAN当成常量的名,在解析出常量的值来
 */ 

echo $who,'<br/>'; // ZHANGSAN

echo ZHANGSAN; // 张三

想用动态常量,用变量的值当常量名,必须要靠constant函数

$who = $_GET['who']; 

define('ZHANGSAN', '张三');

define('LISI', '李四');

define('WANGWU', '王五');

/**
 * index.php?who=ZHANGSAN
 * $who的值解析出来,比如是ZHANGSAN,constant($who)函数再去解析ZHANGSAN对应的常量的值。
 */

echo constant($who); // 张三


8、总结

为什么要用常量?

因为有些重要的值,不希望被改变


常量的特点:

1.一旦定义,不能重新赋值

2.一旦定义,不能再次定义

3.一旦定义,页面内任何角落都可以访问,没有"作用域"的限制


常量的命名规则

1.和变量一样

2.习惯上大写


常量的值的类型

只能是标量类型只能标量类型,这五种: 整形、浮点型、字符串、布尔、NULL


常量的检测

defined('常量名')

如果已定义返回true

如果未定义返回false


动态常量

动态常量需要用constant函数来实现

constant($var),会把$var的值,当做一个常量的名,并解析出常量的值


开发中什么时候用常量

网站根目录,比如  D:/www/ 

网站配置文件,不希望被更改,也可以用常量

dedecms系统中的sql语句的数据表的名用的是常量


笔记于燕十八-PHP公益培训课程


记录一下长长见识,

PHP历史上一系列短视的设计,造成它有些丑陋,不尽如人意。最为明显的是各种不一致:内置函数命令、参数位置、PHP5.5之前empty()的参数不能是表达式、有intval()却没有boolval(),你得用settype()......

任何级别的异常都会产生大量的内存开销,即使你屏蔽了。所以我特别反感 if($a)这种写法,如果$a 没有赋值,会产生一个 notice 级别的错误,判断变量是否存在最好用 isset 和 empty


荣勇不属于那些评论家,他们只能看到别人犯错,告诉别人如何改进,而荣耀只属于真正上场的人 —— 罗斯福



Leave a comment 0 Comments.

Leave a Reply

换一张