一、php基础知识
1.php语言标记 <?php ?>
A 三种标记
<?php ?> <? ?> <?
省略结束标签适合纯PHP文件,如果是PHP与HTML混合开发,则不可省略
B 在html中嵌入纯变量
<?=变量名?>
eg: <?php $a = 3; ?> <input value="<?=$a?>" >
通过在html文件中嵌入php的开启结束标记来开启或关闭php模式。
php标记内的内容由php服务器处理。
2.php变量
A 变量
临时存储值得容器。
非函数内的变量,生命周期为脚本执行完毕。
B 变量的类型
php是弱类型语言,变量或常量的数据类型由上下文指定。
四种标量类型 两种复合类型 两种特殊类型
boolen integer float string array object resouce null
伪类型 便于代码阅读
mixed 一个参数可以接受多种类型,但没必要是所有类型。
numbel 可以是interger float
callback 函数或方法作为参数类型
数据类型的转换
自动类型转换 强制类型转换
~~ isset() 与empty()
isset()用来检测一个变量是否已声明且值不为NULL。
empty()检查一个变量是否为空
C 可变变量
可变变量用于变量名的动态设置和使用。
$hi = 'hello'; $$hi = 'world';
echo “$hi $hello”; echo “$hi ${$hi}”;
D 变量的引用赋值 $a=&$b,$a=$b与$a=10
$a=&$b(起别名)
相当于起别名。$a指向一片内存空间,$b也指向于同一片内存空间。
$a = &(24*7); $a = & test(); 引用赋值都无效,因为都没有名字。
不同于c语言中引用赋值,创建一个属于$a的内存空间,存储$b所在的空间地址。
$a = $b (不立马分配空间)
PHP中将一个变量赋值给新变量时,不会立即为新变量分配内存空间,只是增加了对内存空间的引用。当原变量或者新变量作出任何改变时,才会为新变量 分配一块内存空间。
$a = 10
常量赋值给变量,分配内存空间
3.常量
A 概述
a.先声明常量,再使用常量。define()函数声明,const关键字声明。
define("ABCD",'12345',true); //不区分大小写。
若直接使用ABCD,不加引号,未声明常量,会自动解析成字符串,但是性能慢。
defined("ABCD") //判断是否声明了常量
constant(“常量名”) //获取常量值
get_defined_contstants() //获取脚本中已定义的常量值
b.const定义 const ABCD = "12345";
c.新版本支持表达式定义
B define()与const的区别
a.define() 函数定义 const 关键字定义
b.const是在编译时定义 ,必须处于最顶端的作用区域,不能在函数,循环及if条件中使用;
define()执行时定义,是函数,也就是能调用函数的地方都可以使用
c.const只能用普通的常量名,define常量名中可以有表达式
e.define() 可以设置大小写是否敏感 define不能在类中使用,可用于全局变量
C 预定义常量
PHP_OS 、PHP_VERSION、TRUE、FALSE、NULL、DIRECTORY_SEPARATOR、PATH_SEARATOR、 M_PI、 E_ERROR 、E_WARNING
D 魔术常量
__FILE__ 当前文件名 __LINE__ 当前行号 __FUNCTION__ 当前函数名 __CLASS__ 当前类 __METHOD__ 当前对象的方法名
4.运算符
a.算术运算符
+ - * / % ++ -- **
$a**$b 求幂运算符
b.字符串运算符
. 连接运算符
c.赋值运算符
= += -= *= /= %= .=
d.比较运算符
> < >= <= == === <> != !== <=> ??
$a <=> $b 当 $a < $b 时 -1 当 $a = $b 时 0 当 $a > $b 时 1
$a ?? $b ?? $c 返回第一个不为null的值
$a ?: $b 三目运算符简写 empty($a) ? $a : $b
e.逻辑运算符
&& || ! xor
f.位运算符
& | ^ ~ <<< >>>
g.其他运算符
?: `ls` @
h.运算符的优先级
~~表达式
~~流程控制
二.数组
1.数据概述
数组:存储和操作一组变量。使用数组是为了将多个数组组织成一个单元使用。
使用数组的目的就是将多个相互关联的数组,组织在一起形成集合,座位一个单元使用。
2.数组的分类
索引数组:数组的键值为整数。
关联数组:数组的键值为索引值。
数组声明
$array[$key] = $value;
$array = [$key => $value];
$array = [[$k1=>$v1],[$k2=>$v2]];
数组遍历
for循环遍历:for($i=0;$i<count($array_name);$i++) { $array_name[$i] }
foreach循环遍历:foreach($array as $key=>$value) {}
预定义数组
服务器变量:$_SERVER
环境变量:$_ENV
HTTP GET 变量:$_GET
HTTP POST 变量:$_POST
request 变量:$_REQUEST
HTTP 文件上传变量:$FILES
HTTP Cookies:$_COOKIE
session变量:$_SESSION
gloabl 变量:$GLOBALS
B 操作数组
键/值操作函数
array_values(): 返回数组中所有的元素值
array_keys():返回数组中所有的键值
in_array() array_search() :判断数组中是否存在某元素,返回是否 和 键值。
array_key_exists() :判断数组中是否存在键值。
isset() 判断数组中的键值是否设置了值。null为未设置值,返回false。
$arr = ['1'=> null, '2'=>2] ; isset($arr['1']) false。array_key_exists('1',$arr ); true;
array_filp():键值交换。多个相等的值,覆盖前面。值不为字符串和数字则报错。
array_reverse():数组元素翻转。
统计数组个数和唯一性
count():统计数组元素个数。
array_count_values():统计数组中所有值出现次数
array_unique():去除数组中重复元素。
使用回调函数处理数组的函数
array_filter()
数组根据自定义规则过滤。
array_filter($arr,'myfunction')
循环数组,调用自定义函数,true 返回当前值 false 过滤当前值。
array_walk()
数组自定义规则操作。
myfunction(‘值’,'键','自定义参数')
循环单个数组 返回处理结果
array_map()
多个数组自定义处理。
myfunction($v1,$v2) array_map('myfunction',arr1,arr2)
数组的长度应该相同,回调函数是平行作用已各单元之上的
多个数组循环平行处理
数组的排序函数
sort() rsort():数组按值排序,忽略键值,使用数字索引
ksort() krsort():数组按键排序。
asort() arsort():数组按值排序,保留键值。
natsort() natcasesort():自然排序,数字1~9 字母a~z,忽略键值。 区分大小写与 不区分大小写
usort() uasort() uksort():用户自定义排序。自定义值排序,保留键值,自定义键排序array_multisort():多维数组排序,相似与order by。
拆分、合并、分解和结合数组
array_slice()
按规则截取数组。
offset 正数 从前往后指定位置开始 负数从后往前
length 截取的长度 负数从后往前
是否保留键值
array_splice()
截去指定位置的数组。用新数组替代。
array_combine()
合并两个数组,一个做键值,一个做值
array_merge()
合并两个数组。键名相同,则覆盖。
~~面试题
数字索引对应相应的空间,合并数组时会对空间重新排序,所以不会覆盖。
字符串索引只会对应一个唯一空间,合并数组时会覆盖。
array_merge($arr1, $arr2):合并数组
对于数字索引,重新排序空间,所以不覆盖。对于键值索引,只对应一个空间,所以会覆盖。
$arr1 + $arr2 追加数组
把2中1没有索引键值的数据元素加上去,所以1中原有的,不论数字索引还是键值索引都不覆盖。要想不覆盖用array_merge_recursive(),会以相同键值的对应数组合并。
array_intersect()
两数组取交集
array_diff()
数组取差集
数组与数据结构
array_push()
向数组尾部添加一个或多个参数,返回元素个数
如果仅添加一个参数 可以使用 $array[] = $value
array_pop()
删除数组中的最后一个元素,并返回
array_shift()
删除数组中的第一个元素,并返回
array_unshift()
数组头部添加一个或多个参数,返回元素个数
其他
array_rand():随机选出数组的一个或多个元素,返回键值
shuffle():数组元素重新排序
array_sum():数组求和
range():创建一个包含指范围的元素的数组
数组的运算符号 +
合并数组 后面相同键名的不会影响后面的
unset():取消数组中的任一位置元素,不重建索引
三、函数
函数的定义
定义一个独立的,用于执行特定任务,可以返回一个返回值的代码功能。
函数名 参数列表 函数体(返回值)
函数参数
定义的函数参数为形参。调用的函数参数为形参。
函数的返回值
无返回值,函数执行一个过程,有返回值,返回函数执行结果。
php7增加了对函数返回值类型的声明
function 函数名() : 类型 { 函数体; return 返回值;}
标量类型声明
php5后 对函数的参数加上类型声明,会对不符合预期的参数进行强制类型转换。
php5只能是类名,接口,数组,回调函数。
php7形参类型可以是标量。
对类型的限制php有两种处理模式:强制模式,传入的参数不符合预期的参数类型自动强制转换为指定类型
严格模式:传入的参数不符合预期的参数类型会报错。设置严格模式,需在代码开头处 定义 declare(strict_types = 1)
变量的范围
局部变量
函数内部声明的变量,作用域仅限于函数内部
全局变量
在函数外部定义,作用域未变量定义处开始,到程序文件的末尾。
php中声明的全局变量不能在函数内直接调用,需要使用global() 加载全局变量,或者使用$GLOBAL['全局变量名']。
静态变量
局部变量从存储方式上可分为:动态存储类型和静态存储类型。
内部动态变量在函数执行完后自动释放。如果希望内部变量依然保存在内存中,使用静态变量。
静态变量在函数执行完后,不会消失,而是在所有对该函数的调用之间共享。
使用关键字static 调用
函数的形式
定义一个函数时,考虑函数的功能描述,参数说明,返回值。
常规参数的函数
实参和形参应该个数相等,类型一致。
伪类型参数的函数
声明函数时,不指定参数的类型,每个参数都可以传任意值。
如果参数能够接受多种但不必是所有类型的值,可以使用mixed标记这个参数类型。如果是interger或float,可以使用number标记参数。
除了参数外,函数的返回值也可以根据参数类型的不同,返回不同类型的值。
引用参数的函数
php默认是按值传递参数。在函数内部改变变量的值,不影响函数外部的值。外部的变量与函数的内部变量存储在不同的空间。
要想改变外部的变量的值,则必须通过引用传递参数。把数值或变量的内存存储区块相对地址导入函数之中。参数加&。
参数加&,调用函数时必须传递一个变量给这个参数,不能传递一个值。
默认参数的函数
在声明函数时,给函数的参数指定默认值。在调用函数时,如果没有指定参数的值,会使用参数的默认值。
默认值必须是常量表达式,数组,null,不能是变量,类成员或者函数调用。
可变个数参数的函数
使用默认参数适用于实参个数少于形参的情况,当实参个数多于形参,可以用可变参数列表。即希望函数可以接受任意数量的参数。
func_get_args(); 调用函数时,函数内部用 $args = func_get_args();接收传递的个数。func_get_args()接收一个数字,返回指定的参数。
php5.6后,可以不依赖func_get_args()函数,使用“...”运算符来实现变长参数的函数。
function sum( ...$ints) {} 传递不同个数的参数 调用函数
function sum(int ...$ints) {} 传递指定类型不同个数的参数 调用函数
在调用函数时,使用‘...’可将数组和可遍历对象展开为函数参数。
$arr = [2,3,4] add(1, ...$arr); 将数组中的成员分别传给对应的参数。
参数类型也可以为空,当启用这个特性,传入的参数类型要么是给定的类型,要么是null。在类型前加一个问号 “?”
function fun(?string $str){} fun('123'); fun(null); 没问题 fun();报错
回调函数
回调函数即调用函数时,并不是传递一个标准的变量作为参数,而是将另一个函数作为参数传递到调用的参数中。
参数的类型为 callback。
为什么要传函数作为参数?参数的传递可以改变调用函数的执行行为。值传递给函数的功能有限,使用函数作为参数传递,增加了函数功能的扩展。
如何声明和使用回调函数?
1.变量函数
将函数名作为值赋给变量。 $变量名(); 调用函数。
变量函数不能用于语言结构,如echo() print() unset() isset() empty() include() require()
2.使用变量函数声明和应用回调函数
参数传递 定义的回调函数名字符串, 函数内部使用变量函数执行。
3.借助call_user_func_array()函数自定义回调函数
call_user_func_array(“定义的函数”,[定义函数要传的参数列表]) 函数为全局函数
4.类静态函数和对象方法回调
将一个类的静态方法或对象中的一个成员方法作为回调函数
call_user_func_array(['类名称',“类中静态方法名”],[定义函数要传的参数列表])
call_user_func_array([对象引用,“对象中的方法名”],[定义函数要传的参数列表])
递归函数
在函数体内直接或间接的调用自己。
使用自定义函数库
将多个自定义的函数组织到一个或多个文件中,这些收集函数定义的文件就是创建的php函数库。
如果在php的脚本中使用这些西丁一函数,需要使用include() include_once() require() require_once()
require() 在脚本运行时,首先引入指定文件;include() 运行到该语句所在位置时,才引入指定文件。
once 如果脚本中已经包含了指定文件 则不会再引入。
不是真正的函数,属于语言结构。 require "1.txt" 代码语句的一种写法。 如 echo(123) => echo "123";
匿名函数和闭包
临时创建一个没有指定名称的函数。常用作回调函数参数的值。也可以作为变量的值来使用。
使用use 来连接闭包函数和外界的变量。