PHP的变量与常量语法
发布时间:2023-08-16 19:23:21 作者:寒笛过霜天 浏览量:320
变量的声明:
$a=100;
$b='string'; //字符串要加引号
$c=true;
$d=99.99;
$key1=$a;
$key2=$b;
$a=$b=$c='value';
变量作用范围:可以在一个页面的所有开启的php模式下使用,也包含了include和require引入的文件。
如果使用COOKIE和SESSION还可以在多个页面中应用。
我们可以借助unset()函数释放指定的变量, 使用isset()函数检查变量是否设置, 使用empty()函数检查变量是否为空;
empty() true '' 0 '0' null false array() $var (注意:' ',empty()函数返回的是false)
isset() false usset()释放的变量 null
变量的命名:
[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]* x7f-xff 为中文
变量严格区分大小写,变量名的标识符一定不要以数字开头,中间不可以使用空格,不能用点分开;最好不要以php的关键字作为变量名称。
可变变量:
一个变量的变量名可以动态地设置和使用。
$hi='hello';
$hi='world';
echo '$hi $hello'; //输出两个单词 hello world
echo '$hi ${$hi}'; //输出两个单词 hello world
可变变量的扩展:
$v1 = 10;
$v2 = 'v1';
$v3 = 'v2';
echo $$v3 //输出10。理解:从右往左一层一层'取得值'
可变变量常用用于在写程序的时候不确定需要用哪个变量去处理数据的情形。
$gif = 'logo.gif';
$jpg = 'logo.jpg';
$png = 'logo.png';
假设用户可以填写一个表单,以决定其想要什么类型的logo图片,
$f1 = $_GET['fileType']; //用户选择所需要的图片类型的后缀,可以是'gif','jpg','png'
sendFile($f1); //假设sendFile()可以发送文件,
变量的引用赋值
php中提供了另外一种方式给变量赋值:引用赋值,这意味着新的变量简单的引用(换言之,'成为其别名'或者'指向”)了原始变量。
改动新的变量将影响到原始变量,反之亦然。使用引用赋值,简单地将一个'&'符号加到将要赋值的变量前(源变量)。
$foo='Bob';
$bar=&$foo;
变量类型
四种标量类型:integer(整型) float(浮点型,也称double) boolean(布尔型) string(字符串)
两种复合类型:array(数组) object(对象)
两种特殊类型:resourse(资源) NULL
integer(整型)
整型数据包括可选符号(+或-)表示正数或者负数、常用的十进制数(基数为10)、八进制数(基数为8,数字前加上0)、
十六进制(基数为16,数字前加上0x)
$int=1234; 十进制数
$int=-123; 一个负数
$int=0123; 八进制数(等于十进制的83),只有(只识别)0-7这8个数字
$int=0x1A 十六进制数(等于十进制的26),只有(只识别)0-9,A,B,C,D,E,F这16个数字
这些写法,只是'字面表达形式',但实际其值,在输出的时候,都是10进制的,如下
<?php
$n1 = 123; //10进制
$n2 = 0123; //8进制,只有(只识别)0-7这8个数字
$n3 = 0x123; //16进制,只有(只识别)0-9,A,B,C,D,E,F这16个数字
echo '<br />n1 = $n1'; //输出结果123
echo '<br />n2 = $n2'; //输出结果83
echo '<br />n3 = $n3'; //输出结果291
?>
整型数值有最大的使用范围。php不支持无符号整数, 所以不能像其他语言那样将整数都变成正数,也就不能将最大值翻一倍。
32位PHP运行环境范围:-2147483648 ~ 2147483647
64位PHP运行环境范围:-9223372036854775808 ~ 9223372036854775807
给定的值或者运算值超过了integer范围, 会返回float类型;
<?php
$v4 = PHP_INT_MAX + 1; //PHP_INT_MAX是php中的最大的整数
echo '<br />最大的整数为:' . PHP_INT_MAX . ',类型为:' . gettype(PHP_INT_MAX);
echo '<br />v4为:' . $v4 . ',类型为:' . gettype($v4);
?>
输出结果:
最大的整数为:2147483647, 类型为:integer
v4为:2147483648, 类型为:double
实例:判断操作系统位数
function is_64bit() {
$int = '9223372036854775807';
$int = intval($int);
if ($int == 9223372036854775807) {
/* 64bit */
return true;
}
elseif ($int == 2147483647) {
/* 32bit */
return false;
}
else {
/* error */
return 'error';
}
}
进制转换:
dec:10进制
bin:2进制
oct:8进制
hex:16进制
十进制转换二进制函数:decbin()
浮点数(float或double)
浮点数(也叫双精度数或实数)是包含小数部分的数,通常用来表示整数无法表示的数据。如金钱值、距离值、速度值。
带小数点的数字都属于浮点类型数据;
数值的存储范围超过整型数据的都属于浮点类型数据;
带幂指数(科学计数法)的数值都属于浮点类型数据;
范围:1.7E-38 ~ 1.7E+38 之间,精确到小数点后15位。 E 不区分大小写
浮点数只是一种近似数的数值,如果使用浮点数表示8,该结果内部的表示其实就是7.9999999999......
如果确实要精确到更高的精度,应该使用任意精度数学函数或者gmp()函数
$float=1.234; 这是一个正常的浮点数,也可以使用正负的形式。
$float=1.2e3; 使用科学计数法表示的浮点数,相当于1.2*1000 即1200
$float=7E-10; 使用科学计数法表示的浮点数,相当于0.0000000007
$float=3.58E1; 相当于3.58*1
注意:浮点数不应进行大小比较
boolean(布尔型):
true和false 不区分大小写
当转换为 boolean 时,以下值被认为是TRUE:
'FALSE'
' '
' '
-1和其他非零值(无论正负)一样,都被认为是TRUE
当转换为 boolean 时,以下值被认为是 FALSE:
布尔值 FALSE
'' 空白字符串
'' 空白字符串
整型值 0(零)
浮点型值 0.0(零)
字符串 '0'
没有成员变量的数组
没有单元的对象(仅适用于 PHP 4)
特殊类型 NULL(包括尚未设定的变量)
string
单引号 需要用反斜线转义的两个符号
' '
\ 可能需要
如果在单引号之前或字符串结尾需要出现一个反斜线(),需要用两个反斜线(\)表示, 反斜线超过三个(包括\)以上,则程序出错
'C:windowssystem32\'
双引号的结尾需要出现一个反斜线(),必须用两个反斜线(\),而偶数(4,6,8)个反斜线,程序正确,如果是奇数(3,5,7)个反斜线,则程序错误
'C:windowssystem32\'
如果试图转义任何其它字符,反斜线本身也会被显示出来!所以通常不需要转义反斜线本身。
'C:*.*?'; 输出 仍然输出一个斜线
'C:\*.*?'; 输出 输出一个斜线
'C:\*.*?'; 输出 \ 输出两个斜线
'C:\\*.*?' 输出 \ 输出两个斜线
'C:\\*.*?' 输出 \ 输出三个斜线
'C:*.*?'; 输出 仍然输出一个斜线
'C:\*.*?'; 输出 输出一个斜线
'C:\*.*?'; 输出 \ 输出两个斜线
'C:\\*.*?'; 输出 \ 输出两个斜线
'C:\\*.*?'; 输出 \ 输出三个斜线
结论:在单引号和双引号中: 仍原样输出, \输出一个 \输出两个\ \\仍输出两个\ \\输出三个\
双引号 需要用反斜线转义的符号
换行(LF 或 ASCII 字符 0x0A(10))
回车(CR 或 ASCII 字符 0x0D(13))
水平制表符(HT 或 ASCII 字符 0x09(9))
\ 反斜线
$ 美元符号
' 双引号
[0-7]{1,3} 此正则表达式序列匹配一个用八进制符号表示的字符
x[0-9A-Fa-f]{1,2} 此正则表达式序列匹配一个用十六进制符号表示的字符
如果试图转义任何其它字符,反斜线本身也会被显示出来!
双引号字符串最重要的一点是其中的变量名会被变量值替代。
当用双引号或者定界符指定字符串时,其中的变量会被解析。
<?php
echo 'PHP从入门到精通 ASP从入门到精通 JSP程序开发范例宝典 PHP函数参考大全'; //输出字符串
?>
运行结果为:PHP从入门到精通
ASP从入门到精通
JSP程序开发范例宝典 PHP函数参考大全
function __autoload($className){
include '{$className}.class.php'; //必须使用双引号
}
【重点, 单引号和双引号有何不同:】
1 单引号不可以解析变量, 双引号可以解释变量
2 在双引号里面输出变量, 变量后面接的是纯英文, 可以拿{}大括号, 将变量包起来进行定界(单引号里面不能使用定界符)
3 变量后面接的是中文也会把变量和中文拼在一起来解释。除非后面有特殊符号才会停止解释
4 双引号当中插入单引号, 单引号当中插入变量, 变量能够正常解析。单引号也会显示出来
5 单引号不解析转义(除了单引能解析' 和\), 双引号解析转义字符, 单引号或双引号单中要插入自己, 在前面加上一个反斜线
6 双引号和单引号可以互插
7 单引号效率更高,尽可能用单引号, 用点可以连接字符串和变量
注意:echo 输出HTML代码和javascript, 可以用单引号和双引号;
输出javascript脚本方法:
ehco '<script>alert('变量值不能为空!');</script>';
echo '<h2>file_get_contents()输出数据'; //函数file_get_contents()原样输出
echo '<h2>file_get_contents()输出数据'; //与上等同
使用{}在字符串中显示变量
<?php
$temp = array('one' => 1, 'two' => 2);
echo 'The first element is {$temp['one']}.';
echo '<br/>';
$username = 'xuchenkai';
echo '${username} is two years old.';
?>
定界符
定界符的语法:应该在<<<之后提供一个标识符号,然后是包含的字符串,最后是同样的的标识符结束字符串。结束标识符必须从行的第一列开始,并且后面
除了分号之外不能包含任何字符,空格以及空白制表符都不可以。同样,定界标记使用的标识符也必须遵循PHP中其他任何标签的命名规则,只能包含字母数字
下划线,而且必须以下画线或非数字字符开始。
<?php
$str= <<< EOT
这里是包含在定界符中的字符串,指出了定界符的一些使用时注意的事项。很重要的一点必须指出,结束标识符EOT所在的行不能包含任何其他字符。
这尤其意味着该标识符不能被缩进,而且在结束标记的分号之前和之后都不能有任何空格或制表符。
同样重要的是,要意识到在结束标识符之前的第一个字符必须是你的操纵系统中定义的换行符。如果破坏了这条规则使得结束标识符不'干净',则它
不会被视为结束标识符,php将继续寻找下去。如果在这种情况找不到合适的结束标识符,将会导致一个在脚本最后一行出现的语法错误。
EOT;
echo $str;
?>
定界符除了不能初使化类成员以外,表现的就和双引号字符串一样,只是没有双引号。这意味着在定界符文本中不需要转义引号,不过仍然可以用以上列出来的
在双引号可以使用的转义符号,而且定界符中的变量也会被解析。
注意:结束标识符所在的行的分号后面为了保持'干净',可以按'ENTER'回车键或方向键定位到下方继续输入代码,但不能使用'space'空格键;
同样,开始定界符后面(EOT)不能有空格,必须按'ENTER'回车键或方向键定位到下方继续输入文本,而'<<<'前后可以保留空格
//使用界定符输出变量
$name = 'MyName';
echo <<<EOT
My name is $name.I am printing a 'string' .
Now,I am printing some new line .
This should print a capital 'A'
EOT;
输出结果:My name is MyName.I am printing a 'string' . Now,I am printing some new line . This should print a capital 'A'
总结:
定界符内: 变量会解析
可以用转义字符(除单引号和双引号)
在定界符文本中不需要转义引号(单引号和双引号)
这种方式在以后开发中的Ajax技术中, 经常会使用定界符来组装XML数据!
转义字符 序列 含义
换行(LF 或 ASCII 字符 0x0A(10))
回车(CR 或 ASCII 字符 0x0D(13))
水平制表符(HT 或 ASCII 字符 0x09(9))
\ 反斜线
$ 美元符号
' 双引号
[0-7]{1,3} 此正则表达式序列匹配一个用八进制符号表示的字符
x[0-9A-Fa-f]{1,2} 此正则表达式序列匹配一个用十六进制符号表示的字符
换行符
换行符: unix系列用 , windows系列用 , mac用
PHP中可以用PHP_EOL来替代, 以提高代码的源代码级可移植性
如:
<?php
echo 'one', PHP_EOL, 'two', PHP_EOL, 'three'; //显示结果: one two three
?>
查看源代码:
one
two
three
注意: 双引号和定界符内的转义字符(非打印字符)只能在PHP解析后, 在浏览器中查看代码才能看到效果。
字符串长度与字符的访问
在php中, 字符串是一种非常特殊的数据结构, 其是有长度的, 我们可以通过其索引下标对指定字符进行获取与访问!
$str = '23456789';
$v1 = $str[1];
$v2 = $str[3];
$v3 = $str[0];
$v4 = $str[6];
$verify = $v1.$v2.$v3.$v4;
echo '验证码: '.$verify;
但是要特别注意:字符串的索引下标只能读取英文或数字字符串, 而不能读取中文, 因为一个中文字符占用的并不是一个字节长度。
如果采用UTF-8编码格式, 其一个中文字符要占用3个字节长度。所以我们不能通过索引下标对其进行读取, 否则一定会产生乱码。
数组(Array)和对象(Object)
key => value
key可以是integer或者string,value可以是任何值。
资源(Resource)和NULL类型
使用资源类型的变量保存有打开文件(stream)、数据库连接(mysql link)、图形画布区域(gd)、xml等的特殊句柄。
NULL类型
特殊的 NULL 值表示一个变量没有值。NULL 类型唯一可能的值就是 NULL。
在下列情况下一个变量被认为是 NULL:
被赋值为 NULL。
尚未被赋值。
被 unset()。
伪类型介绍:
mixed
mixed 说明一个参数可以接受多种不同的(但并不必须是所有的)类型。
number
number 说明一个参数可以是 integer 或者 float。
callback
Callback 函数不仅可以是一个简单的函数,它还可以是一个对象的方法,包括静态类的方法。
一个 PHP 函数用函数名字符串来传递。可以传递任何内置的或者用户自定义的函数,
除了 array(),echo(),empty(),eval(),exit(),isset(),list(),print() 和 unset()。
类型转换:
允许的强制转换有:
(int), (integer) - 转换成整型
(bool), (boolean) - 转换成布尔型
(float), (double), (real) - 转换成浮点型
(string) - 转换成字符串
(array) - 转换成数组
(object) - 转换成对象
具体转换函数intval() floatval() strval()
上述类型转换并没有改变这些被转换变量本身的类型,而是通过转换将得到的新类型的数据赋值给新的变量。
如果需要将变量本身的类型改变成其他类型,可以使用settype()函数来设置变量的类型。
$foo='5bar';
settype($foo,'integer');
变量类型的测试函数
is_bool() 判断是否是布尔型
is_int() is_integer() is_long() 判断是否是整型
is_float() is_double() is_real() 判断是否是浮点数
is_string() 判断是否是字符串
is_array() 判断是否是数组
is_object() 判断是否是对象
is_resource() 判断是否是资源类型
is_null() 判断是否是为空
is_scalar() 判断是否是标量,也就是一个整数、浮点数、布尔型或字符串
is_numeric() 判断是否是任何类型的数字或数字字符串
注意: '10.34' 返回值为true '10.34abc' 返回值为false
is_callable() 判断是否是有效的函数名
常量
常量的定义和使用
boolean define(string name,mixed value [,bool case_insensitive]);
insensitive 不敏感;
第三个参数默认值为false,表示大小写敏感(区分大小写);
define('CONSTANT', 'Hello world.');
echo CONSTANT;
注意:
常量前面没有美元符号($);
合法的常量名以字母或下划线开始, 后面跟着任何字母, 数字或下划线;
常量可以用 define() 函数定义,也可以用const定义;
常量可以不用理会变量范围的规则而在任何地方定义和访问;
常量一旦定义就不能被重新定义或者取消定义;
常量的值只能是标量; PHP7.0以上版本开始支持数组
const CONSTANT = 'Hello world';
echo CONSTANT;
和使用define()来定义常量相反的是, 使用const关键字定义常量必须处于最顶端的作用区域;
因为用此方法是在编译时定义的, 这就意味着不能在函数内, 循环内以及if语句之内用const来定义常量。
特殊常量只能使用define定义
define('-_-', 'smile');
特殊常量必须使用constant输出
echo constant('-_-');
注意:define内置函数定义的常量其命名规则是比较松散的, 可以任意定义
const定义的常量其命名规则比较严格的, 如const -_- = 'smile' 是不可行的;
注意:在一些系统函数中有些参数是作为常量形式存在的, 但是常量的值为整数, 因此参数也可以写成整数形式;
以extract()函数使用方法为例:
int extract ( array $var_array [, int $extract_type [, string $prefix ]] )
检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。
第二个参数可能的值:
EXTR_OVERWRITE - 默认。如果有冲突, 则覆盖已有的变量。
EXTR_SKIP - 如果有冲突, 不覆盖已有的变量。
EXTR_PREFIX_SAME - 如果有冲突, 在变量名前加上前缀 prefix。
EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix。
EXTR_PREFIX_INVALID - 仅在不合法或数字变量名前加上前缀 prefix。
EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时, 覆盖它们的值。其它的都不处理。
EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时, 建立附加了前缀的变量名, 其它的都不处理。
EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。
extract:提取 prefix 前缀名 same 相同 overwrite 重写 invalid 无效的
<?php
/* 假定 $var_array 是 wddx_deserialize 返回的数组*/
$size = 'large';
$var_array = array('color' => 'blue',
'size' => 'medium',
'shape' => 'sphere');
extract($var_array, EXTR_PREFIX_SAME, 'wddx');
echo '$color, $size, $shape, $wddx_size ';
echo EXTR_OVERWRITE; //0
echo EXTR_PREFIX_SAME; //2
?>
输出结果:
blue, large, sphere, medium
compact() 函数
<?php
$firstname = 'Bill';
$lastname = 'Gates';
$age = '60';
$result = compact('firstname', 'lastname', 'age');
print_r($result);
?>
输出结果:
Array ( [firstname] => Bill [lastname] => Gates [age] => 60 )
常量和变量的区别:
定义形式不同:
使用形式不同:常量无需$符号
可变程度不同:常量的值不可以改变, 常量也不可以销毁
作用范围不同:常量具有超全局作用域(函数内外都可以直接使用)
可用类型不同:常量只能存储标量类型(int, float, string, bool), PHP7.0以上版本开始支持数组
常量在实际开发中, 一般是用于防止非法入侵。
内置函数defined('常量名称')
主要功能:用于判断指定的常量是否定义
define('TOKEN', 'itcast');
if(!defined('TOKEN'){
echo '非法请求';
exit;
}else{
echo '正常请求';
}
注意:常量作用范围包括include文件下的定义函数内部;
收藏