PHP语法(二)
回顾
- 编译型和解析型:在程序运行的时候是否会生成中间代码
- PHP执行过程:读取源代码——词法分析——语法分析——生成opcode编码——有zend engine去执行
- PHP四种界定符
第一种:标准风格:
<?php
?>
第二种:短标记风格,要在php.ini中开启short_open_tag=on
<?
?>
第三种:asp风格,要在php.ini中设置asp_tags=on
<%
%>
第四种:脚本风格
<script language=’php’>
</script>
推荐使用第一种
PHP支持省略结束标记
-
注释
- 单行注释://和#
- 多行注释:/* */
-
输出语句
- echo:用来输出字符串和数字,可以输出多个值
- print:用来输出字符串和数字,可以输出一个值,输出成功返回1
- print_r:用来输出数组
- var_dump():输出所有的数据类型。
-
变量
- 概念:变量是内存中的一段空间
-
变量的命名规则:
- 变量必须以$开头,但是$不是变量的组成部分
- 变量名以字母、下划线开头,后面跟的是字母、数字、下划线。
- 变量赋值的时候分为值传递和引用传递。&表示获取变量的地址
- unset()用来删除变量,删除的是变量名,变量值由垃圾回收机制去销毁。
- isset()用来判断变量是否存在。
-
预定义变量
- $_GET:数组,用来保存http协议GET提交的数据
- $_POST:数组,用来保存http协议POST提交的数组
- $_REQUEST:数组,用来保存http协议GET和POST提交的数组。如果$_REQUEST获取数据,如果GET提交的和POST提交的数据名一样,默认POST覆盖GET数据。在php.ini中
Request_order=’GP’
-
-
-
- $argc:传递给脚本的参数数目
- $argv:传递给脚本的参数数组
-
-
-
常量
- 定义常量 define(常量名,常量值,是否区分大小写)和const
- 可以使用特殊字符做常量名,调用的时候要使用constant()来调用
- 常量一旦定义就不能重复定义,通过defined()函数判断常量是否定义。
- 预定义常量:PHP_OS,PHP_VERSION
- 魔术常量:__LINE__,__FILE__,__DIR__
- get_defined_constants()获取所有的常量
变量数据类型
强数据类型和弱数据类型
弱数据类型:变量的类型取决于保存的值。什么样的值决定什么样的数据类型。
强数据类型:声明一个空间保存什么类型的数据,那么这个空间就不允许保存其他类型的数据。
PHP和JS都是弱数据类型。
数据类型的分类(8种)
标量类型(基本类型)
数据类型 |
描述 |
备注 |
boolean(布尔型) |
true和false |
|
integer(整形) |
整数,用4个字节保存 |
范围-231~231-1 |
float(浮点型) |
实数 |
理论最大值1.8E+308 |
string(字符串) |
单引号和双引号 |
PHP支持八进制和十六进制的整型
进制转换
进制 |
缩写 |
单词 |
十进制 |
dec |
decimalist |
八进制 |
oct |
octonary |
二进制 |
bin |
binary |
十六进制 |
hex |
hexadecimal |
例题
- 十进制的整数转二进制(除2反向取余)
- 十进制的小数转二进制(乘2正向取整)
- 二进制转十进制,个位是2的0次方,往左一次是1次方,2次方,往右依次是-1次方,-2次方
- 八进制转二进制:把每位的八进制转成3位的二级制然后合并起来
- 十六进制转二进制:把每位的十六进制转成4位的二级制然后合并起来
脚下留心:小数可能在内存中保存的是近似值。
浮点数尽可能不要参与比较
如果浮点数要比较,使用bccomp()函数比较
bccomp()返回0表示相等,1表示左边的数大,-1表示右边的数大
字符串型
- 如果字符串中没有变量,双引号和单引号是一样的
- 如果字符串中有变量,单引号字符串中的变量不被解析,双引号字符串中的变量要解析。
分析如下代码
解决:
完美解决:
通过添加{ }来解决
{和$必须紧挨在一起
{和$没有顺序,主要挨在一起就行
使用字符串定界符
heredoc |
nowdoc |
类似于双引号 |
类似于单引号 |
字符串定界符注意事项:
- 以“<<<”开头
- 字符串定界符的命名规则和变量的命名规则一样,不能以数字开头。
- 结束定界符必须顶格写
- 适用于输出大段文本
字符串的四种声明方法:
- 单引号字符串
- 双引号字符串
- heredoc
- nowdoc
转义字符(\)
- 将特殊字符转成普通字符 \’ \” \$ \\
- 和r,t,n在一起组成新的具有特殊含义的字符
\t \r \n
3、可以用转义字符转义asc||码
ASC||:给键盘上的每个键都编一个对应的数字编码,成为ASC||码。ASC由7位的二进制数组成,最多可以编128个键。
字符比较其实比较的是字符的ASC||码。 A<a a-A=32
填空题:已知A=65,求d=?
d=a+3=A+32+3=65+35=100
数组
数组是内存中一段连续的空间,通过下标来区分每个元素
数组的声明
例题
关联数组中,一个下标对应一个值,称为键值对。
通过“=>”符号给关联数组赋值。
注意:不是所有的数字做下标的都是索引数组,如果做下标的数字不是表示值的位置,这也是关联数组。
注意:以数字做下标的情况下,后面的元素在前面元素的下标上递增1.
例题:写出如下下标
数组下标的思考
在一般情况下,数组下标就是数字和字符串。如果是其他情况会怎么样?
extract()
从数组中将变量导入到当前的符号表
数组的分类
-
按照元素的键值关系来分类
- 索引数组:通过元素的位置坐下标
- 关联数组:元素的值和下标没有位置上的关系。关联数组中元素顺序与下标无关。
-
按照数组的结构来分类:
- 一维数组
- 多维数组
注意:在PHP和JS中,二维数组不一定是二维表。
资源类型(resource)
- PHP引用的外部数据都是资源类型
- 资源类型只能获取,不能创建
- 资源也是有类别的,比如有链接资源,文本流资源
NULL类型
- 表示没有
- NULL是不区分大小写的,写null也是一样的。
PHP 伪类型
PHP除了上面8种原始数据类型外,还提供了3种伪类型
混合类型(mixed)
mixed 说明一个参数可以接受多种不同的类型
number
callback
callback表示回调函数。在某种条件下,计算机自动调用的函数称为回调函数。具体在后面讲解。
类型转换
数据类型是数据在内存中的存储结构,并在此结构上的操作运行的集合。这就意味着不同的数据类型的运算操作会不一样,不同的数据类型之间运算首先先要组成相同的数据类型,还个转换有可能是计算机自己转换的。我们要注意这个数据类型的转换。
自动转换
在计算机期望类型和实际类型不符的条件下自动转换成计算机期望的类型
强制转换
int:整数
bool:布尔型
float:浮点型
string:字符串型
其他类型和bool之间的关系
- 数字转布尔:0为假,非0为真
- 字符串,数组转布尔:如果一个字符串你们转成0或者转成空就为false,否则为true。
<?php
//整数转布尔
var_dump((bool)1);echo ‘<br>’; //true
var_dump((bool)0);echo ‘<br>’; //false
var_dump((bool)-1);echo ‘<hr>’; //true
//浮点数转布尔
var_dump((bool)1.1);echo ‘<br>’; //true
var_dump((bool)0.0);echo ‘<br>’; //false
var_dump((bool)-1.1);echo ‘<hr>’; //true
//字符串转布尔
var_dump((bool)’abc’);echo ‘<br>’; //true
var_dump((bool)’0′);echo ‘<br>’; //false
var_dump((bool)’0.0′);echo ‘<br>’; //true
var_dump((bool)’00’);echo ‘<br>’; //true
var_dump((bool)”);echo ‘<br>’; //false
var_dump((bool)’null’);echo ‘<br>’; //true
var_dump((bool)’false’);echo ‘<hr>’; //true
//数组转成布尔
var_dump((bool)array());echo ‘<br>’; //false
var_dump((bool)array(1));echo ‘<br>’; //true
var_dump((bool)array(false));echo ‘<br>’; //true
var_dump((bool)null);echo ‘<br>’; //false
与类型有关的函数
能够返回的值有
例题
is_XXX系列,用来判断变量是否是某种数据类型
原码、反码、补码
原码
原码:数字转成二进制,这个二级制数就是原码
比如5对应的二进制是101。101就是5的原码。
反码
反码就是原码的相同位取反,0变1,1变0.
补码
- 正数的原码,反码,补码是一样的。
- 负数的反码:符号位不变,其他位取反。最高位就是符号位,正数是0,负数是1。
- 负数的补码:补码=反码+1
例题:
X=5
X[原]=x[反]=x[补]=0101
X=-5
X[原]=1101
X[反]=1010
X[补]=1011
为什么计算机要使用补码运算?
- 在补码中+0和-0表示方法一样
- 计算机的运行有高位溢出原则
为什么+0和-0补码是一样的?
+0的反码是 +0[反]=0000
-0[原]=1000 -0[反]=1111 -0[补]=10000 高位溢出后 0000
- 利用补码运算,可以将减法变成加法来运算
比如:4-1
=4+(-1)
=0100[原]+1001[原]
=0100[反]+1110[反]
=0100[补]+1111[补]
=10011[补]
=0011[补] 高位溢出
=0011[原]
=3
例题:1-4
=1+(-4)
=0001[原]+1100[原]
=0001[反]+1011[反]
=0001[补]+1100[补]
=1101[补]
=1100[反]
=1011[原]
=-3