PHP基础知识总结
PHP 引用变量
问题:什么时引用变量?在PHP中,用什么符号定义引用变量?
概念:引用变量的定义和引用方式
延申:PHP引用变量的原理
引用变量
定义:在PHP中意味着用不同的名字访问同一个变量内容
定义方式: 使用&符号
1 | $a = 100; |
工作原理:
第一步定义$a
时需要开辟一块内存空间用于保存$a
,常规赋值时,在被赋值变量改变时,根据COW特性,会进行copy操作,引用变量时,相当于给当前开辟的内存空间一个别名,对a变量的修改也会提现在b变量上
PHP COW 特性 Copy On Write
示例代码:
1 |
|
输出:
1 | int(6687584) |
注意:
unset只会取消引用,不会销毁内存空间
对象赋值是引用传值,如果想不使用引用,需要克隆对象
PHP字符串定义方式及各自的区别
定义方式:
单引号
双引号
heredoc
和newdoc
区别:
- 单引号不能解析变量
- 单引号不能解析转义字符,只能解析单引号和反斜线
- 变量和变量、变量和字符串、字符串和字符串之间可以用.连接
- 双引号可以解析变量,变量可以使用特殊字符和{}包含
- 双引号可以解析所有转义字符
- 单引号效率高于双引号
- Heredoc类似双引号
- Newdoc类似单引号
数据类型
8大数据类型
- 标量
- 浮点类型(浮点不能用与精确相等判断)
- 布尔类型 (0,0.0,“”,false,array(),NULL)
- 数组类型
- 超全局数组
- $GLOBALS
- $_GET
- $_POST
- $_REQUEST
- $_SESSION
- $_SERVER
- SERVER_ADDR 服务器ip
- SERVER_NAME 服务器名称
- HTTP_REFERER Referer
- REMOTE_ADDR 客户端ip
- PATH_INFO
- 超全局数组
复合
特殊
NULL
变量直接赋值为NULL,未定义的变量,unset销毁的变量 都为NULL
常量
定义:
const 和 define
1
2const ADF = "asd";
define("ADF","asd");预定义常量:
1
2
3
4
5
6
7
8__FILE__; //所在文件路径+文件名
__LINE__; //行号
__DIR__; //目录
__FUNCTION__; //方法名
__CLASS__; //类名
__TRAIT__; // Trait 的名字
__METHOD__; //类名加方法名
__NAMESPACE__; //命名空间名称
运算符
foo()和@foo()之间的区别
- 错误控制符@
延申 :PHP运算符知识点
运算符优先级
结合方向 运算符 附加信息 无 clone new clone 和 new 左 *[* array() 右 **
算术运算符 右 ++ – ~ (int) (float) (string) (array) (object) (bool) @ 类型和递增/递减 无 instanceof 类型 右 ! 逻辑运算符 左 ** */ % 算术运算符 左 + - . 算术运算符和字符串运算符 左 *<<* >> 位运算符 无 *<* *<=* > >= 比较运算符 无 == != === !== *<>* *<=>* 比较运算符 左 & 位运算符和引用 左 ^ 位运算符 左 | 位运算符 左 && 逻辑运算符 左 || 逻辑运算符 左 ?? 比较运算符 左 ? : ternary 右 = += -= =* *=* /= .= %= &= |= ^= *<<=* >>= 赋值运算符 左 and 逻辑运算符 左 xor 逻辑运算符 左 or 逻辑运算符 递增递减 > ! > 算术运算符 > 大小比较 > 不等 > 引用 > 位运算符^ > 位运算符( | ) > 逻辑与(&&) > 逻辑或(||) > 三目 > 赋值 > and > xor > or
比较运算符
== 和 === 的区别
== 判断值是否相等
=== 判断之和类型是否相等
等值判断 FALSE的其中情况是等值的
递增/递减运算符
递增递减不影响布尔值
递减对NULL没有效果
递增NULL值为1
递增和递减在前先运算后反回,反之就先返回后运算
逻辑运算符
短路作用:
|| && 与or和and的优先级的不同
错误控制符:
PHP支持一个错误运算符:@ 当将其放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略
流程控制
问题:请列出3中PHP数组循环操作的语法,并注明各种循环的区别
知识点:
PHP遍历数组的三种方式及各自区别
使用for 循环
for循环只能遍历索引数组
1
2
3
4
5$arr = range(1,20);
$length = count($arr);
for($i=0;$i<$length;$i++){
echo $arr[$i]."<br>";
}使用foreach 循环
foreach既可以遍历索引,也可以遍历关联
foreach遍历会对数组进行reset()操作
1
2
3
4$arr = range(1,20);
foreach($arr as $k => $v){
echo $v . '<br>';
}while , list() , each() 组合循环
组合循环同样可以遍历索引和关联数组
组合循环不会进行reset()操作,即将数组的指针移动到开头
1
2
3while(list($k,$v) = each($arr)){
echo $v.'<br>';
}
延伸:分支结构
if ... elseif
在elseif语句中只能有一个表达式而true,即在elseif语句中,只能有一个语句块被执行,多个elseif从句是排斥关系。
使用elseif语句有一个基本原则,总优先把范围小的条件放在前面处理。
1
2
3
4
5
6
7
8
9
10
11if(exp1){
}elseif(exp2){
}elseif(exp3){
}elseif(exp4){
}else{
}switch...case...
和if不同的是,switch后面的控制表达式的数据类型只能是整型、浮点型、或者字符串
continue语句作用到switch的作用类似于break,跳出switch外的循环,可以使用continue2
switch…case会生成跳转表 , 直接跳转到对应的case
效率:如果条件比一个简单的比较要复杂的多,或者在一个很多次的循环中,那么使用switch可能会更快
1
2
3
4
5
6
7
8
9
10
switch($var){
case ... :
break;
case ... :
break;
default:
break;
}
思考 : PHP中如何优化多个if…elseif…语句等情况?
答:将可能性较大的条件放到前面
如果判断的内容是比较复杂的内容,且值是整型、浮点、或者字符串,可以使用switch…case…
自定义函数及内部函数
问题:写出如下程序的输出结果 51
1 |
|
涉及知识点:
变量的作用域
变量的作用域也称做变量的范围,变量的范围即它定义的上下文背景(也是它生效的范围)。大部分的php变量只有一个单独的范围。这个单独的范围跨度同样包含include和require引入的文件。
global
引用全局作用域中的变量静态变量
静态变量仅在局部函数域中存在,但当程序执行离开次作用域时,其值并不会消失。
static 关键字
- 仅初始化一次
- 初始化时需要赋值
- 每次执行函数该值会保留
- static修饰的变量是局部的,仅在函数内部有效
- 可以记录函数的调用次数,从而可以在某些条件下终止递归
函数的参数和参数的引用传递
函数的返回值和和引用返回
引用返回 必须在函数声明和指派返回值给一个变量时都使用引用运算符&
1
2
3
4
5
6
7
8function &get_count(){
static $count;
return $count;
}
echo get_count();
$a = &get_count();
$a = 100;
echo get_count();
外部文件导入
include
和require
语句包含并运行指定文件如果给出路径名按照路径来查找,否则从include_path中查找,如果include_path中也没有,则从调用脚本文件所在目录和当前工作目录下寻找
当一个文件被包含是,其中所包含的代码继承了include所在行的变量范围
加载过程中如果没有找到include发出景观 ,require会发出致命错误
_one 会检查文件是否已经被包含过
系统内置的函数
时间日期函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17//时间戳格式化为更易读的日期和时间
date();
//将英文文本日期时间解析为 Unix 时间戳:
strtotime();
//返回一个日期的 UNIX 时间戳。然后使用它来查找该日期的天:
mktime();
//返回当前时间的 Unix 时间戳
time();
//返回当前时间Unix时间戳的微秒数
microtime();
//设置脚本默认时区
date_default_timezone_set();IP处理函数
ip2long
long2ip
打印处理
1
2
3
4
5
6
7print();
print_r();
printf();
echo;
sprintf();
var_dump();
var_export();
序列化和反序列化
serialize()
和unserialize()
字符串处理函数
1
2
3
4
5
6
7
8
9
10implode();
explode();
join();
//字符串反转
strrev();
trim();
ltrim();
strstr();
number_format();
数组处理函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15array_keys();
array_values();
// 差集
array_diff();
//交集
array_intersect();
//并集
array_merge();
array_shift();
array_unshift();
array_pop();
array_push();
array_rand();
//排序
sort();
正则表达式
写出一个验证139手机号的正则表达式
1 | /^139\d{8}$/ |
正则表达式的作用 : 分割、查找、匹配、替换、字符串
分割符 : 正斜线(/),hash符号(#),取反符号 (~)
通用原子: \d \D \w \W \s \S
元字符: . * ? ^ $ + {n} {n,} {n,m} [] () [^] | [-]
模式修正符 : i m e s U x A D u
后向引用
1 | $str = '<b>abc</b>'; |
贪婪模式
1 | $str = '<b>abc</b><b>abc</b>'; |
中文匹配
UTF-8
汉字编码范围为0x4e00-0x9fa5
,在ANSI(gb2312)
环境下,0xb0-0xf7
,0xa1-0xfe
UTF-8
要使用u模式修正符使模式字符串被当成UTF-8,在ANSI(gb2312)环境下,要使用chr将Ascii码转换为字符