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覆盖了
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
认真理解下面这道题
$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、常量的特点
1. 一旦定义,不能重新赋值
2. 一旦定义,也不能重复定义
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、常量的命名规则
常量的命名规则和变量一样,但是习惯上大写这是事实标准(语法上允许小写)
1. 和变量一样
2. 习惯上大写
变量怎么写常量怎么写
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
荣勇不属于那些评论家,他们只能看到别人犯错,告诉别人如何改进,而荣耀只属于真正上场的人 —— 罗斯福