Welcome 微信登录

首页 / 网页编程 / PHP / 两千行代码的PHP学习笔记汇总

本文汇总了PHP学习中常见的各类问题,约有两千多行代码,都是非常实用的技巧。分享给大家供大家参考。具体如下:
//语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出。/* 【命名规则】 */常量名 类常量建议全大写,单词间用下划线分隔// MIN_WIDTH变量名建议用下划线方式分隔// $var_name函数名建议用驼峰命名法// varName定界符建议全大写 // <<<DING, <<<"DING"文件名建议全小写和下划线、数字// func_name.php私有属性名、方法名建议加下划线// private $_name _func接口名建议加I_// interface I_Name/* 语言结构 */array(), echo(), empty(), eval(), exit(), isset(), list(), print(), unset()echo, print 可省略括号。/* 预定义常量 */PATH_SEPARATOR //路径分隔符(Windows为分号,类Unix为冒号)DIRECTORY_SEPARATOR //目录分隔符PHP_EOL //当前系统的换行符PHP_VERSION //PHP版本号PHP_OS //PHP服务操作系统PHP_SAPI//用来判断是使用命令行还是浏览器执行的,如果 PHP_SAPI=="cli" 表示是在命令行下执行PHP_INT_MAXINT最大值,32位平台时值为2147483647PHP_INT_SIZEINT字长,32位平台时值为4(4字节)M_PI//圆周率值M_E //自然数//PHP运行环境检测函数php_sapi_name() //返回一个PHP与WEB服务器接口类型的小写字符串该函数返回值与常量PHP_SAPI一致!接口类型:SAPI(the Server API, SAPI)可能值:aolserver、apache、apache2filter、apache2handler、caudium、cgi、cgi-fcgi、cli、 continuity、embed、isapi、litespeed milter、nsapi、phttpd、pi3web、roxen、thttpd、tux、webjames/* 大小写问题 */- 类名、方法名、属性名、函数名:不区分大小写- 变量名、常量名、元素下标:区分大小写/* 可变标识符 */可变变量 $i = 3; $k = "i"; echo $$k; //输出3可变函数 function func() {echo "hello!";} $i = "func"; $i(); //输出hello可变下标 $i = "1234"; $k = 3; echo $i[$k];//输出4可变类名 class CLS{public $k = "hello";} $i = "CLS"; $j = new $i; echo $j->k;可变属性 class CLS{public $k = "hello";} $i = "k"; $j = new CLS; echo $j->$i;可变方法 class CLS{public function k(){echo "hello";}} $i="k"; $j=new CLS; $j->$i();/* 可变变量 */* 用于业务逻辑判断得到某些具体信息$var_name = "class_name";$$var_name = "PHP0913";// $class_name = "PHP0913";$class_name已存入内存中var_dump($class_name);// var_dump($$var_name);/* 变量函数 */get_defined_vars//返回由所有已定义变量所组成的数组(包括环境变量、服务器变量和用户定义的变量)/* unset() */* unset()仅删除当前变量名和引用,其值并未被删除* 引用传递中,删除一个变量及其引用,其他变量及引用均存在,且值依然存在 echo "<br />";$v3 = "值";$v4 = &$v3;unset($v4);var_dump($v3, $v4);/* 变量的最长有效期 */* 当前脚本的执行周期,脚本执行结束,变量即消失/* 预定义变量/超全局变量 */$GLOBALS$_COOKIE$_ENV$_FILES$_GET$_POST$_REQUEST$_SERVER$_SESSION/* 常量定义 */define(常量名, 常量值, [区分大小写参数])//true表示不区分/false表示区分大小写const 常量名 = 常量值// 新,建议常量名可以使用特殊字符constant($name)// 获取常量名// 例:echo constant("-_-");/* 常量相关函数 */definedget_defined_constants/* 预定义常量 */__FILE__所在文件的绝对路径__LINE__文件中的当前行号__DIR__文件所在目录__FUNCTION__函数名称__CLASS__类的名称__METHOD__类的方法名__NAMESPACE__当前命名空间的名称/* 整型 */整型占用4字节,共4*8=32位,最大值为2147483647,最小值为-2147483648,最小值的绝对值比最大值的大1最高为表示正负,1表示负,0表示正/* 进制转换函数 */只能十进制与其他进制进行转换,只有六种转换时,参数应是字符串(即不可含八进制的“0”或十六进制的“0x”)dec bin octhexhexdec()十六进制转十进制也可写hex2dec()dechex()十进制转十六进制也可写dec2hex()bindec()二进制转十进制也可写bin2dec()decbin()十进制转二进制也可写dex2bin()octdec()八进制转十进制也可写oct2dec()decoct()十进制转八进制也可写dec2oct()/* 浮点数 */浮点数不能比较大小 !!!几乎所有小数,在保存时都是近似值而不是精确值!最大值:+/- 1.8E308PHP所能保存的最长小数位:14位/* 单引号字符串 */单引号字符串中,只能转义反斜杠和单引号/* 双引号字符串 */只解析字符串一次 !!!eval 把字符串作为PHP代码执行大括号包裹变量,可确定变量名界限。如:"aaa{$bbb}ccc"双引号中可以将ASCII码转换为字符"x61" -> a// 字符串中不需0,整型中才是0x前导"x49x54x43x41x53x54" -> ITCAST将ASCII转成字符函数chr()将字符转成ASCII函数ord()#双引号转义列表
 换行
 回车	 水平制表符\ 反斜线$ 美元标记v 垂直制表符e Escapef 换页" 双引号"[0-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符 x[0-9A-Fa-f]{1,2} 符合该正则表达式序列的是一个以十六进制方式来表达的字符 /* 定界符 */herodoc - 功能同双引号,能解析$str = <<<AAA字符串内容AAA;nowdoc - 功能同单引号,不能解析只在开始位置有单引号$str = <<<"AAA"字符串内容AAA;/* 字符串的使用 */可将字符串当作一个字符的集合来使用,可独立访问每个字符。仅适用于单字节字符(字母、数字、半角标点符号),像中文等不可用$str = "abcd";echo $str[3];// decho $str{0};// a/* 【类型操作函数】 *///获取/设置类型gettype($var) //获取变量的数据类型settype($var, $type) //设置变量的数据类型//类型判断is_intis_floatis_nullis_stringis_resourceis_arrayis_boolis_objectis_numeric 检测变量是否为数字或数字字符串//转换成指定的数据类型boolvalfloatvalintvalstrval//强制转换类型(int)(float)(string)(bool)(array)(object)(unset) //转换为NULL(binary) 转换和 b前缀转换 //转换成二进制var_dump打印变量的相关信息。显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。var_export($var [,bool $return]) //输出或返回一个变量的字符串表示$return:为true,则返回变量执行后的结果print_r 打印关于变量的易于理解的信息empty检查一个变量是否为空isset检测变量是否存在/* 【流程控制】 *///if语句的替代语法if (条件判断) :语句块;elseif (条件判断) :语句块;else :语句块;endif;//流程控制的替代语法在嵌入HTML时常用将 { 换成 : , 将 } 换成 endif; 等endifendwhileendforendforeachendswitch/* 【switch】 */switch (条件) {case 状态值1:语句块;[break;]case 状态值2:语句块;[break;]case 状态值3:case 状态值4:语句块;[break;]default:语句块;[break;]}switch是状态分支,特殊的循环先计算出状态值,再去与判断数作比较break退出流程/* 【for循环】 */for (条件初始化表达式; 条件判断表达式; 条件变化表达式) {循环体}假设循环体被执行了N次,则条件初始化表达式被执行1次条件判断表达式被执行N+1次条件变化表达式被执行N次注意:1. 循环变量在for语句结束后还可以继续使用,值为第一次失败的值2. 循环变量在for循环体内可以使用3. 任何条件表达式均可省略,但分号不能省略a. 条件初始化表达式被省略时,循环变量被赋值为null,在与条件判断时,进行类型转换后再比较。也可以在for语句外进行初始化。b. 条件判断表达式被省略时,表示循环为真,进入死循环c. 条件变化表达式被省略时,可以在循环体内完成4. 每个表达式均可由多条语句组成,每条语句之间使用逗号分割如果条件判断表达式由多条语句组成,都会执行,但只有最后一条语句才作为判断条件5. for只能遍历数值型索引下标数组数组长度函数:count()6. 应该将可以初始化的语句均放在条件初始化表达式内,这样可以省去很多执行次数/* 【goto】5.3+ 版本 */用来跳转到程序中的某一指定位置该目标位置可以用目标名称 加上冒号来标记。PHP中的goto有一定限制,只能在同一个文件和作用域中跳转,也就是说你无法跳出一个函数或类方法,也无法跳入到另一个函数。你也无法跳入到任何循环或者switch结构中。常见的用法是用来跳出循环或者switch,可以代替多层的break。 可以从循环(switch)中跳出来,但不能从外部跳转进去。而函数或类方法,向外向内均不可。goto a;echo "Foo";a:echo "Bar";/* 【文件加载】 */require / include / require_once / include_once文件载入只是载入目标文件内的代码并执行,与载入的文件类型无关文件载入属于执行阶段,当执行到require等语句时,才载入该文件的代码,编译并执行,然后回到require等语句位置继续执行下面的语句【注意】在载入开始时,先退出PHP模式;再载入目标文件代码,执行该代码;结束时,再进入PHP模式。require:处理失败,产生 E_COMPILE_ERROR 错误,脚本中止。include:处理失败,产生 E_WARNING 错误,脚本继续执行。#不建议使用require_once/include_once/* 【相对路径】 */当前浏览器请求的哪个脚本,当前位置就是属于哪个脚本。./file 和 file 都表示当前目录下的file文件file情况(嵌套载入文件时):如果当前目录没找到该文件就在代码文件所在目录中继续找。如果当前目录找到有该文件,则不会再在代码文件所在目录去找也不会再加载。__DIR__ 脚本文件所在目录__FILE__脚本文件路径include_path加载文件查找目录set_include_path() 设置include_path,可多个,用字符串作参数该函数设置的path只针对该当前文件有效该设置只针对查找未直接写文件路径方式有效设置新的include_path会覆盖原来的get_include_path() 获取当前include_path设置项,无参数路径分隔符,在Windows下是分号,在Linux下是冒号利用预定义常量 PATH_SEPARATOR 来获得当前的分隔符如果直接写文件名:1. include_path所设置的2. 当前目录3. 代码所在文件的目录如果文件名前带有路径,则会直接根据路径查找,include_path直接被忽略/* 【return】 */return与require结合,可返回文件的内容,return写在被载入的文件内return可以终止所在脚本的执行,作为普通脚本语句return可以返回函数的相应值/* 【终止和延迟脚本执行】 */die / exit终止return是终止所在脚本的执行die和exit会立即终止脚本执行die("到此为止"); 该函数内的字符串可被输出sleep() 延迟(单位:秒)默认最多可延迟30秒,PHP配置可以修改 max_execution_time例:sleep(12);usleep()以指定的微秒数延迟执行time_sleep_until使脚本睡眠到指定的时间为止/* 【函数】 */1. 函数的声明是在编译时,故先定义再调用,定义与调用无先后关系!2. 文件只是代码的载体,程序均在内存中执行!3. 如果函数的定义在需要载入的文件内,则需要先载入该文件,否则调用出错!4. 函数的定义可以出现在其他的代码段中,此时函数不会在编译阶段被执行只有被执行到时才会被定义!只有独立定义时才会被编译在内存中!如果出现在其他函数体内,也需要外层函数被调用时才被定义并生效!5. 函数名不区分大小写6. 不允许重名,包括系统函数7. 【可变函数】函数名可以用其他变量代替$func_name = "sayHello";$func_name();//此时调用sayHello()函数注意:只有在调用时才能使用变量,定义时不允许!8. 变量可作为函数名调用函数,数组元素值也可以!9. 形式参数parameter,实际参数argument可以对参数传递 null,表示该形参不想传递值形参与实参之间既可值传递,也可引用传递。引用传递参数,应该在定义函数时就在形式参数前加上 & 符号,而此时调用函数实参必须为变量如何选择使用哪种传递方式?a. 是否需要保证原始数据的完整性b. 是否需要增加效率c. 对大数据引用传递可节省内存10. 参数默认值a. 函数的参数默认值必须是已经确定的值,不能是变量!只要在调用之前定义该常量,则可以使用常量作为参数默认值b. 函数默认值可以有多个,建议将有默认值的参数放在参数列表的最后面这样可以在调用函数时,不赋予后面有默认值的参数值,否则会出错c. 默认参数可以是非标量类型,比如数组、nulld. 任何默认参数必须放在任何非默认参数的右侧11. 参数数量a. 形参数量多于实参数量报告警告级别错误,并以NULL代替b. 实参多于形参不报告错误,依次为形参赋值c. 不确定参数数量1) 一个形参都不定义,永远都是实参多于形参2) 【可变数量参数】func_get_args() 获取当前函数被调用时所有实参的值,返回一个所有实参值组成的数组func_get_arg() 获取某个实参的值,通过索引值标识,e.g: func_get_arg(0)func_num_args() 获取所有实参的数量12. 【return】返回值a. 函数只有一个返回值,可以通过返回一个数组来得到类似的结果,但可以有多条return语句b. return语句会立即中止函数的运行,并将控制权交回调用该函数的代码行c. 可以返回包括数组和对象的任意类型d. 函数的返回也分值传递和引用传递(返回的是一个变量才可)1) 默认是值传递方式2) 引用传递方式:- 定义函数时,函数名前加上& 表示该函数可以返回引用- 调用函数时,函数名前加上& 表示取得函数返回的引用此时,函数外修改返回值,会修改函数内的该返回变量的值- 如果函数需返回引用,则需要返回一个变量才可以- 从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符&function &returns_reference(){return $someref;}$newref =& returns_reference();3) 返回引用的作用/* 【变量作用域】 */a. 全局变量和局部变量1) 作用域之间不重叠,即不同作用域的变量,之间不可访问2) 全局作用域 - 函数之外的区域3) 局部作用域 - 函数内的区域,每个函数都是一个独立的作用域b. 超全局变量,既可以在全局也可在局部使用,仅能用系统自带的,均是数组变量。$GLOBALS$_COOKIE$_ENV$_FILES $_GET$_POST $_REQUEST$_SERVER$_SESSIONc. $GLOBALS1) 不能存在超全局变量,但可以有超全局的数据!2) 将需要的数据放到超全局变量的数组内,但统一使用$GLOBALS3) $GLOBALS 特征- 每个全局变量就是对应$GLOBALS内的一个元素!每当增加一个全局,则自动在$GLOBALS内增加一个同名元素!同理,每当增加元素,也会增加一个全局变量,一般在函数内增加- 做的任何修改,也会映射到另一个,包括更新和删除在函数内访问全局变量,只需使用$GLOBALS- 出现过的全局变量,就可以通过$GLOBALS这个数组取得4) PHP生命周期中,定义在函数体外部的所谓全局变量,函数内部是不能直接获得的4) global关键字(不建议使用)将局部变量声明为同名全局变量的一个"引用"!相当于常量的引用传递global $var;// $var = &$GLOBALS["var"];不同于$GLOBALS!!!global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量。$GLOBALS确确实实调用是外部的变量,函数内外会始终保持一致。global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。d. 1) 作用域只针对变量,对常量无效2) 被载入文件中定义的变量作用域取决于被载入的位置。函数外被载入就是全局,函数内被载入就是局部!/* 【变量生命周期】 */1. 脚本结束时,全局变量消失2. 函数执行完时,局部变量消失3. 静态变量static关键字静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。静态变量仅会被初始化一次,其他局部变量每次被调用时都会被重新赋值。static声明的静态变量的生命周期会被一直延续。/* 【迭代和递归】 */迭代比递归效率高!迭代是一种思想(算法),结构和使用上如同循环!递归是一种思想(算法),将大问题拆分成小问题,逐一解决小问题以解决大问题要求大问题和小问题的解决方案是一致的!递归的结构和语法体现如图函数。函数体内调用函数本身!递归出口:当该问题可以解决时,则不用再递归/* 【匿名函数/闭包函数】 */匿名函数,也叫闭包函数(closures),允许临时创建一个没有指定名称的函数。1. 定义匿名函数时,不需增加函数名。2. PHP对匿名函数的管理,以一个对象的方式进行处理。3. 匿名函数应该存放到变量内。4. 匿名函数通过Closure类来实现5. 可以使用函数作为函数的参数和返回值6. 声明函数时可以使用 use($param) 来向函数中传入函数外的变量,结合变量引用来实现闭包7. 可以用变量引用函数$func = function ($e) {echo $e;};//结束时,需分号结束,如同变量赋值var_dump($func); //使用匿名函数$func("ITCAST"); //函数的调用这不是可变函数,而是对象。Closure闭包类//use语法匿名函数倾向于值的概念,可能出现在任何地方。use可以使得匿名函数使用其外部作用域的变量。非全局!use与全局的区别:use使用其外部作用域的变量function out() {$v = "in out";$func = function () use (& $v) {var_dump($v);}}use类似参数的自动传递,也支持值与引用的传递方式。//作用常作为"临时函数"被调用(只在某个地方被调用的函数)例如:PHP存在一个array_map()函数,功能是针对一个函数内每个元素,去调用某个函数操作结果(array) = array_map(操作函数, 操作数组);$result_arr = array_map(function ($v) {return $v3}, $arr);//闭包用法实例function closureCreater() {$x = 1;return function($fun = null) use(&$x) {//按引用传值echo "<br />" . $x++;$fun and $fun();};}$x = "hello world";$test = closureCreater();$test();$test(function(){ echo "closure test one"; });$test(function(){ echo "closure test two"; });$test(function() use($x){ echo "<br />".$x;});//将函数保存为数组元素$x = "outer param.";$arr = array();$arr[] = function($str)use($x){ return $str.$x; };echo $arr[0]("test fun in arr,");/* 【数组】 */关联数组:键和值有关联,键表示值的逻辑含义。索引数组:键和值无关联,键表示值的位置。通常下标从0开始,递增元素count($var [,$mode]) //统计数组元素个数$mode可选,设为1或true时则递归统计$var非数组,返回1;$var未初始化或等于null或空数组,返回0//键名的使用整型数字键不需加引号($arr[1])字符串数字键也不需加引号($arr = array("1"=>"abc"); $arr[1])关联数组,字符串键需加引号($arr = array("a"=>"aaa"); $arr["a"])关联数组,双引号中解析变量,可不加引号($arr = array("a"=>"aaa"); "$arr[a]")/* 【指针】 */current/pos返回当前被内部指针指向的数组单元的值,并不移动指针。key返回数组中当前单元的键名,并不移动指针next将数组中的内部指针向前移动一位,并返回移动后当前单元的值。先移动,再取值。prev将数组的内部指针倒回一位,并返回移动后当前单元的值先移动,再取值。end将数组的内部指针指向最后一个单元,并返回最后一个单元的值reset将数组的内部指针指向第一个单元,并返回第一个数组单元的值each返回数组中当前的键/值对并将数组指针向前移动一步。返回的是一个由键和值组成的长度为4的数组,下标0和key表示键,下标1和value表示值在执行each()之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用 each 遍历数组,必须使用 reset()。1. 以上指针操作函数,除了key(),若指针移出数组,则返回false。而key()移出则返回null。2. 若指针非法,不能进行next/prev操作,能进行reset/end操作3. current/next/prev 若遇到包含空单元(0或"")也会返回false。而each不会!list把数组中的值赋给一些变量。list()是语言结构,不是函数仅能用于数字索引的数组并假定数字索引从0开始/* 可用于交换多个变量的值 */ list($a, $b) = array($b, $a);例:list($drink, , $power) = array("coffee", "brown", "caffeine");1. 复制数组,其指针位置也会被复制。特例:如果数组指针非法,则拷贝的数组指针会重置,而原数组的指针不变。【指针问题】谁第一个进行写操作,就会开辟一个新的值空间。与变量(数组变量)值传递给谁无关。数组函数current()被定义为写操作,故会出现问题。foreach遍历的是数组的拷贝,当被写时,才会开辟一个新的值空间。即,foreach循环体对原数组进行写操作时,才会出现指针问题。如果开辟新空间时指针非法,则会初始化指针。2. 如果指针位置出现问题,则reset()初始化一下就可解决。/* 【遍历数组】 */* 先找到元素,再获取键和值foreachforeach (array_expression as [$key =>] & $value) 当foreach开始执行时,数组内部的指针会自动指向第一个单元。 获取元素信息后,移动指针,再执行循环体 1. foreach本身循环结构,break和continue适用于foreach 2. foreach支持循环的替代语法。 3. $value是保存元素值的变量,对其修改不会改变数组的元素值 4. $value支持元素值的引用拷贝,在$value前加上&即可 5. $key不支持引用传递 6. foreach遍历的是原数组的拷贝,而在循环体对数组的操作是操作原数组即循环体对数组的操作,对原数组生效,对遍历不生效。先拷贝一份数组用作遍历while...list...eachwhile (list($key, $val) = mysql_fetch_row($result)) = each($arr) { echo "$key => $val
";}/* 【数组函数】 *///统计计算count计算数组中的单元数目或对象中的属性个数array_count_values 统计数组中所有的值出现的次数array_product计算数组中所有值的乘积array_sum计算数组中所有值的和range建立一个包含指定范围单元的数组//获取数组内容array_chunk将一个数组分割成多个array array_chunk(array $input, int $size[, bool $preserve_keys]) array_filter用回调函数过滤数组中的单元array_slice 从数组中取出一段array array_slice($arr, $offset [,$len [,$preserve_keys]])array_keys返回数组中所有的键名array array_keys(array $input[, mixed $search_value[, bool $strict]] )如果指定了可选参数 search_value,则只返回该值的键名。否则input数组中的所有键名都会被返回。array_values返回数组中所有的值,并建立数字索引array_merge合并一个或多个数组一个数组中的值附加在前一个数组的后面。如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。 array_merge_recursive递归地合并一个或多个数组//搜索in_array检查数组中是否存在某个值bool in_array(mixed $needle, array $haystack[, bool $strict])array_key_exists检查给定的键名或索引是否存在于数组中isset()对于数组中为NULL的值不会返回TRUE,而 array_key_exists()会array_search在数组中搜索给定的值,如果成功则返回相应的键名array_combine创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值如果两个数组的单元数不同或者数组为空时返回FALSE。array_rand从数组中随机取出一个或多个单元,返回键名或键名组成的数组,下标是自然排序的array_fill 用给定的值填充数组array_fill($start, $num, $value)array_flip 交换数组中的键和值array_pad用值将数组填补到指定长度array_reverse返回一个单元顺序相反的数组array_unique移除数组中重复的值array_splice把数组中的一部分去掉并用其它值取代implode将数组元素值用某个字符串连接成字符串explode($delimiter, $str [,$limit])//使用一个字符串分割另一个字符串$delimiter不能为空字符串""array_map将回调函数作用到给定数组的单元上,只能处理元素值,可以处理多个数组如果callback参数设为null,则合并多个数组为一个多维数组array_walk对数组中的每个成员应用用户函数,只能处理一个数组,键和值均可处理,与foreach功能相同bool array_walk ( array &$array , callback $funcname [, mixed $userdata ] )//栈:后进先出入栈和出栈会重新分配索引下标array_push将一个或多个单元压入数组的末尾(入栈)array_pop将数组最后一个单元弹出(出栈)使用此函数后会重置(reset())array 指针。//队列:先进先出队列函数会重新分配索引下标array_unshift在数组开头插入一个或多个单元array_shift将数组开头的单元移出数组使用此函数后会重置(reset())array 指针。//排序函数sort对数组排序rsort对数组逆向排序asort对数组进行排序并保持索引关系arsort对数组进行逆向排序并保持索引关系ksort对数组按照键名排序krsort对数组按照键名逆向排序usort使用用户自定义的比较函数对数组中的值进行排序uksort使用用户自定义的比较函数对数组中的键名进行排序uasort使用用户自定义的比较函数对数组中的值进行排序并保持索引关联natsort用用“自然排序”算法对数组排序natcasesort用“自然排序”算法对数组进行不区分大小写字母的排序array_multisort 对多个数组或多维数组进行排序shuffle将数组打乱引用传递参数,返回bool值。重新赋予索引键名,删除原有键名//差集array_udiff_assoc带索引检查计算数组的差集,用回调函数比较数据array_udiff_uassoc 带索引检查计算数组的差集,用回调函数比较数据和索引array_udiff 用回调函数比较数据来计算数组的差集array_diff_assoc带索引检查计算数组的差集array_diff_key 使用键名比较计算数组的差集array_diff_uassoc用用户提供的回调函数做索引检查来计算数组的差集array_diff_ukey 用回调函数对键名比较计算数组的差集array_diff 计算数组的差集//交集array_intersect_assoc 带索引检查计算数组的交集array_intersect_key 使用键名比较计算数组的交集array_intersect_uassoc 带索引检查计算数组的交集,用回调函数比较索引array_intersect_ukey 用回调函数比较键名来计算数组的交集array_intersect 计算数组的交集array_key_exists 用回调函数比较键名来计算数组的交集array_uintersect_assoc 带索引检查计算数组的交集,用回调函数比较数据array_uintersect 计算数组的交集,用回调函数比较数据extract($arr [,$type [,$prefix]])从数组中将变量导入到当前的符号表(接受结合数组$arr作为参数并将键名当作变量名,值作为变量的值)compact($var [,...])建立一个数组,包括变量名和它们的值(变量名成为键名而变量的内容成为该键的值)/* 【伪类型】 */mixed说明一个参数可以接受多种不同的(但并不必须是所有的)类型。number说明一个参数可以是 integer 或者 float。callback回调函数voidvoid作为返回类型意味着函数的返回值是无用的。void作为参数列表意味着函数不接受任何参数。/* 【数据库操作】 */#连接认证mysql_connect连接并认证数据库#发送SQL语句,接收执行结果mysql_query发送SQL语句仅对select, show, explain, describe语句执行成功返回一个资源标识符,其他语句成功返回true。执行失败均返回false。#处理结果mysql_fetch_assoc从结果集中取得一行作为关联数组每次只取回一条,类似each结果集中记录指针mysql_fetch_row从结果集中取得一行作为枚举数组mysql_fetch_array从结果集中取得一行作为关联数组,或数字数组,或二者兼有array mysql_fetch_array ( resource $result [, int $ result_type ] )可选参数result_type可选值为:MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH(默认)mysql_free_result释放结果内存#关闭链接mysql_close关闭连接/* 【类和对象】 */# 成员:类成员:类常量、静态属性、静态方法对象成员:非静态属性、非静态方法# 除此外,类不能包含任何其他东西!!!# 类名、方法名、属性名均不区分大小写# $this代表本对象,self代表本类,parent代表父类# 类和函数均可被事先编译(仅作为最外层时)# 类的定义必须在单一的PHP区块内,不能被多个PHP标签分割// 构造方法- 具有构造函数的类会在每次创建新对象时先调用此方法void __construct([ mixed $args [, $... ]] )- 构造方法所需参数由new实例化对象时,给类增加参数值。- 构造方法也可以被手动调用。- 5.3.3版本以前,支持于类名同名的方法作为构造方法。- 两种冲突时,__construct 优先// 析构方法- 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。void __destruct( void )# 作用:释放对象所占用的资源# 调用的时机 - 脚本结束时所有资源均被释放,包括对象- 手动删除对象时- 保存对象的变量被赋予新值时(任何值,包括null)- 在使用exit()终止脚本运行时也会被调用// 静态成员(static关键字)- 声明类成员或方法为static,就可以不实例化类而直接访问。- 静态成员(属性或方法)均属于类,故不能通过$this或->访问。- 静态成员是所有对象共享,属于类。- 静态成员用类调用,非静态成员用对象调用。# 静态属性- 静态属性不可以由对象通过->操作符来访问。- 静态属性只能被初始化为一个字符值或一个常量,不能使用表达式。 所以你可以把静态属性初始化为整型或数组,但不能指向另一个变量或函数返回值,也不能指向一个对象。# 静态方法- 由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。- 用::方式调用一个非静态方法会导致一个E_STRICT级别的错误。// 访问解析操作符(::)- 可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。 - 当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。 - self 和 parent 这两个特殊的关键字是用于在类的内部对成员或方法进行访问的。// 访问辨析- 对象成员,内部通过$this指定,外部通过对象名指定,均用->访问,访问属性时不需加$。对象名->属性名对象名->方法名()$this->属性名$this->方法名()- 类成员,内部通过self或parent指定,外部通过类名指定,均用::访问,访问属性时需加$。类名::$属性名类名::方法名()self::$属性名self::方法名()- 特殊:也可以通过对象访问类成员。(不建议)对象名::$类属性名$this::$类属性名对象名::$类方法名()$this::类方法名()# 对象成员访问用->,类成员访问用::- 无论是静态方法还是非静态方法,均可通过类或对象进行访问。- 静态属性通过类访问,静态方法通过对象访问。- 只有使用对象调用非静态方法时,$this才可以使用!- 静态方法不可使用$this。- 类可以调用对象方法,但注意方法内不能有$this。- 非静态方法可以调用静态属性或静态方法,反之不可以。// 类常量- 常量的值将始终保持不变。- 在定义和使用常量的时候不需要使用$符号。- 常量的值必须是一个定值,不能是变量,类属性或其它操作(如函数调用)的结果。# 定义:const 常量名 = 常量值;- 不需要加public等访问修饰限定符- 类常量属于类,使用类访问,类名::类常量 或 self::类常量// 自动加载对象- 在试图使用尚未被定义的类时自动调用 __autoload 函数- 自动加载使用到的类名文件(根据类名找相应名称的文件,故需类名与类文件名一致)- 每个需要加载类的文件都需要存在__autoload函数- 将__autoload函数写入单独的文件,每个需要用到类的文件再require该函数文件- __autoload 参数是类名function __autoload($class_name) {require_once $_SERVER["DOCUMENT_ROOT"] . "/class/$class_name.php";}// $_SERVER["DOCUMENT_ROOT"] 当前运行脚本所在的文档根目录- 可以通过类名,来推导出类所在的文件名!- 如果一个项目存在多个自动加载函数时,定义一个可以完成加载的普通函数,并在函数之前使用spl_autoload_register注册该函数。# spl_autoload_register- 注册__autoload()函数bool spl_autoload_register ([ callback $autoload_function ] )- 可以注册多个自动加载函数,先注册的先执行- 一旦注册自动加载函数,__autoload就失效。- 注册函数时,参数为函数名(注意加引号);注册方法时,参数为数组# 注册类或对象的方法为自动加载方法时,参数需为数组:spl_autoload_register(array(__CLASS__, "__autoload"));__CLASS__表示当前类名,若是对象可用$this,详细见手册// 序列化(串行化)# 数据传输均是字符串类型# 除了资源类型,均可序列化# 序列化在存放数据时,会存放数据本身,也会存放数据类型作用:1.在网络传输数据时;2.为了将数组或对象放在磁盘时# 序列化serialize产生一个可存储的值的表示string serialize ( mixed $value )- 返回字符串,此字符串包含了表示value的字节流,可以存储于任何地方。- 有利于存储或传递 PHP 的值,同时不丢失其类型和结构。# 反序列化unserialize从已存储的表示中创建PHP的值mixed unserialize ( string $str [, string $callback ] )- 对单一的已序列化的变量进行操作,将其转换回PHP的值。# 文件的读写操作- file_put_contents将一个字符串写入文件int file_put_contents($file, $data [,$flags])$flags:FILE_USE_INCLUDE_PATH(覆盖),FILE_APPEND(追加)- file_get_contents将整个文件读入一个字符串string file_get_contents($file [, bool $use_include_path [,int $offset [,int $maxlen]]])# 对象序列化- 只能序列化对象内部的数据,即非静态属性。# 需在反序列化对象之前加载类,也可以触发自动加载机制。__sleep序列化需序列化的属性。- 提交未提交的数据,或类似的清理操作,部分串行化对象。- 返回一个包含对象中所有应被序列化的变量名称的数组__wakeup反序列化时,预先准备对象需要的资源- 重新建立数据库连接,或执行其它初始化操作public function __sleep() {return array("server", "username", "password", "db");}public function __wakeup() {$this->connect();}// 对象继承class 子类名 extends 父类 {}如果一个对象是子类的对象,那么同时也是父类的对象。单继承:一个类只能继承一个父类,不能同时继承多个类。但一个父类可以被多个子类继承。instanceof判断某对象是否为某类的对象对象名 instanceof 类名// 访问控制public公有的(继承链、本类、外部均可访问)protected保护的(仅继承链、本类可访问)private私有的(仅本类可访问)根据成员定义位置、访问位置判断。# 兼容性问题- 声明属性时,var关键字声明的默认为public权限- 声明方法时,省略访问修饰符,默认为public权限// 重写 override$this代表本对象,被谁调用,就代表哪个对象。- 继承时,子类成员名于父类成员名发生冲突,则子类成员会重写父类成员。- 属性和方法均可被子类重写。- 当父类的方法或属性已经不满足子类的需求,则需要重写。- 也可能因为命名不规范导致重写。私有属性不能被重写,每个私有属性都会被记录。在记录属性名的同时,还会记录类。如果有内置函数被重写,则可调用父类方法。如调用父类构造方法parent::__construct()# 重写限制访问限制:子类的成员的访问控制必须相等或弱于父类。方法参数限制:参数数量必须相同,参数名可不同。# $this确定原则$this为调用该方法的对象,表示该方法的执行环境对象。- 对象调用- 环境的传递。如果当前调用时,不能确定$this的值(静态调用),此时静态调用所处对象环境会传递到被调用的方法内。$this并非永远代表本对象,而是由方法的执行环境决定。# final如果父类中的方法被声明为final,则子类无法覆盖(重写)该方法。如果一个类被声明为final,则不能被继承。但加有final关键字的类依旧能被实例化!# 抽象类关键字:abstract抽象类不能直接被实例化,必须先继承该抽象类,然后再实例化子类。抽象类中至少要包含一个抽象方法。非抽象类不能包含抽象方法。如果类方法被声明为抽象的,那么其中就不能包括具体的功能实现。抽象方法不能包含大括号及方法体。继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法。即,子类必须重写抽象父类中的所有抽象方法。另外,这些方法的可见性必须和抽象类中一样(或者更为宽松)。即,如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不能定义为private。- 抽象类的子类中的普通方法执行方式和其他类相同。- 作用:1. 继承,为扩展类,统一公共操作。2. 限制结构(规范)。规范子类的结构。// 接口关键字:interface- 对象提供的与对象交互的方式就是接口。- 使用接口可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。- 通过interface来定义一个接口,就像定义一个标准的类一样,但其中定义所有的方法都是空的。 - 接口中定义的所有属性和方法都必须是public,可省略public关键字。- 接口中也可以定义常量(const)。接口常量和类常量的使用完全相同。可以用::访问。接口名::常量名,实现类::常量名。它们都是定值,可以被子类或子接口使用,但不能修改。- 接口不能定义属性!# 定义接口interface 接口名 {接口内容(公共方法声明的集合)}# 接口实现- 要实现一个接口,可以使用implements操作符。- 类中必须实现接口中定义的所有方法,否则会报一个fatal错误。- 如果要实现多个接口,可以用逗号来分隔多个接口的名称。- 实现多个接口时,接口中的方法不能有重名。- 接口也可以继承,通过使用extends操作符。class 类名 implements 接口名 {接口方法的实现}# 注意1. 类与抽象类之间是继承关系,类与接口之间是实现关系。2. 类与抽象类是单继承,类与接口是多实现。3. 接口不是类,限制类的结构。4. 接口与接口之间是多继承。用extends关键字。interface I_C extends I_A, I_B {}// 静态延迟绑定self::,代表本类(当前代码所在类)永远代表本类,因为在类编译时已经被确定。即,子类调用父类方法,self却不代表调用的子类。static::,代表本类(调用该方法的类)用于在继承范围内引用静态调用的类。运行时,才确定代表的类。static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。// 对象的遍历(迭代)- 对象通过属性保存数据,故遍历对象的属性。- foreach语言结构,获得属性名和属性值。foreach ($obj as $p_name => $p_value) {}# 自定义遍历(迭代器Iterator)Iterator - 可在内部迭代自己的外部迭代器或类的接口Iterator::current— 返回当前元素Iterator::key— 返回当前元素的键Iterator::next— 向前移动到下一个元素Iterator::rewind— 返回到迭代器的第一个元素Iterator::valid— 检查当前位置是否有效# 对象的克隆//对象之间的传值是[引用]传递。克隆:新对象 = clone 旧对象- 所有的引用属性仍然会是一个指向原来的变量的引用。 __clone()方法在对象被克隆时自动调用。注意:构造方法对应实例化(new),克隆方法对应克隆(clone)。// 单例模式#三私一公单例模式(Singleton)用于为一个类生成一个唯一的对象。最常用的地方是数据库连接。使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。# 防止一个类被实例化多次class MySQLDB {private static $instance = null; // 存类实例在此属性中// 构造方法声明为private,防止直接创建对象private function __construct() {}public static function getInstance() {if(! self::$instance instanceof static) {self::$instance = new static;}return self::$instance;}private function __clone() {} // 阻止用户复制对象实例}// 魔术方法__construct构造方法__destruct析构方法__clone克隆对象__sleep序列化对象__wakeup反序列化对象__autoload自动加载,使用类但未找到时__toString对象被当作字符串使用时__invoke当尝试以调用函数的方式调用一个对象时# 重载 overload指动态地"创建"类属性和方法用户可以自由的为对象添加额外的属性,该特性就是重载。所有的重载方法都必须被声明为public。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。重载相关魔术方法的参数都不能通过引用传递。# 属性重载- 处理不可访问的属性属性重载只能在对象中进行。# 属性重载对于静态属性无效在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被声明为static。__set在给不可访问的属性赋值时public void __set(string $name, mixed $value)作用:批量管理私有属性,间接保护对象结构__get读取不可访问的属性的值时public mixed __get(string $name)__isset当对不可访问的属性调用isset()或empty()时public bool __isset(string $name)__unset当对不可访问的属性调用unset()时public void __unset(string $name)# 方法重载- 处理不可访问的方法__call当调用一个不可访问的非静态方法(如未定义,或者不可见)时自动被调用public mixed __call(string $name, array $arguments)__callStatic当在调用一个不可访问的静态方法(如未定义,或者不可见)时自动被调用public static mixed __callStatic(string $name, array $arguments)# $name参数是要调用的方法名称。$arguments参数是一个数组,包含着要传递给方法的参数。// 类型约束函数的参数可以指定只能为对象或数组限定为对象则在形参前加类名,限定为数组则在形参前加array类型约束允许NULL值类型约束不只是用在类的成员方法里,也能使用在函数里。 // 三大特性封装:隐藏内部是吸纳,仅开发接口。继承:一个对象的成员被另一个对象所使用。语法上体现为代码的共用。多态:多种形态。// 类与对象·关键字this代表本对象public公有的(继承链、本类、外部均可访问)protected保护的(仅继承链、本类可访问)private私有的(仅本类可访问)parent::代表父类self::代表本类(当前代码所在类)static::代表本类(调用该方法的类)static静态成员(属性、方法),所有对象均可使用,外部也可直接使用或修改,静态方法不可访问非静态成员final方法用final不可被子类重载,类用final不可被继承(方法、类)const类常量(属性)abstract抽象类interface接口extends类继承(子接口继承接口、其他普通类继承)implements接口实现(类实现接口、抽象类实现借口)(对接口的实现和继承均可有多个)Iterator内置接口(迭代)clone克隆instance实例instanceof某对象是否属于某类/* 【类与对象相关函数】 */class_alias([$original [,$alias]]) 给类取别名class_exists($class [,$autoload])检查类是否已定义interface_exists($interface [,$autoload])检查接口是否已被定义method_exists($obj, $method)检查类的方法是否存在property_exists($class, $property) 检查对象或类是否具有该属性get_declared_classes(void) 返回由已定义类的名字所组成的数组get_declared_interfaces(void)返回一个数组包含所有已声明的接口get_class([$obj])返回对象的类名get_parent_class([$obj])返回对象或类的父类名get_class_methods($class)返回由类的方法名组成的数组get_object_vars($obj)返回由对象属性组成的关联数组get_class_vars($class) 返回由类的默认属性组成的数组is_a($obj, $class) 如果对象属于该类或该类是此对象的父类则返回TRUEis_subclass_of($obj, $class)如果此对象是该类的子类,则返回TRUEget_object_vars($obj)返回由对象属性组成的关联数组// 常用类# PHP手册 -> 预定义类Closure闭包类,匿名函数对象的final类stdClass标准类,通常用于对象类保存集合数据__PHP_Incomplete_Class不完整类,当只有对象而没有找到类时,则该对象被认为是该类的对象Exception异常类PDO数据对象类// 魔术常量__DIR__文件所在的目录__LINE__文件中的当前行号 __FILE__文件的完整路径(绝对路径)和文件名__CLASS__类的名称__METHOD__类的方法名,包含类名和方法名__FUNCTION__函数名称,用在方法内只表示方法名// 反射机制 Reflection作用:1. 获取结构信息2. 代理执行ReflectionClass 报告一个类的有关信息ReflectionMethod 报告一个方法的有关信息ReflectionClass::export输出类结构报告# 代理执行实例化 ReflectionFunction 类的对象$f = new ReflectionFunction("func");// func为函数func($p)$f->invoke("param");/* 页面跳转 */// PHPheader("Loacation: url")header()执行完毕后,后面的代码也会继续执行,故需在该语句后加die结束无法给出提示,直接跳转// JS方法location.href = url// HTML<meta http-equiv="Refresh" content="表示时间的数值; url=要跳转的URI"> /* 【Cookie】 */cookie是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。cookie是HTTP标头的一部分,因此setcookie()函数必须在其它信息被输出到浏览器前调用,这和对header()函数的限制类似。可以使用输出缓冲函数来延迟脚本的输出,直到按需要设置好了所有的cookie或者其它HTTP标头。// 新增setcookie新增一条cookie信息setcookie($name [,$value [,$expire [,$path [,$domain [,$secure [,$httponly]]]]]])#注意:setcookie()函数前不能有输出!除非开启ob缓存!# 参数说明$name- cookie的识别名称使用$_COOKIE["name"]抵用名为name的cookie$value- cookie值,可以为数值或字符串,此值保存在客户端,不要用来保存敏感数据假定$name参数的值为"name",则$_COOKIE["name"]就可取得该$value值$expire- cookie的生存期限(Unix时间戳,秒数)如果$expire参数的值为time()+60*60*24*7则可设定cookie在一周后失效。如果未设定该参数,则会话后立即失效。$path- cookie在服务器端的指定路径。当设定该值时,服务器中只有指定路径下的网页或程序可以存取该cookie。如果该参数值为"/",则cookie在整个domain内有效。如果设为"/foo/",则cookie就在domain下的/foo/目录及其子目录内有效。默认值为设定cookie的当前目录及其子目录。$domain- 指定此cookie所属服务器的网址名称,预设是建立此cookie服务器的网址。要是cookie能在如abc.com域名下的所有子域都有效,则该参赛应设为".abc.com"。$secure- 指明cookie是否仅通过安全的HTTPS连接传送中的cookie的安全识别常数,如果设定该值则代表只有在某种情况下才能在客户端与服务端之间传递。当设成true时,cookie仅在安全的连接中被设置。默认值为false。// 读取- 浏览器请求时会携带当前域名下的所有cookie信息到服务器。- 任何从客户端发送的cookie都会被自动存入$_COOKIE全局数组。- 如果希望对一个cookie变量设置多个值,则需在cookie的名称后加[]符号。即以数组形态保存多条数据到同一变量。//设置为$_COOKIE["user"]["name"],注意user[name]的name没有引号setcookie("user[name]", "shocker");- $_COOKIE也可以为索引数组// 删除方法1:将其值设置为空字符串setcookie("user[name]", "");方法2:将目标cookie设为“已过期”状态。//将cookie的生存时间设置为过期,则生存期限与浏览器一样,当浏览器关闭时就会被删除。setcookie("usr[name]", "", time()-1);# 注意:1. cookie只能保存字符串数据2. $_COOKIE只用于接收cookie数据,不用于设置或管理cookie数据。对$_COOKIE进行操作不会影响cookie数据。$_COOKIE只会保存浏览器在请求时所携带的cookie数据。3. cookie生命周期:临时cookie:浏览器关闭时被删除持久cookie:$expire参数为时间戳,表示失效时间。4. 有效目录cookie只在指定的目录有效。默认是当前目录及其子目录。子目录的cookie在其父目录或同级目录不可获取。5. cookie区分域名默认是当前域名及其子域名有效。6. js中通过document.cookie获得,类型为字符串7. 浏览器对COOKIE总数没有限制,但对每个域名的COOKIE数量和每个COOKIE的大小有限,而且不同浏览器的限制不同。/* 【session】 */1. 开启session机制session_start()注意:session_start()函数前不能有输出!除非开启ob缓存。2. 操作数据对$_SESSION数组进行操作3. 浏览器端保存SessionID,默认为当前域名下的所有目录及其子目录生效。即默认设置cookie的path值为"/"4. 服务器保存session数据默认保存方式:每个会话都会生成一个session数据文件,文件名为:sess_加SessionID5. session可以存储除了资源以外的任何类型数据。数据被序列化后再保存到文件中。6. $_SESSION的元素下标不能为整型!因为只对元素值进行序列化。元素内的数组下标无此要求。7. 生存周期默认是浏览器关闭因为浏览器保存的cookie变量SessionID是临时的但是服务器端的session数据文件不一定消失(需要等待session的垃圾回收机制来处理)可以延长cookie中PHPSESSID变量的生命周期。(不推荐)php.ini配置session.gc_maxlifetime8. 删除数据$_SESSION变量在脚本结束时依然会消失。开启session机制时会造出$_SESSION变量。$_SESSION与保存session数据的文件是两个空间。unset($_SESSION["key"])只是删除数组内的该元素,不会立即相应到保存session数据的文件上。等到脚本结束,才会将$_SESSION的数据写入到该文件中。session_destroy()销毁保存session数据的文件,也不会对该文件写入内容。并不删除$_SESSION变量,unset或脚本结束才会删除该变量。如何完全删除一个session?需删除3部分unset($_SESSION);删除$_SESSION变量后,数据文件并未被改动。如果单独使用unset,则需先置空$_SESSION = array()session_destroy();setcookie("PHPSESSID", "", time()-1); //保险做法是将其生命周期失效整个脚本周期内,只对数据文件读一次、写一次。// 重写session的存储机制# session存储方式session.save_handler = user|files|memcache# 因数据文件过多导致的问题,可通过分子目录保存进行解决PHP配置文件下session.save_path选项,并需手动创建数据存放目录。在该配置选项前加层级。分布子目录的原则,利用会话ID的相应字母来分配子目录。仍需手动创建子目录。session.save_path = "2; F:/PHPJob/Temp"# 多服务器数据共享问题# 数据存储操作:初始化$open、释放资源$close、读$read、写$write、销毁存储介质$destroy(调用session_destroy时触发该操作)、垃圾回收$gc# 会话ID的长度可变。不同的设置方式导致不同长度的会话ID。session.hash_function允许用户指定生成会话ID的散列算法。"0" 表示MD5(128 位),"1" 表示SHA-1(160 位)。session.hash_bits_per_character允许用户定义将二进制散列数据转换为可读的格式时每个字符存放多少个比特。可能值为 "4"(0-9,a-f),"5"(0-9,a-v),以及 "6"(0-9,a-z,A-Z,"-",",")。总hash长度为128bit,会话ID长度为128/可能值,4->32, 5->26, 6->22# 自定义数据存储操作方法# 注意:不用关心PHP如何序列化、反序列化、如何得到数据和写入数据,只做与数据存储相关的操作session_set_save_handler设置用户自定义的会话数据存储函数bool session_set_save_handler(callable $open, callable $close, callable $read, callable $write, callable $destroy, callable $gc)执行顺序:open, close, read, write, destroy, gc# 先设置处理器,再开启会话# 常用函数session_start开启或恢复会话机制session_id获取或设置当前会话IDsession_destroy销毁当前会话的所有数据(销毁数据文件)session_name获取或设置当前会话名称(cookie变量名,默认为PHPSESSID)session_save_path获取或设置当前会话数据文件保存路径session_set_save_handler设置用户自定义的会话数据存储函数session_unset释放所有会话变量(清空$_SESSION数组元素)session_encode将当前会话数据编码为一个字符串session_decode将字符串解译为会话数据session_write_close写入会话数据并关闭会话session_register_shutdown关闭会话session_set_cookie_params设置会话cookie变量,必须在session_start()前使用。session_set_cookie_params(0,"/webapp/"); //设置session生存时间session_get_cookie_params获取会话cookie变量。返回包含当前会话cookie信息的数组# 配置php.iniini_set($varname, $newvalue);//该函数的配置只对当前脚本生效//并非所有php.ini设置均可用该函数设置ini_get($varname)//获取某配置项信息ini_get_all([str $extension])//返回所有配置项信息的数组# session扩展配置session.name指定会话名以用作cookie的名字。只能由字母数字组成,默认为PHPSESSID。session.save_path定义了传递给存储处理器的参数。如果选择了默认的files文件处理器,则此值是创建文件的路径。默认为/tmp。可选的N参数来决定会话文件分布的目录深度。要使用N参数,必须在使用前先创建好这些目录。在ext/session目录下有个小的shell脚本名叫mod_files.sh可以用来做这件事。如果使用了N参数并且N大于0,那么将不会执行自动垃圾回收。session.save_handler定义了来存储和获取与会话关联的数据的处理器的名字。默认为files。如果用户自定义存储器,则该值改为user。ini_set("session.save_handler", "user");//此设置只针对当前脚本生效。session.auto_start 指定会话模块是否在请求开始时自动启动一个会话。默认为 0(不启动)。session.gc_probability与session.gc_divisor合起来定义了在每个会话初始化时启动gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动gc进程。session.gc_divisor默认为100。session.gc_probability默认为1。/* 【图片生成与处理】 */GD库// 画布生成# 新建画布imagecreate 新建一个基于调色板的图像resource imagecreate(int $x_size, int $y_size)imagecreatetruecolor新建一个真彩色图像# 基于已有文件或URL创建画布imagecreatefromgd2 从GD2文件或URL新建一图像imagecreatefromgd2part 从给定的GD2文件或URL中的部分新建一图像imagecreatefromgd从GD文件或URL新建一图像imagecreatefromgif 由文件或URL创建一个新图象imagecreatefromjpeg 由文件或URL创建一个新图象imagecreatefrompng 由文件或URL创建一个新图象imagecreatefromstring从字符串中的图像流新建一图像imagecreatefromwbmp 由文件或URL创建一个新图象imagecreatefromxbm 由文件或URL创建一个新图象imagecreatefromxpm 由文件或URL创建一个新图象// 颜色分配imagecolorallocate 为一幅图像分配颜色int imagecolorallocate(resource $image, int $red, int $green, int $blue)imagecolorallocatealpha 为一幅图像分配颜色 + alphaimagecolordeallocate取消图像颜色的分配imagecolortransparent将某个颜色定义为透明色imagecolorat取得某像素的颜色索引值imagecolorclosest取得与指定的颜色最接近的颜色的索引值imagecolorclosestalpha 取得与指定的颜色加透明度最接近的颜色imagecolorclosesthwb取得与给定颜色最接近的色度的黑白色的索引imagecolorexact 取得指定颜色的索引值imagecolorexactalpha取得指定的颜色加透明度的索引值imagecolormatch 使一个图像中调色板版本的颜色与真彩色版本更能匹配imagecolorresolve取得指定颜色的索引值或有可能得到的最接近的替代值imagecolorresolvealpha 取得指定颜色 + alpha 的索引值或有可能得到的最接近的替代值imagecolorset给指定调色板索引设定颜色imagecolorsforindex 取得某索引的颜色imagecolorstotal取得一幅图像的调色板中颜色的数目// 区域填充imagefill区域填充bool imagefill(resource $image, int $x, int $y, int $color)imagefilledarc 画一椭圆弧且填充imagefilledellipse 画一椭圆并填充imagefilledpolygon 画一多边形并填充imagefilledrectangle画一矩形并填充imagefilltoborder区域填充到指定颜色的边界为止imagesettile设定用于填充的贴图// 图形创建imagearc画椭圆弧imagechar水平地画一个字符imagecharup 垂直地画一个字符imagedashedline 画一虚线imageellipse画一个椭圆imageline画一条线段imagepolygon画一个多边形imagerectangle 画一个矩形imagesetpixel画一个单一像素imagesx 取得图像宽度imagesy 取得图像高度// 画笔设置imagesetbrush设定画线用的画笔图像imagesetstyle设定画线的风格imagesetthickness设定画线的宽度// 图形拷贝imagecopy拷贝图像的一部分imagecopymerge 拷贝并合并图像的一部分imagecopymergegray 用灰度拷贝并合并图像的一部分imagecopyresampled 重采样拷贝部分图像并调整大小imagecopyresized拷贝部分图像并调整大小// 字符创建imagestring 水平地画一行字符串imagestringup垂直地画一行字符串imagepsslantfont倾斜某字体imagefontheight 取得字体高度imagefontwidth 取得字体宽度imagettfbbox取得使用 TrueType 字体的文本的范围imageloadfont载入一新字体imagepsencodefont改变字体中的字符编码矢量imagepsextendfont扩充或精简字体// 导出画布为图片imagegif以GIF格式将图像输出到浏览器或文件imagepng以PNG格式将图像输出到浏览器或文件imagejpeg以JPEG格式将图像输出到浏览器或文件imagewbmp以WBMP格式将图像输出到浏览器或文件通过header()发送 "Content-type: image/图片格式" 可以使PHP脚本直接输出图像。header("Content-type: image/gif"); imagegif($im);imagegd 将 GD 图像输出到浏览器或文件imagegd2将 GD2 图像输出到浏览器或文件// 释放画布资源imagedestroy销毁图像// 图像信息image_type_to_extension 取得图像类型的文件后缀getimagesize取得图像大小imagesx 取得图像宽度imagesy 取得图像高度imageistruecolor检查图像是否为真彩色图像imagetypes 返回当前 PHP 版本所支持的图像类型// 图像设置imagerotate 用给定角度旋转图像imagealphablending 设定图像的混色模式imageantialias 是否使用抗锯齿(antialias)功能imagefilter 对图像使用过滤器imagegammacorrect对 GD 图像应用 gamma 修正imageinterlace 激活或禁止隔行扫描/* 【缩略图】【水印】 */imagecopyresampled 重采样拷贝部分图像并调整大小bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )imagecopymerge 拷贝并合并图像的一部分bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )getimagesize取得图像大小array getimagesize ( string $filename [, array &$imageinfo ] )/* 【URL函数】 */get_headers — 取得服务器响应一个 HTTP 请求所发送的所有标头get_meta_tags — 从一个文件中提取所有的 meta 标签 content 属性,返回一个数组http_build_query — 生成 URL-encode 之后的请求字符串urldecode — 解码已编码的URL字符串urlencode — 编码URL字符串parse_url — 解析URL,返回其组成部分"http://username:password@hostname/path?arg=value#anchor"scheme(如http), host, port, user, pass, path, query(在问号?之后), fragment(在散列符号#之后)//编码可用于交换多个变量$a = "中国";$b = "四川";$a = urlencode($a);$b = urlencode($b);$a = $a."&".$b;$b = explode("&", $a);$a = urldecode($b[1]);$b = urldecode($b[0]);echo $a, $b;//list()函数用于交换变量list($a, $b) = array($b, $a);/* 【文件、目录】 */dirname($path) 返回路径中的目录部分basename($path [,$suffix]) 返回路径中的文件名部分pathinfo($path [,$options]) 返回文件路径的信息(数组元素:dirname,basename,extension)realpath($path) 返回规范化的绝对路径名copy($source, $dest)拷贝文件unlink($file)删除文件rename($old, $new) 重命名或移动一个文件或目录mkdir($path [,$mode [,$recursive]]) 新建目录$mode表示权限,默认0777$recursive表示可创建多级目录,默认falsermdir($dir) 删除目录(目录必须为空,且具有权限)file_exists($file) 检查文件或目录是否存在is_file($file) 判断文件是否存在且为正常的文件is_dir($file)判断文件名是否存在且为目录is_readable($file) 判断文件或目录是否可读is_writable($file) 判断文件或目录是否可写is_executable($file)判断给定文件名是否可执行is_link($file) 判断给定文件名是否为一个符号连接tmpfile(void)建立一个临时文件tempnam($dir, $prefix) 在指定目录中建立一个具有唯一文件名的文件file($file) 把整个文件读入一个数组中fopen($filename, $mode [,$use_include_path])$mode参数:(加入"b"标记解决移植性)"r" 只读方式打开,将文件指针指向文件头。"r+"读写方式打开,将文件指针指向文件头。"w" 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。"w+"读写方式打开,将文件指