PHP
- 需要了解的一些概念
- PHP基础知识点
- 函数基本知识
- 默认值:define value
- 引用传递(与C语言中指针类比)
- 函数返回值return
- 常用系统函数
- 可变函数
- 匿名函数
- 字符串相关函数
- 数组的相关函数
- 文件
- 作用域
- 静态变量static
- 伪类型
- 错误处理
- 字符串语法
- 字符串转义
- 字符串长度
- 数组定义语法
- PHP数组特点
- 多维数组
- 遍历数组
需要了解的一些概念
- PHP定义:服务器端的脚本编程语言,书写动态生成的网页。
- 服务器:提供服务的机器,取决于机器上所安装的软件。
- IP:网络之间的互联协议。
- 域名:由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称。目的是便于记忆和沟通的一组服务器的地址。
- DNS:将域名和IP地址相互映射的一个分布式数据库。
- web程序的基本访问流程:浏览器发起访问——DNS解析域名找到IP地址——服务器电脑——通过端口找到服务软件。
静态网站访问:
动态网站访问比静态网站访问多:服务器端解析、数据库。
- 内存中的几个分区:
栈区:程序中可以操作的内存部分(不存数据,只运行程序代码);少但快。
代码段:存储程序的内存部分(不执行)
数据段:存储普通数据(全局区与静态区)
堆区:存储复杂数据,大但效率低。
- 函数执行的内存分析:
①读取代码进入到代码段(编译:将代码编程字节码存储到内存)
②根据代码逐步执行
③编译和执行是分开的
PHP基础知识点
- PHP代码标记:在标记里写PHP代码
ASP标记:<&php代码&>
短标记:
脚本标记:< script language=“php”>php代码< /script>
标准代码(常用):
- PHP注释
行注释://、#
块注释:/* */
- 语句分隔符为分号“;”
PHP中标记结束符?>有自带语句结束符的效果,最后一行可没有分号
通常代码最后不建议写?>,而是直接分号结束就可
- 变量
·命名规则:定义变量时不需要任何关键字,但需要在前面添加 $;可用中文命名;其他规则与C类似。
·删除变量:使用unset(变量名字)。为了把它所占用的内存释放掉。
·变量分类:
①预定义变量:即系统定义的变量;此变量都是数组。
$_ GET:获取所有表单以get方式提交的数据;
$_ POST:以POST方式提交的数据都会保存在此;
$_ REQUEST:GET和POST提交的数据都会保存;
$_ SERVER:服务器信息;
$_ SESSION:session会话数据;
$_ COOKIE:cookie会话数据;
$GLOBALS:PHP中所有的全局变量;
$_ FILES:用户上传的文件信息;
$_ ENV:环境信息;
②可变变量(类似C里的指针):如果一个变量保存的值刚好是另外一个变量的名字,可直接通过访问一个变量得到另一个变量的值:在变量前面再多加一个 $符号。C语言是指向地址,PHP是指向变量名。
eg:
$a='b';
$b='bb';
echo $$a;
③变量传值:即将一个变量赋值给另一个变量。包括值传递与引用传递(指针)。
- 常量
·命名规则:前面不要加$符号;通常以大写字母为主;可以使用一些特殊字符,但只能使用define定义。
·定义常量:define(‘常量名’,常量值); 或者 **const 常量名=值;**这两定义的区别是访问权限。
针对以特殊字符定义的常量,需要使用访问常量的函数:constant(‘变量名’);
·常量分类:
①系统常量:
PHP_VERSION:PHP版本号
PHP_INT_SIZE:整型所占用的字节数
PHP_INT_MAX整型能表示的最大值
②魔术常量:一些特殊的常量,由 双下划线+常量名+双下划线 组成。值会跟着环境变化,用户改变不了。
_ _ DIR_ _ :当前被执行的脚本所在电脑的绝对路径
_ _ FILE_ _ :当前被执行的脚本锁在电脑的绝对路径(带自己文件的名字)
_ _ LINE_ _ :当前所属的行数
_ _ NAMESPACE_ _ :当前所属的命名空间
_ _ CLASS_ _ :当前所属的类
_ _ METHOD_ _ :当前所属的方法
- 数据类型
指存储的数据本身的类型,不是变量的类型,PHP是一种弱类型语言,变量本身没有数据类型。
分类
①整型:int/integer,占四个字节,表示整数类型
②浮点型:float/double,八个字节,表示小数或整型存不下的整数
③字符串型:string,根据实际长度分配,表示字符串,注意引号
④布尔类型:bool/boolean,只有两个值:ture和false
⑤对象类型:object,存放对象(面向对象)
⑥数组类型:一次性储存多个数据
⑦资源类型:resourse,储存资源数据(PHP外部数据,eg数据库,文件)
⑧空类型:只有一个值NULL,不能运算
类型转换
·转换方式:自动转换和强制(手动)转换
·在转换过程中,用的比较多的是转布尔类型(判断)和转数值类型(算术运算)
·其他类型转数值说明:
①布尔ture为1,false为0;
②以字母开头的字符串永远为0;
③以数字开头的字符串,取到碰见字符串为止,且不会同时包含两个小数点
PHP类型比较表
类型判断
·通过 类型判断函数,如is_开头后面跟类型名字的函数:is_变量类型A(变量名B);若B为A型变量,返回为ture;否则,返回为false;
·bool类型不能用echo来查看,可以使用**var_dump(变量1,变量2,…)**查看。最后会返回bool(ture)或boor(false)
·gettype(变量名):获取数据,得到的是该类型对应的字符串。
·settype(变量名A,数据类型B):设定数据类型,将A数据本身,转换为B类型变量;而强制转换处理完后,不改变原来的类型。
·empty():判断数据的值是否为空,如果为空返回true,否则返回false
·isset():判断数据存储的变量本身是否存在,存在变量返回true,不存在返回false
- 运算符
- 赋值运算符:=
- 算术运算符:+、-、* 、/、%
- 比较运算符:>、>=、<、<=、= =(大小相同)、!=、= = =(全等于,大小类型都要相同)、!= =
- 逻辑运算符:&&、||、!
- 连接运算符:将多个字符串拼接的一种符号
- . 点:将两个字符串连接到一起
- . =:复合运算,将左边的内容与右边的内容连接起来,然后重新赋值给左边
- 错误抑制符:@:在可能出错的表达式前面使用(通常在生产环境会用到)
- 三目运算符:(A= B ?C:)
- 自操作运算符:++、- -、+=、-=、*=、/=、%=
- 位运算符:&、|、~、^、<<、>>
- 分支结构
- 循环结构
- for循环:同C语言
- while循环:同C语言
- do-while循环:同C语言
- 循环控制:continue,break
- 流程控制替代语法
分支和循环结构的替代语法。PHP应该在HTML中只做数据输出,输出通常伴有条件判断和循环操作,因此PHP提供了对应的分支结构和循环结构的替代语法。
左大括号{ →:冒号替代
右大括号} →end+对应的起始标记替代;
函数基本知识
- 基本语法:function函数名(参数){ 函数体/返回值 }
- 函数是在代码执行阶段碰到函数名字的时候才会调用,不是在编译阶段
- 函数调用的特点:只要在系统内能找到对应的函数就可执行;函数的调用可在函数定义执行之前。
详细原因参考PHP基础(一)中的函数执行的内存分析。
function display()
{
echo 'hello world';
}
display();
- 函数命名规则:同C语言
①驼峰法:除了左边第一个单词外,后面单词首字母都大写
②下划线法:单词之间通过下划线连接,单词都是小写
默认值:define value
- 指的是形参的默认值;在函数定义的时候,就给形参进行一个初始赋值,如果实际调用传入的参数没有提供,那么形参就会使用定义时的值来进入函数内部参与运算。
- 只要有一个形参赋默认值,后面跟着的形参都得赋默认值,否则会报错。
引用传递(与C语言中指针类比)
- 有时要在函数内部拿到外部的数据,能够在函数内部改变,那么就需要在函数定义时明确告知函数,函数才会在调用时主动获取外部数据的内存地址。这种定义形式参数的方式叫引用传值。
- 基本定义语法:function函数名(形参){函数体}
- 在调用的时候必须引用传值的参数位置传入实际参数,而且参数本身必须是变量,不可以直接传入数值
function display($a,&$b){
$a = $a * $a;
$b = $b * $b;
echo $a,'
',$b,'
';
}
$a = 10;
$b = 5;
display($a,$b);
echo '
',$a,'
',$b;
函数返回值return
- 在PHP中所有的函数都有返回值,如后没有明确return使用,系统默认返回NULL。
- return可在文件中直接使用:代表文件将结果(return后面跟的内容)转交给包含当前文件的位置。(在系统配置文件中使用较多);
- return之后的内容不会执行
- 若要查看return的结果可使用var_dump函数
常用系统函数
- 有关输出函数
print():类似于echo输出提供内容,本质是一种结构,返回1,可以不需要使用括号。
print_r():类似于var_dump,但是比var_dump简单,不会输出数据类型,只会输出值(经常用于数组打印)
echo print('hello world
');
print 'hello world';
$a='hello world';
print_r($a);
- 有关时间的函数
date():按照指定格式对对应的时间戳
time(void):获取当前时间对对应的时间戳
microtime():获取为面积比别的时间
strtotime():可把所有英文格式的字符串转换成时间戳
echo date('a年b月c日 A:B:C',12345678),'
';
echo time(),'
';
echo microtime(),'
';
echo strtotime('tomorrow 10 hours');
- 有关数学的函数
max():最大值
min():最小值
rand():得到指定区间的随机整数
mt_rand:与rand一样,只是底层结构不一样,效率比rand高
round():四舍五入
ceil():向上取整
floor():向下取整
pow():求指定数字的指定指数次的结果。eg:pow(2,8)= = 2^8 = =256
abs():绝对值
sqrt():平方根
- 有关函数的函数
function_exists():判断指定的函数名字是否在内存中存在
func_get_arg():在自定义函数中去获取指定数值对应的参数
func_get_args():在自定义函数中获取所有的参数(数组)
func_num_args():获取当前自定义函数的参数数量
可变函数
- 当前有一个变量所保存的值 刚好是一个函数名,则使用 变量() 来充当函数名使用。
function display(){
echo __FUNCTION__;
}
$func = 'display';
$func();
- 若需要用户在外部定义一个自定义函数,然后传入到系统函数内部使用,即可使用可变函数
- 将一个用户定义的函数传入给另一个函数(函数名)去使用的过程叫回调过程;被传入的函数叫回调函数。
function sys_function($arg1,$arg2){
return $arg1($arg2);
}
function user_function($num){
return $num * $num * $num * $num;
}
echo sys_function('user_function',10);
匿名函数
- 匿名函数即没有名字的函数。本质得到的是一个对象(closure)。
- 基本语法:变量名=function(){函数体};
- 闭包(closure):use(变量名)
use是将外部变量保留给内部使用
function display(){
$name = __FUNCTION__;
$innerfunction = function() use($name){
echo $name;
}
$innerfunction();
}
display();
字符串相关函数
- 转换函数
- implode(连接方式,数组):将数组中的元素按照某个规则连接成一个字符串
- explode(分割字符,目标字符串):将字符串按照某个格式进行分割,变成数组
- str_split(字符串,字符串长度):按照指定长度拆分字符串得到数组
- 截取函数
- trim(字符串[,指定字符]):本身默认是用来去除字符串两边的空格(中间不行),但是也可以指定要去除的内容,是按照指定的内容循环去除两边有的内容:直到碰到一个不是目标字符为止
- ltrim():去除左边的
- rtrim():去除右边的
- 截取函数
- substr(字符串,起始位置从0开始[,长度]):指定位置开始截取字符串,可以截取指定长度(不指定到最后)
- strstr(字符串,匹配字符):从指定位置开始,截取到最后(可以用来取文件后缀名)
- 大小转换函数
- strtolower:全部小写
- strtoupper:全部大写
- ucfirst:首字母大写
- 查找函数
- strpos(字符串,匹配字符):判断字符在目标字符串中出现的位置(首次)
- strrpos(字符串,匹配字符):判断字符在目标字符串中最后出现的位置
- 格式化函数
- srintf/sprintf(输出字符串有占位符,顺序占位内容…):格式化输出数据
- 其他
- str_repeat():重复某个字符串N次
- str_shuffle():随机打乱字符串
数组的相关函数
- 排序函数:对数组元素进行排序,都是按ascll码进行排序,可以进行英文比较
- sort():顺序排序(下标重排):$变量 = sort( $变量)
- rsort():逆序排序(下标重排)
- asort():顺序排序(下标保持不变)
- arsort():逆序排序(下标保持不变)
- ksort():顺序排序(按照键名下标)
- krsort():逆序排序(按照键名下标)
- shuffle():随机打乱数组元素
- 指针函数
- reset():重置指针,将数组指针回到首位
- end():重置指针,将数组指针指到最后一个元素
- next():指针下移,取得下一个元素的值
- prev():指针上移,取得上一个元素的值
- current():获取当前指针对应的元素值
- key():获取当前指针对应的下标值
- 其他函数
- count():统计数组中元素的数量
- array_push():往数组中加入一个元素(数组后面)
- array_pop():从数组中取出一个元素(数组后面)
- array_shift():从数组中取出一个元素(数组前面)
- array_unshift():从数组中加入一个元素(数组前面)
- array_reverse():数组元素反过来
- in_array():判断一个元素在数组中是否存在
- array_keys():获取一个数组的所有下标,返回一个索引数组
- array_values():获取一个数组的所有值,返回一个索引数组
文件
- 文件加载原理:
- 在文件加载(include或require)的时候,系统会自动将包含文件中的代码嵌入到当前文件中。
- 加载位置:对应的文件中的代码嵌入位置就是对应的include位置。
- 被包含的文件是单独进行编译的。
- include和include_once的区别:
include:系统碰到一次执行一次;如果对同一个文件进行多次加载,那么系统会执行多次。
include_once:系统碰到多次时,只会执行一次。
- include和require的区别:报错形式不同
include错误时,不会影响之后的代码执行
require错误时,之后代码不再执行
- 文件加载路径:文件在加载时需要指定文件路径才能保证正确找到对应的文件
- 绝对路径:
- 从磁盘的根目录开始(本地绝对路径):
Windows:盘符C:/路径/PHP文件
Linux:/路径/PHP文件
- 从网站的根目录开始(网络绝对路径):
/:相对于网站主机名字对应的路径
- 相对路径:
./:表示当前文件夹
. ./:上级目录(当前文件夹上一层的文件夹)
- 绝对路径和相对路径的加载区别
绝对路径相对效率偏低,但是相对安全,路径不会出问题
相对路径相对效率高一些,但是容易出错,相对路径会发生改变
- 文件嵌套包含 文件与文件之间的包含
很容易出现相对路径出错的问题,因为相对路径会因为文件的包含而改变(./和. ./)
作用域
- 变量(常量)能够被访问的区域
- 分类:
①全局变量:用户普通定义的变量(函数外部定义)。理论上 函数内部不可访问
②局部变量:函数内部定义的变量。在当前函数内部使用。
③超全局变量:系统定义的变量(预定义变量详细请看PHP基础(一)中的变量分类)没有访问限制。
- 实现全局及局部互相访问的方法:
①函数内部使用外部变量:使用$GLOBALS或通过参数传值
②使用global关键字:
- (在函数里定义变量的一种方式)若使用global在外部存在,则内部与外部相当于指向同一变量;若外部不存在,系统会自动在全局外部定义一个与局部变量同名的全局变量。
- 本质形式:在函数的内部和外部对一个同名变量(全局和局部)使用同一块内存地址保存数据,从而实现相互访问
- 基本语法:global 变量名;(不能赋值) 变量名 = 值;(修改)
$global = 'global area';
function display(){
$inner = __FUNCTION__;
global $global;
echo $golbal;
global $local;
$local = 'inner';
}
display();
echo $local;
静态变量static
- 在函数内部定义的变量,使用static关键字修饰,用来实现跨函数共享数据(同一个函数被多次调用)的变量。
- 函数在多次调用的时候,会跳过static这一行。
- 函数运行结束后,所有局部变量都会清空,若重新运行一下函数,所有的局部变量又会重新初始化。
- 基本语法:function函数名(){ static $变量名 = 值;}
function display(){
$local = 1;
static $count = 1;
echo $local++,$count++,'
';
}
display();
display();
display();
- 静态变量的使用:
①为了统计当前函数被调用的次数
②为了统筹函数多次调用得到的不同结果(递归思想)
伪类型
- 假类型;实际上在PHP中不存在的类型。但是通过伪类型可以帮助程序员去更好的查看操作手册
- 分类:
- mixed:混合的,可以是多种PHP中的数据类型。
- number:数值的,可以是任意数值类型。
错误处理
- 定义:指系统在对某些代码进行执行的时候,发现有错误就会通过错误处理的形式告知程序员
- 错误分类:语法错误(parse error)、运行时错误(running error)、逻辑错误
- 错误代号:由一个字节存储,每一种错误占据一个对应的位,可是用位运算进行错误控制
- 系统错误
E_PARSE:编译错误,代码不会执行
E_ERROR:fatal error,致命错误,会导致代码不能正常继续执行,在出错位置断掉
E_WARNING:警告错误,不会影响代码执行,但是可能得到错误结果
E_NOTICE:通知错误,不会影响代码执行
- 用户错误:用户在使用自定义错误触发的时候,会使用到的错误代号。
E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE
- 其他:E_ALL,代表所有错误,在进行错误控制的时候使用比较多
- 错误触发:程序运行时触发、人为触发 使用trigger_errors(错误提示)函数
字符串语法
- 单引号双引号:比较适合定义没有结构要求的字符串
- nowdoc字符串:没有单引号的单引号字符串
$str = <<<‘边界符’(后面不允许出现任何内容,包括空格和注释)
字符串内容(边界符里的所有内容都会当做字符串全部输出)
边界符;(必须顶格,后面不允许出现任何内容)
- heredoc字符串:没有双引号的双引号字符串
$str = <<<边界符(后面不允许出现任何内容,包括空格和注释)
字符串内容(不需要分号)
边界符;(必须顶格,后面不允许出现任何内容)
- nowdoc与heredoc与引号相比,不会改变其输出结构
字符串转义
- 单引号双引号的区别
- 在单引号中能够识别 ’ ,在双引号中不能识别
- 双引号中因为能够识别$符号,所以双引号可以解析变量,而单引号不可以
- 双引号中变量识别的规则
- 保证变量的独立性,不要让系统难以区分
- 使用{}大括号
字符串长度
- 基本函数strlen():中文占三个字节
- 多字节字符串扩展模块:mbsreing扩展
- 字符串相关函数
数组定义语法
- 使用array关键字:(最常用)
$变量 = array(元素1,元素2,元素3……);
- 使用中括号包裹数据:
$变量 = [元素1,元素2,……];
- 隐形定义数组:
$变量[] = 值;
$变量[下标] = 值;
PHP数组特点
- 可以整数下标或字符串下标
如果数组下标都为整数:索引数组
如果数组下表都为字符串:关联数组
- 不同下标可以混合存在:混合数组
- 数组元素的顺序以放入顺序为准,跟下标无关
- 数组下标的自增长特性
- 特殊值下标的自动转换
- PHP中的数组元素没有类型限制,没有长度限制
- PHP中数组是很大的数据,所以存储位置是堆区,为当前数组分配一块连续的内存
多维数组
直接看例子
$info = array(
array('name' => 'Jim','age' => 30),
array('name' => 'Tom','age' => 28),
array('name' => 'Lily','age' => 20)
);
echo '
';
print_r($info);
遍历数组
- foreach遍历语法
foreach($数组变量 as [ $下标 => ] $值){
//通过 $下标或值访问元素的下标或值;
}
通常如果是关联数组(字母下标),就需要下标;如果是数字下标就直接访问值
$arr = array(1,2,3,4,5,6,7,8,9,10);
foreach($arr as $k => $v){
echo 'key:',$k,'== value:',$v,'
';
}
- while配合each和list遍历数组
- each函数使用:each能够从一个数组中获取当前数组指针所指向的元素的下标和值,拿到之后将数组指针下移,同时将拿到的元素下标和值以一个四个元素的数组返回:
0下标 - > 取的元素的下标值
1下标 - > 取得元素的值
key下标 - > 取的元素的下标值
value下标 - > 取得元素的值
$arr = array(1,'name' => 'Tom',3,'age' => 30);
echo '
';
print_r(each($arr));
print_r(each($arr));
print_r(each($arr));
print_r(each($arr));
print_r(each($arr));
- list函数使用:list是一种结构,不是一种函数(没有返回值),list提供一堆变量去从一个数组中取得元素值,然后依次存放到对应的变量当中;list必须从索引数组中去获取数组,而且必须从0开始。
- list(变量1,变量2……)=each(数组)//是一种赋值运算,但整个表达式可以得到false结果(each是取不到正确结果的)
$arr =array(1,'name' => 'Tom',3,'age' => 30);
while(list($key,$value) = each($arr)){
echo 'key is :' . $key . ' value is :' . $value . '
';
}