php 学习笔记

   1 //本文转自:http://www.cnblogs.com/ronghua/p/6002995.html
   2 
   3 //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出。
   4 
   5 
   6 /* 【命名规则】 */
   7 常量名 类常量建议全大写,单词间用下划线分隔    // MIN_WIDTH
   8 变量名建议用下划线方式分隔            // $var_name
   9 函数名建议用驼峰命名法                // varName
  10 定界符建议全大写                 // <<<DING, <<<'DING'
  11 文件名建议全小写和下划线、数字        // func_name.php
  12 私有属性名、方法名建议加下划线        // private $_name _func
  13 接口名建议加I_                    // interface I_Name
  14 
  15 /* 语言结构 */
  16 array(), echo(), empty(), eval(), exit(), isset(), list(), print(), unset()
  17 echo, print 可省略括号。
  18 
  19 /* 预定义常量 */
  20 PATH_SEPARATOR  //路径分隔符(Windows为分号,类Unix为冒号)
  21 DIRECTORY_SEPARATOR //目录分隔符
  22 PHP_EOL //当前系统的换行符
  23 PHP_VERSION //PHP版本号
  24 PHP_OS  //PHP服务操作系统
  25 PHP_SAPI    //用来判断是使用命令行还是浏览器执行的,如果 PHP_SAPI=='cli' 表示是在命令行下执行
  26 PHP_INT_MAX                    INT最大值,32位平台时值为2147483647
  27 PHP_INT_SIZE                   INT字长,32位平台时值为4(4字节)
  28 M_PI    //圆周率值
  29 M_E     //自然数
  30 
  31 //PHP运行环境检测函数
  32 php_sapi_name() //返回一个PHP与WEB服务器接口类型的小写字符串
  33 该函数返回值与常量PHP_SAPI一致!
  34 接口类型:SAPI(the Server API, SAPI)
  35 可能值:aolserver、apache、apache2filter、apache2handler、caudium、cgi、cgi-fcgi、cli、 continuity、embed、isapi、litespeed milter、nsapi、phttpd、pi3web、roxen、thttpd、tux、webjames
  36 
  37 
  38 /* 大小写问题 */
  39 - 类名、方法名、属性名、函数名:不区分大小写
  40 - 变量名、常量名、元素下标:区分大小写
  41 
  42 /* 可变标识符 */
  43 可变变量  $i = 3; $k = 'i'; echo $$k; //输出3
  44 可变函数  function func() {echo 'hello!';} $i = 'func'; $i(); //输出hello
  45 可变下标  $i = '1234'; $k = 3; echo $i[$k];   //输出4
  46 可变类名  class CLS{public $k = 'hello';} $i = 'CLS'; $j = new $i; echo $j->k;
  47 可变属性  class CLS{public $k = 'hello';} $i = 'k'; $j = new CLS; echo $j->$i;
  48 可变方法  class CLS{public function k(){echo 'hello';}} $i='k'; $j=new CLS; $j->$i();
  49 
  50 /* 可变变量 */
  51 * 用于业务逻辑判断得到某些具体信息
  52     $var_name = "class_name";
  53     $$var_name = "PHP0913";        // $class_name = "PHP0913";$class_name已存入内存中
  54     var_dump($class_name);        // var_dump($$var_name);
  55 
  56 /* 变量函数 */
  57 get_defined_vars    //返回由所有已定义变量所组成的数组(包括环境变量、服务器变量和用户定义的变量)
  58 
  59 
  60 /* unset() */
  61 * unset()仅删除当前变量名和引用,其值并未被删除
  62 * 引用传递中,删除一个变量及其引用,其他变量及引用均存在,且值依然存在
  63 
  64      echo "<br />";
  65     $v3 = '值';
  66     $v4 = &$v3;
  67     unset($v4);
  68     var_dump($v3, $v4);
  69 
  70 /* 变量的最长有效期 */
  71 * 当前脚本的执行周期,脚本执行结束,变量即消失
  72 
  73 
  74 /* 预定义变量/超全局变量 */
  75 $GLOBALS
  76 $_COOKIE
  77 $_ENV
  78 $_FILES
  79 $_GET
  80 $_POST
  81 $_REQUEST
  82 $_SERVER
  83 $_SESSION
  84 
  85 
  86 /* 常量定义 */
  87 define(常量名, 常量值, [区分大小写参数])        //true表示不区分/false表示区分大小写
  88 const 常量名 = 常量值    // 新,建议
  89 常量名可以使用特殊字符
  90 constant($name)        // 获取常量名
  91                     // 例:echo constant('-_-');
  92 
  93 
  94 /* 常量相关函数 */
  95 defined
  96 get_defined_constants
  97 
  98 
  99 /* 预定义常量 */
 100 __FILE__            所在文件的绝对路径
 101 __LINE__            文件中的当前行号
 102 __DIR__            文件所在目录
 103 __FUNCTION__        函数名称
 104 __CLASS__            类的名称
 105 __METHOD__        类的方法名
 106 __NAMESPACE__        当前命名空间的名称
 107 
 108 
 109 /* 整型 */
 110 整型占用4字节,共4*8=32位,最大值为2147483647,最小值为-2147483648,最小值的绝对值比最大值的大1
 111 最高为表示正负,1表示负,0表示正
 112 
 113 
 114 /* 进制转换函数 */
 115 只能十进制与其他进制进行转换,只有六种
 116 转换时,参数应是字符串(即不可含八进制的“0”或十六进制的“0x”)
 117     dec
 118      bin
 119      oct
 120     hex
 121 hexdec()    十六进制转十进制        也可写hex2dec()
 122 dechex()    十进制转十六进制        也可写dec2hex()
 123 bindec()    二进制转十进制        也可写bin2dec()
 124 decbin()    十进制转二进制        也可写dex2bin()
 125 octdec()    八进制转十进制        也可写oct2dec()
 126 decoct()    十进制转八进制        也可写dec2oct()
 127 
 128 
 129 /* 浮点数 */
 130 浮点数不能比较大小 !!!
 131 几乎所有小数,在保存时都是近似值而不是精确值!
 132 最大值:+/- 1.8E308
 133 PHP所能保存的最长小数位:14位
 134 
 135 /* 单引号字符串 */
 136 单引号字符串中,只能转义反斜杠和单引号
 137 
 138 /* 双引号字符串 */
 139 只解析字符串一次 !!!
 140 eval     把字符串作为PHP代码执行
 141 大括号包裹变量,可确定变量名界限。如:"aaa{$bbb}ccc"
 142 双引号中可以将ASCII码转换为字符
 143 "\x61" -> a    // 字符串中不需0,整型中才是0x前导
 144 "\x49\x54\x43\x41\x53\x54" -> ITCAST
 145 将ASCII转成字符函数chr()
 146 将字符转成ASCII函数ord()
 147 #双引号转义列表
 148 \n 换行
 149 \r 回车
 150 \t 水平制表符
 151 \\ 反斜线
 152 \$ 美元标记
 153 \v 垂直制表符
 154 \e Escape
 155 \f 换页
 156 \" 双引号"
 157 \[0-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符  
 158 \x[0-9A-Fa-f]{1,2} 符合该正则表达式序列的是一个以十六进制方式来表达的字符  
 159 
 160 
 161 
 162 /* 定界符 */
 163 herodoc - 功能同双引号,能解析
 164 $str = <<<AAA
 165 字符串内容
 166 AAA;
 167 
 168 nowdoc - 功能同单引号,不能解析
 169 只在开始位置有单引号
 170 $str = <<<'AAA'
 171 字符串内容
 172 AAA;
 173 
 174 
 175 /* 字符串的使用 */
 176 可将字符串当作一个字符的集合来使用,可独立访问每个字符。仅适用于单字节字符(字母、数字、半角标点符号),像中文等不可用
 177 $str = "abcd";
 178 echo $str[3];   // d
 179 echo $str{0};   // a
 180 
 181 
 182 /* 【类型操作函数】 */
 183 //获取/设置类型
 184 gettype($var) //获取变量的数据类型
 185 settype($var, $type) //设置变量的数据类型
 186 
 187 //类型判断
 188 is_int
 189 is_float
 190 is_null
 191 is_string
 192 is_resource
 193 is_array
 194 is_bool
 195 is_object       
 196 is_numeric      检测变量是否为数字或数字字符串
 197 
 198 //转换成指定的数据类型
 199 boolval
 200 floatval
 201 intval
 202 strval
 203 
 204 //强制转换类型
 205 (int)
 206 (float)
 207 (string)
 208 (bool)
 209 (array)
 210 (object)
 211 (unset) //转换为NULL
 212 (binary) 转换和 b前缀转换  //转换成二进制
 213 
 214 var_dump        打印变量的相关信息。
 215                 显示关于一个或多个表达式的结构信息,包括表达式的类型与值。
 216                 数组将递归展开值,通过缩进显示其结构。
 217 var_export($var [,bool $return]) //输出或返回一个变量的字符串表示
 218     $return:为true,则返回变量执行后的结果
 219 print_r         打印关于变量的易于理解的信息
 220 empty           检查一个变量是否为空
 221 isset           检测变量是否存在
 222 
 223 /* 【流程控制】 */
 224 //if语句的替代语法
 225 if (条件判断) :
 226    语句块;
 227 elseif (条件判断) :
 228    语句块;
 229 else :
 230    语句块;
 231 endif;
 232 
 233 //流程控制的替代语法
 234 在嵌入HTML时常用
 235 将 { 换成 : , 将 } 换成 endif; 等
 236 endif
 237 endwhile
 238 endfor
 239 endforeach
 240 endswitch
 241 
 242 
 243 /* 【switch】 */
 244 switch (条件) {
 245    case 状态值1:
 246        语句块;
 247        [break;]
 248    case 状态值2:
 249        语句块;
 250        [break;]
 251    case 状态值3:
 252    case 状态值4:
 253        语句块;
 254        [break;]
 255    default:
 256        语句块;
 257        [break;]
 258 }
 259 switch是状态分支,特殊的循环
 260 先计算出状态值,再去与判断数作比较
 261 break退出流程
 262 
 263 
 264 /* 【for循环】 */
 265 for (条件初始化表达式; 条件判断表达式; 条件变化表达式) {
 266 循环体
 267 }
 268 
 269 假设循环体被执行了N次,则
 270 条件初始化表达式被执行1次
 271 条件判断表达式被执行N+1次
 272 条件变化表达式被执行N次
 273 
 274 注意:
 275     1. 循环变量在for语句结束后还可以继续使用,值为第一次失败的值
 276     2. 循环变量在for循环体内可以使用
 277     3. 任何条件表达式均可省略,但分号不能省略
 278         a. 条件初始化表达式被省略时,循环变量被赋值为null,在与条件判断时,
 279             进行类型转换后再比较。也可以在for语句外进行初始化。
 280         b. 条件判断表达式被省略时,表示循环为真,进入死循环
 281         c. 条件变化表达式被省略时,可以在循环体内完成
 282     4. 每个表达式均可由多条语句组成,每条语句之间使用逗号分割
 283         如果条件判断表达式由多条语句组成,都会执行,但只有最后一条语句才作为判断条件
 284     5. for只能遍历数值型索引下标数组
 285         数组长度函数:count()
 286     6. 应该将可以初始化的语句均放在条件初始化表达式内,这样可以省去很多执行次数
 287 
 288 
 289 /* 【goto】5.3+ 版本 */
 290 用来跳转到程序中的某一指定位置
 291 该目标位置可以用目标名称 加上冒号来标记。
 292 PHP中的goto有一定限制,只能在同一个文件和作用域中跳转,
 293     也就是说你无法跳出一个函数或类方法,也无法跳入到另一个函数。
 294     你也无法跳入到任何循环或者switch结构中。
 295     常见的用法是用来跳出循环或者switch,可以代替多层的break。 
 296 可以从循环(switch)中跳出来,但不能从外部跳转进去。而函数或类方法,向外向内均不可。
 297 goto a;
 298 echo 'Foo';
 299 a:
 300 echo 'Bar';
 301 
 302 
 303 /* 【文件加载】 */
 304 require / include / require_once / include_once
 305 文件载入只是载入目标文件内的代码并执行,与载入的文件类型无关
 306 
 307 文件载入属于执行阶段,当执行到require等语句时,才载入该文件的代码,
 308     编译并执行,然后回到require等语句位置继续执行下面的语句
 309 【注意】
 310     在载入开始时,先退出PHP模式;
 311     再载入目标文件代码,执行该代码;
 312     结束时,再进入PHP模式。
 313 require:处理失败,产生 E_COMPILE_ERROR 错误,脚本中止。
 314 include:处理失败,产生 E_WARNING 错误,脚本继续执行。
 315 
 316 #不建议使用require_once/include_once
 317 
 318 
 319 /* 【相对路径】 */
 320 当前浏览器请求的哪个脚本,当前位置就是属于哪个脚本。
 321 ./filefile 都表示当前目录下的file文件
 322 file情况(嵌套载入文件时):
 323 如果当前目录没找到该文件就在代码文件所在目录中继续找。
 324 如果当前目录找到有该文件,则不会再在代码文件所在目录去找也不会再加载。
 325 __DIR__     脚本文件所在目录
 326 __FILE__    脚本文件路径
 327 
 328 include_path    加载文件查找目录
 329     set_include_path()  设置include_path,可多个,用字符串作参数
 330     该函数设置的path只针对该当前文件有效
 331     该设置只针对查找未直接写文件路径方式有效
 332     设置新的include_path会覆盖原来的
 333 
 334     get_include_path()  获取当前include_path设置项,无参数
 335 
 336     路径分隔符,在Windows下是分号,在Linux下是冒号
 337     利用预定义常量 PATH_SEPARATOR 来获得当前的分隔符
 338 
 339 如果直接写文件名:
 340     1. include_path所设置的
 341     2. 当前目录
 342     3. 代码所在文件的目录
 343 如果文件名前带有路径,则会直接根据路径查找,include_path直接被忽略
 344 
 345 
 346 /* 【return】 */
 347 return与require结合,可返回文件的内容,return写在被载入的文件内
 348 return可以终止所在脚本的执行,作为普通脚本语句
 349 return可以返回函数的相应值
 350 
 351 
 352 /* 【终止和延迟脚本执行】 */
 353 die / exit   终止
 354 return是终止所在脚本的执行
 355 die和exit会立即终止脚本执行
 356 die("到此为止");     该函数内的字符串可被输出
 357 sleep()  延迟(单位:秒)
 358     默认最多可延迟30秒,PHP配置可以修改 max_execution_time
 359     例:sleep(12);
 360 usleep()    以指定的微秒数延迟执行
 361 time_sleep_until    使脚本睡眠到指定的时间为止
 362 
 363 
 364 /* 【函数】 */
 365 1. 函数的声明是在编译时,故先定义再调用,定义与调用无先后关系!
 366 2. 文件只是代码的载体,程序均在内存中执行!
 367 3. 如果函数的定义在需要载入的文件内,则需要先载入该文件,否则调用出错!
 368 4. 函数的定义可以出现在其他的代码段中,此时函数不会在编译阶段被执行
 369     只有被执行到时才会被定义!只有独立定义时才会被编译在内存中!
 370     如果出现在其他函数体内,也需要外层函数被调用时才被定义并生效!
 371 5. 函数名不区分大小写
 372 6. 不允许重名,包括系统函数
 373 7. 【可变函数】
 374     函数名可以用其他变量代替
 375     $func_name = "sayHello";
 376     $func_name();       //此时调用sayHello()函数
 377     注意:只有在调用时才能使用变量,定义时不允许!
 378 8. 变量可作为函数名调用函数,数组元素值也可以!
 379 9. 形式参数parameter,实际参数argument
 380     可以对参数传递 null,表示该形参不想传递值
 381     形参与实参之间既可值传递,也可引用传递。
 382     引用传递参数,应该在定义函数时就在形式参数前加上 & 符号,而此时调用函数实参必须为变量
 383     如何选择使用哪种传递方式?
 384         a. 是否需要保证原始数据的完整性
 385         b. 是否需要增加效率
 386         c. 对大数据引用传递可节省内存
 387 10. 参数默认值
 388         a. 函数的参数默认值必须是已经确定的值,不能是变量!
 389             只要在调用之前定义该常量,则可以使用常量作为参数默认值
 390         b. 函数默认值可以有多个,建议将有默认值的参数放在参数列表的最后面
 391            这样可以在调用函数时,不赋予后面有默认值的参数值,否则会出错
 392         c. 默认参数可以是非标量类型,比如数组、null
 393         d. 任何默认参数必须放在任何非默认参数的右侧
 394 11. 参数数量
 395     a. 形参数量多于实参数量
 396         报告警告级别错误,并以NULL代替
 397     b. 实参多于形参
 398         不报告错误,依次为形参赋值
 399     c. 不确定参数数量
 400         1) 一个形参都不定义,永远都是实参多于形参
 401         2) 【可变数量参数】
 402             func_get_args() 获取当前函数被调用时所有实参的值,返回一个所有实参值组成的数组
 403             func_get_arg()  获取某个实参的值,通过索引值标识,e.g: func_get_arg(0)
 404             func_num_args() 获取所有实参的数量
 405 12. 【return】返回值
 406     a. 函数只有一个返回值,可以通过返回一个数组来得到类似的结果,但可以有多条return语句
 407     b. return语句会立即中止函数的运行,并将控制权交回调用该函数的代码行
 408     c. 可以返回包括数组和对象的任意类型
 409     d. 函数的返回也分值传递和引用传递(返回的是一个变量才可)
 410         1) 默认是值传递方式
 411         2) 引用传递方式:
 412             - 定义函数时,函数名前加上& 表示该函数可以返回引用
 413             - 调用函数时,函数名前加上& 表示取得函数返回的引用
 414                 此时,函数外修改返回值,会修改函数内的该返回变量的值
 415             - 如果函数需返回引用,则需要返回一个变量才可以
 416             - 从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符&
 417                 function &returns_reference(){return $someref;}
 418                 $newref =& returns_reference();
 419         3) 返回引用的作用
 420 
 421 
 422 /* 【变量作用域】 */
 423 a. 全局变量和局部变量
 424     1) 作用域之间不重叠,即不同作用域的变量,之间不可访问
 425     2) 全局作用域  - 函数之外的区域
 426     3) 局部作用域  - 函数内的区域,每个函数都是一个独立的作用域
 427 
 428 b. 超全局变量,既可以在全局也可在局部使用,仅能用系统自带的,均是数组变量。
 429     $GLOBALS    $_COOKIE    $_ENV       $_FILES $_GET
 430     $_POST      $_REQUEST   $_SERVER    $_SESSION
 431 c. $GLOBALS
 432     1) 不能存在超全局变量,但可以有超全局的数据!
 433     2) 将需要的数据放到超全局变量的数组内,但统一使用$GLOBALS
 434     3) $GLOBALS 特征
 435         - 每个全局变量就是对应$GLOBALS内的一个元素 436             每当增加一个全局,则自动在$GLOBALS内增加一个同名元素 437             同理,每当增加元素,也会增加一个全局变量,一般在函数内增加
 438         - 做的任何修改,也会映射到另一个,包括更新和删除
 439             在函数内访问全局变量,只需使用$GLOBALS
 440         - 出现过的全局变量,就可以通过$GLOBALS这个数组取得
 441     4) PHP生命周期中,定义在函数体外部的所谓全局变量,函数内部是不能直接获得的
 442 4) global关键字(不建议使用)
 443     将局部变量声明为同名全局变量的一个'引用'!相当于常量的引用传递
 444         global $var;    // $var = &$GLOBALS['var'];
 445         不同于$GLOBALS!!!
 446     global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量。
 447     $GLOBALS确确实实调用是外部的变量,函数内外会始终保持一致。
 448     global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。
 449 d. 
 450     1) 作用域只针对变量,对常量无效
 451     2) 被载入文件中定义的变量作用域取决于被载入的位置。
 452         函数外被载入就是全局,函数内被载入就是局部!
 453 
 454 
 455 /* 【变量生命周期】 */
 456 1. 脚本结束时,全局变量消失
 457 2. 函数执行完时,局部变量消失
 458 3. 静态变量
 459     static关键字
 460         静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
 461         静态变量仅会被初始化一次,其他局部变量每次被调用时都会被重新赋值。
 462         static声明的静态变量的生命周期会被一直延续。
 463 
 464 
 465 /* 【迭代和递归】 */
 466 迭代比递归效率高!
 467 迭代是一种思想(算法),结构和使用上如同循环!
 468 递归是一种思想(算法),将大问题拆分成小问题,逐一解决小问题以解决大问题
 469     要求大问题和小问题的解决方案是一致的!
 470     递归的结构和语法体现如图函数。函数体内调用函数本身!
 471     递归出口:当该问题可以解决时,则不用再递归
 472 
 473 
 474 /* 【匿名函数/闭包函数】 */
 475 匿名函数,也叫闭包函数(closures),允许临时创建一个没有指定名称的函数。
 476 
 477 1. 定义匿名函数时,不需增加函数名。
 478 2. PHP对匿名函数的管理,以一个对象的方式进行处理。
 479 3. 匿名函数应该存放到变量内。
 480 4. 匿名函数通过Closure类来实现
 481 5. 可以使用函数作为函数的参数和返回值
 482 6. 声明函数时可以使用 use($param) 来向函数中传入函数外的变量,结合变量引用来实现闭包
 483 7. 可以用变量引用函数
 484 $func = function ($e) {
 485     echo $e;
 486 };   //结束时,需分号结束,如同变量赋值
 487 var_dump($func);     //使用匿名函数
 488 $func('ITCAST');     //函数的调用
 489     这不是可变函数,而是对象。Closure闭包类
 490 //use语法
 491 匿名函数倾向于值的概念,可能出现在任何地方。
 492 use可以使得匿名函数使用其外部作用域的变量。非全局!
 493 use与全局的区别:
 494     use使用其外部作用域的变量
 495 function out() {
 496     $v = "in out";
 497     $func = function () use (& $v) {
 498         var_dump($v);
 499     }
 500 }
 501     use类似参数的自动传递,也支持值与引用的传递方式。
 502 //作用
 503     常作为'临时函数'被调用(只在某个地方被调用的函数)
 504     例如:
 505         PHP存在一个array_map()函数,功能是针对一个函数内每个元素,去调用某个函数
 506         操作结果(array) = array_map(操作函数, 操作数组);
 507         $result_arr = array_map(function ($v) {return $v3}, $arr);
 508 
 509 //闭包用法实例
 510 function closureCreater() {
 511     $x = 1;
 512     return function($fun = null) use(&$x) {//按引用传值
 513         echo "<br />" . $x++;
 514         $fun and $fun();
 515     };
 516 }
 517 
 518 $x = "hello world";
 519 $test = closureCreater();
 520 $test();
 521 $test(function(){ echo "closure test one"; });
 522 $test(function(){ echo "closure test two"; });
 523 $test(function() use($x){ echo "<br />".$x;});
 524 
 525 //将函数保存为数组元素
 526 $x = 'outer param.';
 527 $arr = array();
 528 $arr[] = function($str)use($x){ return $str.$x; };
 529 echo $arr[0]('test fun in arr,');
 530 
 531 
 532 /* 【数组】 */
 533 关联数组:键和值有关联,键表示值的逻辑含义。
 534 索引数组:键和值无关联,键表示值的位置。通常下标从0开始,递增元素
 535 count($var [,$mode]) //统计数组元素个数
 536     $mode可选,设为1或true时则递归统计
 537     $var非数组,返回1;$var未初始化或等于null或空数组,返回0
 538 
 539 //键名的使用
 540 整型数字键不需加引号($arr[1])
 541 字符串数字键也不需加引号($arr = array('1'=>'abc'); $arr[1])
 542 关联数组,字符串键需加引号($arr = array('a'=>'aaa'); $arr['a'])
 543 关联数组,双引号中解析变量,可不加引号($arr = array('a'=>'aaa'); "$arr[a]")
 544 
 545 /* 【指针】 */
 546 current/pos    返回当前被内部指针指向的数组单元的值,并不移动指针。
 547 key            返回数组中当前单元的键名,并不移动指针
 548 next        将数组中的内部指针向前移动一位,并返回移动后当前单元的值。先移动,再取值。
 549 prev        将数组的内部指针倒回一位,并返回移动后当前单元的值先移动,再取值。
 550 end            将数组的内部指针指向最后一个单元,并返回最后一个单元的值
 551 reset        将数组的内部指针指向第一个单元,并返回第一个数组单元的值
 552 
 553 each    返回数组中当前的键/值对并将数组指针向前移动一步。
 554             返回的是一个由键和值组成的长度为4的数组,下标0和key表示键,下标1和value表示值
 555                 在执行each()之后,数组指针将停留在数组中的下一个单元
 556                     或者当碰到数组结尾时停留在最后一个单元。
 557                     如果要再用 each 遍历数组,必须使用 reset()。
 558 
 559     1. 以上指针操作函数,除了key(),若指针移出数组,则返回false。而key()移出则返回null。
 560     2. 若指针非法,不能进行next/prev操作,能进行reset/end操作
 561     3. current/next/prev     若遇到包含空单元(0或"")也会返回false。而each不会!
 562 
 563 list    把数组中的值赋给一些变量。list()是语言结构,不是函数
 564             仅能用于数字索引的数组并假定数字索引从0开始
 565             /* 可用于交换多个变量的值 */ list($a, $b) = array($b, $a);
 566     例:list($drink, , $power) = array('coffee', 'brown', 'caffeine');
 567 
 568 1. 复制数组,其指针位置也会被复制。
 569     特例:如果数组指针非法,则拷贝的数组指针会重置,而原数组的指针不变。
 570     【指针问题】
 571         谁第一个进行写操作,就会开辟一个新的值空间。与变量(数组变量)值传递给谁无关。
 572         数组函数current()被定义为写操作,故会出现问题。
 573         foreach遍历的是数组的拷贝,当被写时,才会开辟一个新的值空间。
 574             即,foreach循环体对原数组进行写操作时,才会出现指针问题。
 575             如果开辟新空间时指针非法,则会初始化指针。
 576 2. 如果指针位置出现问题,则reset()初始化一下就可解决。
 577 
 578 
 579 /* 【遍历数组】 */
 580 * 先找到元素,再获取键和值
 581 
 582 foreach
 583     foreach (array_expression as [$key =>] & $value)
 584       当foreach开始执行时,数组内部的指针会自动指向第一个单元。
 585       获取元素信息后,移动指针,再执行循环体
 586       1. foreach本身循环结构,break和continue适用于foreach
 587       2. foreach支持循环的替代语法。
 588       3. $value是保存元素值的变量,对其修改不会改变数组的元素值
 589       4. $value支持元素值的引用拷贝,在$value前加上&即可
 590       5. $key不支持引用传递
 591       6. foreach遍历的是原数组的拷贝,而在循环体对数组的操作是操作原数组
 592             即循环体对数组的操作,对原数组生效,对遍历不生效。
 593             先拷贝一份数组用作遍历
 594 
 595 while...list...each
 596 while (list($key, $val) = mysql_fetch_row($result)) = each($arr) {
 597   echo "$key => $val\n";
 598 }
 599 
 600 
 601 
 602 /* 【数组函数】 */
 603 //统计计算
 604 count        计算数组中的单元数目或对象中的属性个数
 605 array_count_values  统计数组中所有的值出现的次数
 606 array_product       计算数组中所有值的乘积
 607 array_sum           计算数组中所有值的和
 608 range        建立一个包含指定范围单元的数组
 609 
 610 //获取数组内容
 611 array_chunk        将一个数组分割成多个
 612     array array_chunk(array $input, int $size[, bool $preserve_keys]) 
 613 array_filter    用回调函数过滤数组中的单元
 614 array_slice     从数组中取出一段
 615     array array_slice($arr, $offset [,$len [,$preserve_keys]])
 616 array_keys        返回数组中所有的键名
 617     array array_keys(array $input[, mixed $search_value[, bool $strict]] )
 618     如果指定了可选参数 search_value,则只返回该值的键名。否则input数组中的所有键名都会被返回。
 619 array_values    返回数组中所有的值,并建立数字索引
 620 
 621 array_merge        合并一个或多个数组
 622     一个数组中的值附加在前一个数组的后面。
 623     如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。
 624     如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
 625     如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。 
 626 array_merge_recursive    递归地合并一个或多个数组
 627 
 628 //搜索
 629 in_array            检查数组中是否存在某个值
 630     bool in_array(mixed $needle, array $haystack[, bool $strict])
 631 array_key_exists    检查给定的键名或索引是否存在于数组中
 632     isset()对于数组中为NULL的值不会返回TRUE,而 array_key_exists()会
 633 array_search        在数组中搜索给定的值,如果成功则返回相应的键名
 634 
 635 array_combine    创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
 636     如果两个数组的单元数不同或者数组为空时返回FALSE。
 637 array_rand        从数组中随机取出一个或多个单元,返回键名或键名组成的数组,下标是自然排序的
 638 array_fill      用给定的值填充数组
 639     array_fill($start, $num, $value)
 640 array_flip      交换数组中的键和值
 641 array_pad       用值将数组填补到指定长度
 642 array_reverse   返回一个单元顺序相反的数组
 643 array_unique    移除数组中重复的值
 644 array_splice    把数组中的一部分去掉并用其它值取代
 645 
 646 implode            将数组元素值用某个字符串连接成字符串
 647 explode($delimiter, $str [,$limit])    //使用一个字符串分割另一个字符串
 648     $delimiter不能为空字符串""
 649 
 650 array_map        将回调函数作用到给定数组的单元上,只能处理元素值,可以处理多个数组
 651     如果callback参数设为null,则合并多个数组为一个多维数组
 652 array_walk        对数组中的每个成员应用用户函数,只能处理一个数组,键和值均可处理,与foreach功能相同
 653     bool array_walk ( array &$array , callback $funcname [, mixed $userdata ] )
 654 
 655 //栈:后进先出
 656 入栈和出栈会重新分配索引下标
 657 array_push        将一个或多个单元压入数组的末尾(入栈)
 658 array_pop        将数组最后一个单元弹出(出栈)        使用此函数后会重置(reset())array 指针。
 659 
 660 //队列:先进先出
 661 队列函数会重新分配索引下标
 662 array_unshift    在数组开头插入一个或多个单元
 663 array_shift        将数组开头的单元移出数组            使用此函数后会重置(reset())array 指针。
 664 
 665 //排序函数
 666 sort            对数组排序
 667 rsort            对数组逆向排序
 668 asort            对数组进行排序并保持索引关系
 669 arsort            对数组进行逆向排序并保持索引关系
 670 ksort            对数组按照键名排序
 671 krsort            对数组按照键名逆向排序
 672 usort            使用用户自定义的比较函数对数组中的值进行排序
 673 uksort            使用用户自定义的比较函数对数组中的键名进行排序
 674 uasort            使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
 675 natsort            用用“自然排序”算法对数组排序
 676 natcasesort        用“自然排序”算法对数组进行不区分大小写字母的排序
 677 array_multisort 对多个数组或多维数组进行排序
 678 shuffle            将数组打乱
 679     引用传递参数,返回bool值。
 680     重新赋予索引键名,删除原有键名
 681 
 682 //差集
 683 array_udiff_assoc   带索引检查计算数组的差集,用回调函数比较数据
 684 array_udiff_uassoc  带索引检查计算数组的差集,用回调函数比较数据和索引
 685 array_udiff         用回调函数比较数据来计算数组的差集
 686 array_diff_assoc    带索引检查计算数组的差集
 687 array_diff_key      使用键名比较计算数组的差集
 688 array_diff_uassoc   用用户提供的回调函数做索引检查来计算数组的差集
 689 array_diff_ukey     用回调函数对键名比较计算数组的差集
 690 array_diff          计算数组的差集
 691 //交集
 692 array_intersect_assoc 带索引检查计算数组的交集
 693 array_intersect_key 使用键名比较计算数组的交集
 694 array_intersect_uassoc 带索引检查计算数组的交集,用回调函数比较索引
 695 array_intersect_ukey 用回调函数比较键名来计算数组的交集
 696 array_intersect 计算数组的交集
 697 array_key_exists 用回调函数比较键名来计算数组的交集
 698 array_uintersect_assoc 带索引检查计算数组的交集,用回调函数比较数据
 699 array_uintersect 计算数组的交集,用回调函数比较数据
 700 
 701 extract($arr [,$type [,$prefix]])   从数组中将变量导入到当前的符号表(接受结合数组$arr作为参数并将键名当作变量名,值作为变量的值)
 702 compact($var [,...])   建立一个数组,包括变量名和它们的值(变量名成为键名而变量的内容成为该键的值)
 703 
 704 
 705 
 706 
 707 /* 【伪类型】 */
 708 mixed        说明一个参数可以接受多种不同的(但并不必须是所有的)类型。
 709 number        说明一个参数可以是 integer 或者 float 710 callback    回调函数
 711 void        void作为返回类型意味着函数的返回值是无用的。
 712             void作为参数列表意味着函数不接受任何参数。
 713 
 714 
 715 /* 【数据库操作】 */
 716 #连接认证
 717 mysql_connect        连接并认证数据库
 718 #发送SQL语句,接收执行结果
 719 mysql_query            发送SQL语句
 720         仅对select, show, explain, describe语句执行成功返回一个资源标识符,其他语句成功返回true。执行失败均返回false。
 721 #处理结果
 722 mysql_fetch_assoc    从结果集中取得一行作为关联数组
 723         每次只取回一条,类似each
 724     结果集中记录指针
 725 mysql_fetch_row        从结果集中取得一行作为枚举数组
 726 mysql_fetch_array    从结果集中取得一行作为关联数组,或数字数组,或二者兼有
 727     array mysql_fetch_array ( resource $result [, int $ result_type  ] )
 728     可选参数result_type可选值为:MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH(默认)
 729 mysql_free_result    释放结果内存
 730 #关闭链接
 731 mysql_close            关闭连接
 732 
 733 
 734 /* 【类和对象】 */
 735 # 成员:
 736     类成员:类常量、静态属性、静态方法
 737     对象成员:非静态属性、非静态方法
 738     # 除此外,类不能包含任何其他东西!!!
 739 
 740 # 类名、方法名、属性名均不区分大小写
 741 # $this代表本对象,self代表本类,parent代表父类
 742 # 类和函数均可被事先编译(仅作为最外层时)
 743 # 类的定义必须在单一的PHP区块内,不能被多个PHP标签分割
 744 
 745 // 构造方法
 746 - 具有构造函数的类会在每次创建新对象时先调用此方法
 747 void __construct([ mixed $args [, $... ]] )
 748 - 构造方法所需参数由new实例化对象时,给类增加参数值。
 749 - 构造方法也可以被手动调用。
 750 - 5.3.3版本以前,支持于类名同名的方法作为构造方法。
 751 - 两种冲突时,__construct 优先
 752 
 753 // 析构方法
 754 - 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
 755 void __destruct( void )
 756 # 作用:释放对象所占用的资源
 757 # 调用的时机 
 758     - 脚本结束时所有资源均被释放,包括对象
 759     - 手动删除对象时
 760     - 保存对象的变量被赋予新值时(任何值,包括null)
 761     - 在使用exit()终止脚本运行时也会被调用
 762 
 763 // 静态成员(static关键字)
 764     - 声明类成员或方法为static,就可以不实例化类而直接访问。
 765     - 静态成员(属性或方法)均属于类,故不能通过$this或->访问。
 766     - 静态成员是所有对象共享,属于类。
 767     - 静态成员用类调用,非静态成员用对象调用。
 768 # 静态属性
 769     - 静态属性不可以由对象通过->操作符来访问。
 770     - 静态属性只能被初始化为一个字符值或一个常量,不能使用表达式。 所以你可以把静态属性初始化为整型或数组,但不能指向另一个变量或函数返回值,也不能指向一个对象。
 771 # 静态方法
 772     - 由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用 773     - 用::方式调用一个非静态方法会导致一个E_STRICT级别的错误。
 774 
 775 // 访问解析操作符(::)
 776     - 可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。 
 777     - 当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。 
 778     - self 和 parent 这两个特殊的关键字是用于在类的内部对成员或方法进行访问的。
 779 
 780 // 访问辨析
 781 - 对象成员,内部通过$this指定,外部通过对象名指定,均用->访问,访问属性时不需加$。
 782     对象名->属性名    对象名->方法名()    $this->属性名        $this->方法名()
 783 - 类成员,内部通过self或parent指定,外部通过类名指定,均用::访问,访问属性时需加$。
 784     类名::$属性名    类名::方法名()        self::$属性名        self::方法名()
 785 - 特殊:也可以通过对象访问类成员。(不建议)
 786     对象名::$类属性名    $this::$类属性名    对象名::$类方法名()    $this::类方法名()
 787 # 对象成员访问用->,类成员访问用::
 788 
 789 - 无论是静态方法还是非静态方法,均可通过类或对象进行访问。
 790 - 静态属性通过类访问,静态方法通过对象访问。
 791 - 只有使用对象调用非静态方法时,$this才可以使用 792 - 静态方法不可使用$this 793 - 类可以调用对象方法,但注意方法内不能有$this 794 - 非静态方法可以调用静态属性或静态方法,反之不可以。
 795 
 796 // 类常量
 797 - 常量的值将始终保持不变。
 798 - 在定义和使用常量的时候不需要使用$符号 799 - 常量的值必须是一个定值,不能是变量,类属性或其它操作(如函数调用)的结果。
 800 # 定义:const 常量名 = 常量值;
 801 - 不需要加public等访问修饰限定符
 802 - 类常量属于类,使用类访问,类名::类常量 或 self::类常量
 803 
 804 // 自动加载对象
 805 - 在试图使用尚未被定义的类时自动调用 __autoload 函数
 806 - 自动加载使用到的类名文件(根据类名找相应名称的文件,故需类名与类文件名一致)
 807 - 每个需要加载类的文件都需要存在__autoload函数
 808 - 将__autoload函数写入单独的文件,每个需要用到类的文件再require该函数文件
 809 - __autoload 参数是类名
 810 function __autoload($class_name) {
 811     require_once $_SERVER["DOCUMENT_ROOT"] . "/class/$class_name.php";
 812 }
 813     // $_SERVER["DOCUMENT_ROOT"] 当前运行脚本所在的文档根目录
 814 - 可以通过类名,来推导出类所在的文件名!
 815 - 如果一个项目存在多个自动加载函数时,定义一个可以完成加载的普通函数,并在函数之前使用spl_autoload_register注册该函数。
 816 # spl_autoload_register
 817 - 注册__autoload()函数
 818 bool spl_autoload_register ([ callback $autoload_function ] )
 819 - 可以注册多个自动加载函数,先注册的先执行
 820 - 一旦注册自动加载函数,__autoload就失效。
 821 - 注册函数时,参数为函数名(注意加引号);注册方法时,参数为数组
 822 # 注册类或对象的方法为自动加载方法时,参数需为数组:
 823 spl_autoload_register(array(__CLASS__, '__autoload'));
 824 __CLASS__表示当前类名,若是对象可用$this,详细见手册
 825 
 826 // 序列化(串行化)
 827 # 数据传输均是字符串类型
 828 # 除了资源类型,均可序列化
 829 # 序列化在存放数据时,会存放数据本身,也会存放数据类型
 830 作用:1.在网络传输数据时;2.为了将数组或对象放在磁盘时
 831 # 序列化
 832 serialize        产生一个可存储的值的表示
 833 string serialize ( mixed $value )
 834 - 返回字符串,此字符串包含了表示value的字节流,可以存储于任何地方。
 835 - 有利于存储或传递 PHP 的值,同时不丢失其类型和结构。
 836 # 反序列化
 837 unserialize        从已存储的表示中创建PHP的值
 838 mixed unserialize ( string $str [, string $callback ] )
 839 - 对单一的已序列化的变量进行操作,将其转换回PHP的值。
 840 
 841 
 842 # 文件的读写操作
 843 - file_put_contents        将一个字符串写入文件
 844 int file_put_contents($file, $data [,$flags])
 845     $flags:FILE_USE_INCLUDE_PATH(覆盖),FILE_APPEND(追加)
 846 - file_get_contents        将整个文件读入一个字符串
 847 string file_get_contents($file [, bool $use_include_path [,int $offset [,int $maxlen]]])
 848 
 849 # 对象序列化
 850 - 只能序列化对象内部的数据,即非静态属性。
 851 # 需在反序列化对象之前加载类,也可以触发自动加载机制。
 852 
 853 __sleep        序列化需序列化的属性。
 854         - 提交未提交的数据,或类似的清理操作,部分串行化对象。
 855         - 返回一个包含对象中所有应被序列化的变量名称的数组
 856 __wakeup    反序列化时,预先准备对象需要的资源
 857         - 重新建立数据库连接,或执行其它初始化操作
 858     public function __sleep() {
 859         return array('server', 'username', 'password', 'db');
 860     }
 861     public function __wakeup() {
 862         $this->connect();
 863     }
 864 
 865 // 对象继承
 866 class 子类名 extends 父类 {}
 867 如果一个对象是子类的对象,那么同时也是父类的对象。
 868 单继承:一个类只能继承一个父类,不能同时继承多个类。但一个父类可以被多个子类继承。
 869 
 870 instanceof    判断某对象是否为某类的对象
 871     对象名 instanceof 类名
 872 
 873 // 访问控制
 874 public        公有的(继承链、本类、外部均可访问)
 875 protected    保护的(仅继承链、本类可访问)
 876 private        私有的(仅本类可访问)
 877 根据成员定义位置、访问位置判断。
 878 # 兼容性问题
 879 - 声明属性时,var关键字声明的默认为public权限
 880 - 声明方法时,省略访问修饰符,默认为public权限
 881 
 882 // 重写 override
 883 $this代表本对象,被谁调用,就代表哪个对象。
 884 - 继承时,子类成员名于父类成员名发生冲突,则子类成员会重写父类成员。
 885 - 属性和方法均可被子类重写。
 886 - 当父类的方法或属性已经不满足子类的需求,则需要重写。
 887 - 也可能因为命名不规范导致重写。
 888 
 889 私有属性不能被重写,每个私有属性都会被记录。在记录属性名的同时,还会记录类。
 890 
 891 如果有内置函数被重写,则可调用父类方法。如调用父类构造方法parent::__construct()
 892 
 893 # 重写限制
 894 访问限制:
 895     子类的成员的访问控制必须相等或弱于父类。
 896 方法参数限制:
 897     参数数量必须相同,参数名可不同。
 898 
 899 # $this确定原则
 900 $this为调用该方法的对象,表示该方法的执行环境对象。
 901     - 对象调用
 902     - 环境的传递。如果当前调用时,不能确定$this的值(静态调用),此时静态调用所处对象环境会传递到被调用的方法内。
 903 $this并非永远代表本对象,而是由方法的执行环境决定。
 904 
 905 # final
 906 如果父类中的方法被声明为final,则子类无法覆盖(重写)该方法。
 907 如果一个类被声明为final,则不能被继承。
 908 但加有final关键字的类依旧能被实例化!
 909 # 抽象类
 910 关键字:abstract
 911 抽象类不能直接被实例化,必须先继承该抽象类,然后再实例化子类。
 912 抽象类中至少要包含一个抽象方法。非抽象类不能包含抽象方法。
 913 如果类方法被声明为抽象的,那么其中就不能包括具体的功能实现。抽象方法不能包含大括号及方法体。
 914 继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法。
 915     即,子类必须重写抽象父类中的所有抽象方法。
 916 另外,这些方法的可见性必须和抽象类中一样(或者更为宽松)。
 917     即,如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不能定义为private。
 918 - 抽象类的子类中的普通方法执行方式和其他类相同。
 919 - 作用:
 920     1. 继承,为扩展类,统一公共操作。
 921     2. 限制结构(规范)。规范子类的结构。
 922 
 923 // 接口
 924 关键字:interface
 925 - 对象提供的与对象交互的方式就是接口。
 926 - 使用接口可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
 927 - 通过interface来定义一个接口,就像定义一个标准的类一样,但其中定义所有的方法都是空的。 
 928 - 接口中定义的所有属性和方法都必须是public,可省略public关键字。
 929 - 接口中也可以定义常量(const)。接口常量和类常量的使用完全相同。
 930     可以用::访问。接口名::常量名,实现类::常量名。
 931     它们都是定值,可以被子类或子接口使用,但不能修改。
 932 - 接口不能定义属性!
 933 # 定义接口
 934 interface 接口名 {
 935     接口内容(公共方法声明的集合)
 936 }
 937 # 接口实现
 938 - 要实现一个接口,可以使用implements操作符。
 939 - 类中必须实现接口中定义的所有方法,否则会报一个fatal错误。
 940 - 如果要实现多个接口,可以用逗号来分隔多个接口的名称。
 941 - 实现多个接口时,接口中的方法不能有重名。
 942 - 接口也可以继承,通过使用extends操作符。
 943 class 类名 implements 接口名 {
 944     接口方法的实现
 945 }
 946 # 注意
 947     1. 类与抽象类之间是继承关系,类与接口之间是实现关系。
 948     2. 类与抽象类是单继承,类与接口是多实现。
 949     3. 接口不是类,限制类的结构。
 950     4. 接口与接口之间是多继承。用extends关键字。
 951         interface I_C extends I_A, I_B {}
 952 
 953 // 静态延迟绑定
 954 self::,代表本类(当前代码所在类)
 955     永远代表本类,因为在类编译时已经被确定。
 956     即,子类调用父类方法,self却不代表调用的子类。
 957 static::,代表本类(调用该方法的类)
 958     用于在继承范围内引用静态调用的类。
 959     运行时,才确定代表的类。
 960     static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。
 961 
 962 // 对象的遍历(迭代)
 963 - 对象通过属性保存数据,故遍历对象的属性。
 964 - foreach语言结构,获得属性名和属性值。
 965     foreach ($obj as $p_name => $p_value) {}
 966 # 自定义遍历(迭代器Iterator)
 967 Iterator - 可在内部迭代自己的外部迭代器或类的接口
 968 Iterator::current    — 返回当前元素
 969 Iterator::key        — 返回当前元素的键
 970 Iterator::next        — 向前移动到下一个元素
 971 Iterator::rewind    — 返回到迭代器的第一个元素
 972 Iterator::valid        — 检查当前位置是否有效
 973 
 974 # 对象的克隆
 975 //对象之间的传值是[引用]传递。
 976 克隆:新对象 = clone 旧对象
 977     - 所有的引用属性仍然会是一个指向原来的变量的引用。 
 978 __clone()方法在对象被克隆时自动调用。
 979 注意:构造方法对应实例化(new),克隆方法对应克隆(clone)。
 980 
 981 // 单例模式
 982 #三私一公
 983 单例模式(Singleton)用于为一个类生成一个唯一的对象。最常用的地方是数据库连接。使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
 984 # 防止一个类被实例化多次
 985 class MySQLDB {
 986     private static $instance = null; // 存类实例在此属性中
 987     // 构造方法声明为private,防止直接创建对象
 988     private function __construct() {}
 989     public static function getInstance() {
 990         if(! self::$instance instanceof static) {
 991             self::$instance = new static;
 992         }
 993         return self::$instance;
 994     }
 995     private function __clone() {} // 阻止用户复制对象实例
 996 }
 997 
 998 // 魔术方法
 999 __construct        构造方法
1000 __destruct        析构方法
1001 __clone            克隆对象
1002 __sleep            序列化对象
1003 __wakeup        反序列化对象
1004 __autoload        自动加载,使用类但未找到时
1005 
1006 __toString        对象被当作字符串使用时
1007 __invoke        当尝试以调用函数的方式调用一个对象时
1008 
1009 # 重载 overload
1010 指动态地"创建"类属性和方法
1011 用户可以自由的为对象添加额外的属性,该特性就是重载。
1012 所有的重载方法都必须被声明为public。
1013 当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。
1014 重载相关魔术方法的参数都不能通过引用传递。
1015 # 属性重载
1016 - 处理不可访问的属性
1017 属性重载只能在对象中进行。
1018 # 属性重载对于静态属性无效
1019 在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被声明为static。
1020 __set        在给不可访问的属性赋值时
1021     public void __set(string $name, mixed $value)
1022     作用:批量管理私有属性,间接保护对象结构
1023 __get        读取不可访问的属性的值时
1024     public mixed __get(string $name)
1025 __isset        当对不可访问的属性调用isset()或empty()时
1026     public bool __isset(string $name)
1027 __unset        当对不可访问的属性调用unset()时
1028     public void __unset(string $name)
1029 # 方法重载
1030 - 处理不可访问的方法
1031 __call            当调用一个不可访问的非静态方法(如未定义,或者不可见)时自动被调用
1032         public mixed __call(string $name, array $arguments)
1033 __callStatic    当在调用一个不可访问的静态方法(如未定义,或者不可见)时自动被调用
1034         public static mixed __callStatic(string $name, array $arguments)
1035 # $name参数是要调用的方法名称。$arguments参数是一个数组,包含着要传递给方法的参数。
1036 
1037 // 类型约束
1038 函数的参数可以指定只能为对象或数组
1039 限定为对象则在形参前加类名,限定为数组则在形参前加array
1040 类型约束允许NULL值
1041 类型约束不只是用在类的成员方法里,也能使用在函数里。 
1042 
1043 // 三大特性
1044 封装:隐藏内部是吸纳,仅开发接口。
1045 继承:一个对象的成员被另一个对象所使用。语法上体现为代码的共用。
1046 多态:多种形态。
1047 
1048 // 类与对象·关键字
1049 this        代表本对象
1050 public        公有的(继承链、本类、外部均可访问)
1051 protected    保护的(仅继承链、本类可访问)
1052 private        私有的(仅本类可访问)
1053 parent::    代表父类
1054 self::        代表本类(当前代码所在类)
1055 static::    代表本类(调用该方法的类)
1056 static        静态成员(属性、方法),所有对象均可使用,外部也可直接使用或修改,静态方法不可访问非静态成员
1057 final        方法用final不可被子类重载,类用final不可被继承(方法、类)
1058 const        类常量(属性)
1059 abstract    抽象类
1060 interface    接口
1061 extends        类继承(子接口继承接口、其他普通类继承)
1062 implements    接口实现(类实现接口、抽象类实现借口)(对接口的实现和继承均可有多个)
1063 Iterator    内置接口(迭代)
1064 clone        克隆
1065 instance    实例
1066 instanceof    某对象是否属于某类
1067 
1068 /* 【类与对象相关函数】 */
1069 class_alias([$original [,$alias]])  给类取别名
1070 class_exists($class [,$autoload])   检查类是否已定义
1071 interface_exists($interface [,$autoload])   检查接口是否已被定义
1072 method_exists($obj, $method)检查类的方法是否存在
1073 property_exists($class, $property)  检查对象或类是否具有该属性
1074 get_declared_classes(void)  返回由已定义类的名字所组成的数组
1075 get_declared_interfaces(void)   返回一个数组包含所有已声明的接口
1076 get_class([$obj])       返回对象的类名
1077 get_parent_class([$obj])    返回对象或类的父类名
1078 get_class_methods($class)   返回由类的方法名组成的数组
1079 get_object_vars($obj)   返回由对象属性组成的关联数组
1080 get_class_vars($class)  返回由类的默认属性组成的数组
1081 is_a($obj, $class) 如果对象属于该类或该类是此对象的父类则返回TRUE
1082 is_subclass_of($obj, $class)    如果此对象是该类的子类,则返回TRUE
1083 get_object_vars($obj)   返回由对象属性组成的关联数组
1084 
1085 
1086 // 常用类
1087 # PHP手册 -> 预定义类
1088 Closure        闭包类,匿名函数对象的final类
1089 stdClass    标准类,通常用于对象类保存集合数据
1090 __PHP_Incomplete_Class        不完整类,当只有对象而没有找到类时,则该对象被认为是该类的对象
1091 Exception    异常类
1092 PDO            数据对象类
1093 
1094 // 魔术常量
1095 __DIR__            文件所在的目录
1096 __LINE__        文件中的当前行号 
1097 __FILE__        文件的完整路径(绝对路径)和文件名
1098 
1099 __CLASS__        类的名称
1100 __METHOD__        类的方法名,包含类名和方法名
1101 __FUNCTION__    函数名称,用在方法内只表示方法名
1102 
1103 // 反射机制 Reflection
1104 作用:1. 获取结构信息        2. 代理执行
1105 ReflectionClass 报告一个类的有关信息
1106 ReflectionMethod 报告一个方法的有关信息
1107 ReflectionClass::export    输出类结构报告
1108 # 代理执行
1109 实例化 ReflectionFunction 类的对象
1110     $f = new ReflectionFunction('func');    // func为函数func($p)
1111     $f->invoke('param');
1112 
1113 
1114 /* 页面跳转 */
1115 // PHP
1116 header('Loacation: url')
1117 header()执行完毕后,后面的代码也会继续执行,故需在该语句后加die结束
1118 无法给出提示,直接跳转
1119 // JS方法
1120 location.href = url
1121 // HTML
1122 <meta http-equiv="Refresh" content="表示时间的数值; url=要跳转的URI"> 
1123 
1124 /* 【Cookie】 */
1125 cookie是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。
1126 cookie是HTTP标头的一部分,因此setcookie()函数必须在其它信息被输出到浏览器前调用,这和对header()函数的限制类似。可以使用输出缓冲函数来延迟脚本的输出,直到按需要设置好了所有的cookie或者其它HTTP标头。
1127 
1128 // 新增
1129 setcookie    新增一条cookie信息
1130 setcookie($name [,$value [,$expire [,$path [,$domain [,$secure [,$httponly]]]]]])
1131 #注意:setcookie()函数前不能有输出!除非开启ob缓存!
1132 # 参数说明
1133 $name    - cookie的识别名称
1134     使用$_COOKIE['name']抵用名为name的cookie
1135 $value    - cookie值,可以为数值或字符串,此值保存在客户端,不要用来保存敏感数据
1136     假定$name参数的值为'name',则$_COOKIE['name']就可取得该$value值
1137 $expire    - cookie的生存期限(Unix时间戳,秒数)
1138     如果$expire参数的值为time()+60*60*24*7则可设定cookie在一周后失效。如果未设定该参数,则会话后立即失效。
1139 $path    - cookie在服务器端的指定路径。当设定该值时,服务器中只有指定路径下的网页或程序可以存取该cookie。
1140     如果该参数值为'/',则cookie在整个domain内有效。
1141     如果设为'/foo/',则cookie就在domain下的/foo/目录及其子目录内有效。
1142     默认值为设定cookie的当前目录及其子目录。
1143 $domain    - 指定此cookie所属服务器的网址名称,预设是建立此cookie服务器的网址。
1144     要是cookie能在如abc.com域名下的所有子域都有效,则该参赛应设为'.abc.com'1145 $secure    - 指明cookie是否仅通过安全的HTTPS连接传送中的cookie的安全识别常数,如果设定该值则代表只有在某种情况下才能在客户端与服务端之间传递。
1146     当设成true时,cookie仅在安全的连接中被设置。默认值为false。
1147 
1148 // 读取
1149 - 浏览器请求时会携带当前域名下的所有cookie信息到服务器。
1150 - 任何从客户端发送的cookie都会被自动存入$_COOKIE全局数组1151 - 如果希望对一个cookie变量设置多个值,则需在cookie的名称后加[]符号。即以数组形态保存多条数据到同一变量。
1152     //设置为$_COOKIE['user']['name'],注意user[name]的name没有引号
1153     setcookie('user[name]', 'shocker');
1154 - $_COOKIE也可以为索引数组
1155 
1156 // 删除
1157 方法1:将其值设置为空字符串
1158     setcookie('user[name]', '');
1159 方法2:将目标cookie设为“已过期”状态。
1160     //将cookie的生存时间设置为过期,则生存期限与浏览器一样,当浏览器关闭时就会被删除。
1161     setcookie('usr[name]', '', time()-1);
1162 
1163 # 注意:
1164 1. cookie只能保存字符串数据
1165 2. $_COOKIE只用于接收cookie数据,不用于设置或管理cookie数据。
1166$_COOKIE进行操作不会影响cookie数据1167     $_COOKIE只会保存浏览器在请求时所携带的cookie数据1168 3. cookie生命周期:
1169     临时cookie:浏览器关闭时被删除
1170     持久cookie:$expire参数为时间戳,表示失效时间。
1171 4. 有效目录
1172     cookie只在指定的目录有效。默认是当前目录及其子目录。
1173     子目录的cookie在其父目录或同级目录不可获取。
1174 5. cookie区分域名
1175     默认是当前域名及其子域名有效。
1176 6. js中通过document.cookie获得,类型为字符串
1177 7. 浏览器对COOKIE总数没有限制,但对每个域名的COOKIE数量和每个COOKIE的大小有限,而且不同浏览器的限制不同。
1178 
1179 /* 【session】 */
1180 1. 开启session机制
1181     session_start()
1182     注意:session_start()函数前不能有输出!除非开启ob缓存。
1183 2. 操作数据
1184$_SESSION数组进行操作
1185 3. 浏览器端保存SessionID,默认为当前域名下的所有目录及其子目录生效。即默认设置cookie的path值为'/'
1186 4. 服务器保存session数据
1187     默认保存方式:每个会话都会生成一个session数据文件,文件名为:sess_加SessionID
1188 5. session可以存储除了资源以外的任何类型数据。
1189     数据被序列化后再保存到文件中。
1190 6. $_SESSION的元素下标不能为整型1191     因为只对元素值进行序列化。
1192     元素内的数组下标无此要求。
1193 7. 生存周期
1194     默认是浏览器关闭
1195         因为浏览器保存的cookie变量SessionID是临时的
1196         但是服务器端的session数据文件不一定消失(需要等待session的垃圾回收机制来处理)
1197     可以延长cookie中PHPSESSID变量的生命周期。(不推荐)
1198     php.ini配置session.gc_maxlifetime
1199 8. 删除数据
1200     $_SESSION变量在脚本结束时依然会消失。开启session机制时会造出$_SESSION变量1201     $_SESSION与保存session数据的文件是两个空间1202     unset($_SESSION['key'])只是删除数组内的该元素,不会立即相应到保存session数据的文件上。
1203         等到脚本结束,才会将$_SESSION的数据写入到该文件中1204     session_destroy()    销毁保存session数据的文件,也不会对该文件写入内容。
1205         并不删除$_SESSION变量,unset或脚本结束才会删除该变量。
1206     如何完全删除一个session?需删除3部分
1207         unset($_SESSION);    
1208             删除$_SESSION变量后,数据文件并未被改动。如果单独使用unset,则需先置空$_SESSION = array()
1209         session_destroy();
1210         setcookie('PHPSESSID', '', time()-1); //保险做法是将其生命周期失效
1211     整个脚本周期内,只对数据文件读一次、写一次。
1212 
1213 // 重写session的存储机制
1214 # session存储方式
1215 session.save_handler = user|files|memcache
1216 # 因数据文件过多导致的问题,可通过分子目录保存进行解决
1217 PHP配置文件下session.save_path选项,并需手动创建数据存放目录。
1218 在该配置选项前加层级。分布子目录的原则,利用会话ID的相应字母来分配子目录。仍需手动创建子目录。
1219 session.save_path = "2; F:/PHPJob/Temp"
1220 # 多服务器数据共享问题
1221 # 数据存储操作:
1222     初始化$open、释放资源$close、读$read、写$write、销毁存储介质$destroy(调用session_destroy时触发该操作)、垃圾回收$gc
1223 # 会话ID的长度可变。不同的设置方式导致不同长度的会话ID。
1224 session.hash_function   允许用户指定生成会话ID的散列算法。
1225     '0' 表示MD5(128 位),'1' 表示SHA-1(160 位)。
1226 session.hash_bits_per_character    允许用户定义将二进制散列数据转换为可读的格式时每个字符存放多少个比特。
1227     可能值为 '4'(0-9,a-f),'5'(0-9,a-v),以及 '6'(0-9,a-z,A-Z,"-",",")。
1228     总hash长度为128bit,会话ID长度为128/可能值,4->32, 5->26, 6->22
1229 # 自定义数据存储操作方法
1230 # 注意:不用关心PHP如何序列化、反序列化、如何得到数据和写入数据,只做与数据存储相关的操作
1231 session_set_save_handler    设置用户自定义的会话数据存储函数
1232     bool session_set_save_handler(callable $open, callable $close, callable $read, callable $write, callable $destroy, callable $gc)
1233 执行顺序:open,  close, read, write, destroy, gc
1234 # 先设置处理器,再开启会话
1235 
1236 # 常用函数
1237 session_start        开启或恢复会话机制
1238 session_id            获取或设置当前会话ID
1239 session_destroy        销毁当前会话的所有数据(销毁数据文件)
1240 session_name        获取或设置当前会话名称(cookie变量名,默认为PHPSESSID)
1241 session_save_path    获取或设置当前会话数据文件保存路径
1242 session_set_save_handler    设置用户自定义的会话数据存储函数
1243 session_unset        释放所有会话变量(清空$_SESSION数组元素)
1244 session_encode        将当前会话数据编码为一个字符串
1245 session_decode        将字符串解译为会话数据
1246 session_write_close    写入会话数据并关闭会话
1247 session_register_shutdown    关闭会话
1248 session_set_cookie_params    设置会话cookie变量,必须在session_start()前使用。
1249     session_set_cookie_params(0,"/webapp/"); //设置session生存时间
1250 session_get_cookie_params    获取会话cookie变量。返回包含当前会话cookie信息的数组
1251 
1252 # 配置php.ini
1253 ini_set($varname, $newvalue);
1254     //该函数的配置只对当前脚本生效
1255     //并非所有php.ini设置均可用该函数设置
1256 ini_get($varname)   //获取某配置项信息
1257 ini_get_all([str $extension])   //返回所有配置项信息的数组
1258 
1259 # session扩展配置
1260 session.name    指定会话名以用作cookie的名字。只能由字母数字组成,默认为PHPSESSID。
1261 session.save_path   定义了传递给存储处理器的参数。
1262     如果选择了默认的files文件处理器,则此值是创建文件的路径。默认为/tmp。
1263     可选的N参数来决定会话文件分布的目录深度。
1264     要使用N参数,必须在使用前先创建好这些目录。在ext/session目录下有个小的shell脚本名叫mod_files.sh可以用来做这件事。
1265     如果使用了N参数并且N大于0,那么将不会执行自动垃圾回收。
1266 session.save_handler    定义了来存储和获取与会话关联的数据的处理器的名字。默认为files。
1267     如果用户自定义存储器,则该值改为user。
1268     ini_set('session.save_handler', 'user');//此设置只针对当前脚本生效。
1269 session.auto_start  指定会话模块是否在请求开始时自动启动一个会话。默认为 0(不启动)。
1270 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。
1271 
1272 
1273 /* 【图片生成与处理】 */GD库
1274 // 画布生成
1275 # 新建画布
1276 imagecreate             新建一个基于调色板的图像
1277     resource imagecreate(int $x_size, int $y_size)
1278 imagecreatetruecolor    新建一个真彩色图像
1279 # 基于已有文件或URL创建画布
1280 imagecreatefromgd2      从GD2文件或URL新建一图像
1281 imagecreatefromgd2part  从给定的GD2文件或URL中的部分新建一图像
1282 imagecreatefromgd       从GD文件或URL新建一图像
1283 imagecreatefromgif      由文件或URL创建一个新图象
1284 imagecreatefromjpeg     由文件或URL创建一个新图象
1285 imagecreatefrompng      由文件或URL创建一个新图象
1286 imagecreatefromstring   从字符串中的图像流新建一图像
1287 imagecreatefromwbmp     由文件或URL创建一个新图象
1288 imagecreatefromxbm      由文件或URL创建一个新图象
1289 imagecreatefromxpm      由文件或URL创建一个新图象
1290 // 颜色分配
1291 imagecolorallocate          为一幅图像分配颜色
1292     int imagecolorallocate(resource $image, int $red, int $green, int $blue)
1293 imagecolorallocatealpha     为一幅图像分配颜色 + alpha
1294 imagecolordeallocate        取消图像颜色的分配
1295 imagecolortransparent       将某个颜色定义为透明色
1296 imagecolorat            取得某像素的颜色索引值
1297 imagecolorclosest       取得与指定的颜色最接近的颜色的索引值
1298 imagecolorclosestalpha  取得与指定的颜色加透明度最接近的颜色
1299 imagecolorclosesthwb    取得与给定颜色最接近的色度的黑白色的索引
1300 imagecolorexact         取得指定颜色的索引值
1301 imagecolorexactalpha    取得指定的颜色加透明度的索引值
1302 imagecolormatch         使一个图像中调色板版本的颜色与真彩色版本更能匹配
1303 imagecolorresolve       取得指定颜色的索引值或有可能得到的最接近的替代值
1304 imagecolorresolvealpha  取得指定颜色 + alpha 的索引值或有可能得到的最接近的替代值
1305 imagecolorset           给指定调色板索引设定颜色
1306 imagecolorsforindex     取得某索引的颜色
1307 imagecolorstotal        取得一幅图像的调色板中颜色的数目
1308 // 区域填充
1309 imagefill   区域填充
1310     bool imagefill(resource $image, int $x, int $y, int $color)
1311 imagefilledarc          画一椭圆弧且填充
1312 imagefilledellipse      画一椭圆并填充
1313 imagefilledpolygon      画一多边形并填充
1314 imagefilledrectangle    画一矩形并填充
1315 imagefilltoborder       区域填充到指定颜色的边界为止
1316 imagesettile    设定用于填充的贴图
1317 // 图形创建
1318 imagearc        画椭圆弧
1319 imagechar       水平地画一个字符
1320 imagecharup     垂直地画一个字符
1321 imagedashedline 画一虚线
1322 imageellipse    画一个椭圆
1323 imageline       画一条线段
1324 imagepolygon    画一个多边形
1325 imagerectangle  画一个矩形
1326 imagesetpixel   画一个单一像素
1327 imagesx         取得图像宽度
1328 imagesy         取得图像高度
1329 // 画笔设置
1330 imagesetbrush   设定画线用的画笔图像
1331 imagesetstyle   设定画线的风格
1332 imagesetthickness   设定画线的宽度
1333 // 图形拷贝
1334 imagecopy           拷贝图像的一部分
1335 imagecopymerge      拷贝并合并图像的一部分
1336 imagecopymergegray  用灰度拷贝并合并图像的一部分
1337 imagecopyresampled  重采样拷贝部分图像并调整大小
1338 imagecopyresized    拷贝部分图像并调整大小
1339 // 字符创建
1340 imagestring         水平地画一行字符串
1341 imagestringup       垂直地画一行字符串
1342 imagepsslantfont    倾斜某字体
1343 imagefontheight     取得字体高度
1344 imagefontwidth      取得字体宽度
1345 imagettfbbox        取得使用 TrueType 字体的文本的范围
1346 imageloadfont       载入一新字体
1347 imagepsencodefont   改变字体中的字符编码矢量
1348 imagepsextendfont   扩充或精简字体
1349 // 导出画布为图片
1350 imagegif    以GIF格式将图像输出到浏览器或文件
1351 imagepng    以PNG格式将图像输出到浏览器或文件
1352 imagejpeg   以JPEG格式将图像输出到浏览器或文件
1353 imagewbmp   以WBMP格式将图像输出到浏览器或文件
1354 通过header()发送 "Content-type: image/图片格式" 可以使PHP脚本直接输出图像。
1355     header("Content-type: image/gif"); imagegif($im);
1356 imagegd     将 GD 图像输出到浏览器或文件
1357 imagegd2    将 GD2 图像输出到浏览器或文件
1358 // 释放画布资源
1359 imagedestroy    销毁图像
1360 // 图像信息
1361 image_type_to_extension     取得图像类型的文件后缀
1362 getimagesize                取得图像大小
1363 imagesx                     取得图像宽度
1364 imagesy                     取得图像高度
1365 imageistruecolor            检查图像是否为真彩色图像
1366 imagetypes                  返回当前 PHP 版本所支持的图像类型
1367 // 图像设置
1368 imagerotate         用给定角度旋转图像
1369 imagealphablending  设定图像的混色模式
1370 imageantialias      是否使用抗锯齿(antialias)功能
1371 imagefilter         对图像使用过滤器
1372 imagegammacorrect   对 GD 图像应用 gamma 修正
1373 imageinterlace      激活或禁止隔行扫描
1374 
1375 /* 【缩略图】【水印】 */
1376 imagecopyresampled  重采样拷贝部分图像并调整大小
1377     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 )
1378 imagecopymerge      拷贝并合并图像的一部分
1379     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 )
1380 getimagesize        取得图像大小
1381     array getimagesize ( string $filename [, array &$imageinfo ] )
1382 
1383 /* 【URL函数】 */
1384 get_headers — 取得服务器响应一个 HTTP 请求所发送的所有标头
1385 get_meta_tags — 从一个文件中提取所有的 meta 标签 content 属性,返回一个数组
1386 http_build_query — 生成 URL-encode 之后的请求字符串
1387 urldecode — 解码已编码的URL字符串
1388 urlencode — 编码URL字符串
1389 parse_url — 解析URL,返回其组成部分
1390     'http://username:password@hostname/path?arg=value#anchor'
1391     scheme(如http), host, port, user, pass, path, query(在问号?之后), fragment(在散列符号#之后)
1392 
1393 
1394 //编码可用于交换多个变量
1395 $a = '中国';
1396 $b = '四川';
1397 $a = urlencode($a);
1398 $b = urlencode($b);
1399 $a = $a.'&'.$b;
1400 $b = explode('&', $a);
1401 $a = urldecode($b[1]);
1402 $b = urldecode($b[0]);
1403 echo $a, $b;
1404 //list()函数用于交换变量
1405 list($a, $b) = array($b, $a);
1406 
1407 
1408 /* 【文件、目录】 */
1409 dirname($path)  返回路径中的目录部分
1410 basename($path [,$suffix])  返回路径中的文件名部分
1411 pathinfo($path [,$options]) 返回文件路径的信息(数组元素:dirname,basename,extension)
1412 realpath($path) 返回规范化的绝对路径名
1413 
1414 copy($source, $dest)    拷贝文件
1415 unlink($file)   删除文件
1416 rename($old, $new)  重命名或移动一个文件或目录
1417 mkdir($path [,$mode [,$recursive]]) 新建目录
1418     $mode表示权限,默认0777
1419     $recursive表示可创建多级目录,默认false
1420 rmdir($dir)     删除目录(目录必须为空,且具有权限)
1421 
1422 file_exists($file)  检查文件或目录是否存在
1423 is_file($file)      判断文件是否存在且为正常的文件
1424 is_dir($file)       判断文件名是否存在且为目录
1425 is_readable($file)  判断文件或目录是否可读
1426 is_writable($file)  判断文件或目录是否可写
1427 is_executable($file)    判断给定文件名是否可执行
1428 is_link($file)      判断给定文件名是否为一个符号连接
1429 
1430 tmpfile(void)   建立一个临时文件
1431 tempnam($dir, $prefix)  在指定目录中建立一个具有唯一文件名的文件
1432 
1433 file($file) 把整个文件读入一个数组中
1434 fopen($filename, $mode [,$use_include_path])
1435     $mode参数:(加入'b'标记解决移植性)
1436         'r'     只读方式打开,将文件指针指向文件头。
1437         'r+'    读写方式打开,将文件指针指向文件头。
1438         'w'     写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
1439         'w+'    读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
1440         'a'     写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
1441         'a+'    读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
1442         'x'     创建并以写入方式打开,将文件指针指向文件头。
1443         'x+'    创建并以读写方式打开,将文件指针指向文件头。
1444 fclose($handle) 关闭一个已打开的文件指针
1445 fread($handle, $length) 读取文件(可安全用于二进制文件)
1446 fwrite($handle, $string [,$length]) 写入文件(可安全用于二进制文件)
1447 rewind($handle) 倒回文件指针的位置
1448 ftell($handle)  返回文件指针读/写的位置
1449 fseek($handle, $offset [,$whence])  在文件指针中定位
1450 feof($handle)   测试文件指针是否到了文件结束的位置
1451 fgets   从文件指针中读取一行
1452 fgetss  从文件指针中读取一行并过滤掉HTML标记
1453 flock($handle, $opt) 轻便的咨询文件锁定
1454     $opt:LOCK_SH 取得共享锁定(读取的程序);LOCK_EX 取得独占锁定(写入的程序);LOCK_UN 释放锁定(无论共享或独占)
1455 
1456 
1457 readfile($file) 读入一个文件并写入到输出缓冲
1458 fflush($handle) 将缓冲内容输出到文件
1459 
1460 touch($file [,$time [,$atime]])   设定文件的访问和修改时间
1461 fileatime   取得文件的上次访问时间
1462 filectime   取得文件的inode修改时间
1463 filegroup   取得文件的组
1464 fileinode   取得文件的inode
1465 filemtime   取得文件修改时间
1466 fileowner   取得文件的所有者
1467 fileperms   取得文件的权限
1468 filesize    取得文件大小
1469 filetype    取得文件类型
1470 
1471 
1472 /* fileinfo */ 获取/设置文件信息
1473 #扩展Fileinfo,配置php.ini
1474 #extension=php_fileinfo.dll
1475 finfo_open([$opt]) //创建一个文件信息资源
1476 finfo_file($finfo, $file [,$opt]) //获取文件信息
1477 finfo_set_flags($finfo, $opt) //设置文件信息项
1478 finfo_close($finfo) //关闭文件信息资源
1479 
1480 mime_content_type($file) //获取文件的MIME类型
1481 
1482 $opt参数选项1483 FILEINFO_MIME_ENCODING 文件编码类型
1484 FILEINFO_MIME_TYPE 文件MIME类型
1485 
1486 
1487 //目录
1488 chdir($dir)         改变当前目录
1489 chroot($dir)        将当前目录改变为当前进程的根目录
1490 closedir($handle)   关闭目录句柄
1491 dir($dir)           返回一个目录的实例对象
1492 getcwd()            取得当前工作目录
1493 opendir($path)      打开目录句柄
1494 readdir($handle)    从目录句柄中读取条目
1495 rewinddir($handle)  倒回目录句柄
1496 scandir($dir [,$order])     列出指定路径中的文件和目录
1497 glob($pattern [,$flags])    寻找与模式匹配的文件路径
1498     $flags1499         GLOB_MARK - 在每个返回的项目中加一个斜线  
1500         GLOB_NOSORT - 按照文件在目录中出现的原始顺序返回(不排序)  
1501         GLOB_NOCHECK - 如果没有文件匹配则返回用于搜索的模式  
1502         GLOB_NOESCAPE - 反斜线不转义元字符  
1503         GLOB_BRACE - 扩充 {a,b,c} 来匹配 'a','b' 或 'c'  
1504         GLOB_ONLYDIR - 仅返回与模式匹配的目录项 
1505     查找多种后缀名文件:glob('*.{php,txt}', GLOB_BRACE);
1506 
1507 
1508 /* 解压缩 */
1509 //新建ZipArchive对象
1510 $zip = new ZipArchive;
1511 //打开ZIP文件
1512 $zip->open($file [,$flags]);
1513     $flags1514         ZIPARCHIVE::OVERWRITE 覆盖(不存在会自动创建)
1515         ZIPARCHIVE::CREATE 添加(不存在会自动创建)
1516         ZIPARCHIVE::EXCL
1517         ZIPARCHIVE::CHECKCONS
1518 //关闭正在处理的ZIP文件
1519 //解压缩ZIP文件
1520 $zip->extractTo($dest, [$entries]);
1521     $dest:解压到的文件夹,$entries:解压的条目
1522 //添加文件到ZIP文件
1523 $zip->addFile($file, [$newname]);   
1524     $newname可以为"dir/file",这样可以将文件添加到压缩文件中的某个目录下。其他函数也如此。
1525 //添加文件到ZIP文件,而内容来自字符串
1526 $zip->addFromString($file, $str);
1527 //添加空文件夹到ZIP文件
1528 $zip->addEmptyDir($dir);
1529 //通过索引删除ZIP中的文件或文件夹
1530 $zip->deleteIndex($index);
1531 //通过名称删除ZIP中的文件或文件夹
1532 $zip->deleteName($name);
1533 //设置ZIP文件注释
1534 $zip->setArchiveComment($str);
1535 //获取ZIP文件注释
1536 $zip->getArchiveComment();
1537 //通过索引获取文件内容
1538 $zip->getFromIndex($index);
1539 //通过名称获取文件内容
1540 $zip->getFromName($name);
1541 //获取索引文件的文件名称
1542 $zip->getNameIndex($index);
1543 //通过索引重命名文件
1544 $zip->renameIndex($index, $newname);
1545 //通过名称重命名文件
1546 $zip->renameName($name, $newname);
1547 
1548 //若将文件夹内容打包成ZIP文件,需循环文件夹的所有目录及文件
1549 function addFileToZip($path, $zip) {
1550     //打开当前文件夹$path
1551     $handle = opendir($path);
1552     //循环读取子文件夹及文件
1553     //为防止文件名本身可被转换为false的情况(比如为"0"),则需用不全等!==
1554     while ($file = readdir($handle) !== false) {
1555         //过滤假文件夹
1556         if ($file != '.' && $file != '..') {
1557             //对于子文件夹则递归调用本函数
1558             if (is_dir($path . '/' . $file)) {
1559                 addFileToZip($path.'/'.$file, $zip);
1560             } else {
1561                 //将文件添加到ZIP对象
1562                 $zip->addFile($path . '/' . $file);
1563             }
1564         }
1565     }
1566     //关闭文件夹$path
1567     closedir($path);
1568 }
1569 // ----- END 解压缩 ----- //
1570 
1571 
1572 /* 【文件上传】 */
1573 enctype="multipart/form-data"   //FORM标签必须的属性
1574 $_FILES 上传文件信息数组变量
1575 error   上传错误信息
1576   无错误
1577   文件大小超过php.ini配置
1578         1) upload_max_filesize 允许上传的最大文件大小
1579         2) post_max_size 最大的POST数据大小
1580         3) memory_limit 每个脚本能够使用的最大内存数量(默认128MB)
1581   文件大小超过浏览器表单配置
1582         MAX_FILE_SIZE   表示表单数据最大文件大小,该元素需在文件上传域之前。(默认2M)
1583         <input type="hidden" name="MAX_FILE_SIZE" value="102400">
1584   文件只有部分被上传
1585   文件没有被上传
1586     6,7 临时文件写入时失败
1587   找不到临时文件
1588   文件写入失败
1589 name    文件名
1590 type    文件类型
1591 tmp_name    上传文件临时路径
1592 size    文件大小
1593 move_uploaded_file($path, $newpath);    //将上传的文件移动到新位置
1594 is_uploaded_file($file) //判断是否为POST上传的文件
1595 //多文件上传
1596 <input type="file" name="updfile[]" /> //HTML中以数组提交
1597 $_FILES['updfile']['tmp_name'][0]   //服务器端可访问第一个文件的临时路径,其他属性类似
1598 
1599 
1600 //php.ini配置
1601 file_uploads = On 是否允许HTTP上传文件
1602 upload_max_filesize 上传文件大小限制,默认为2M
1603 post_max_size   post方式表单数据总大小限制,默认为8M
1604 upload_tmp_dir  上传文件临时目录,默认是系统临时目录
1605     需设置上传文件临时目录,给其最小权限
1606 GET方式的最大传输量为2K
1607 
1608 
1609 /* 【批量提交】 */
1610 FORM表单中的name值可用名称加中括号的形式,在$_POST获取表单数据时,可多项提交形成数组。
1611 比如多文件上传file,复选框提交checkbox等。
1612 <input type="checkbox" name="id[]" value="值1" />
1613 <input type="checkbox" name="id[]" value="值2" />
1614 $id = $_POST['id']; //则可获得全部被选中的复选框值,形成索引数组
1615 如果name值为:
1616 <input type="checkbox" name="id[one]" value="值1" />
1617 <input type="checkbox" name="id[two]" value="值2" />
1618 $id = $_POST['id'];  //则可获取所有name为id[...]的值,形成管理数组
1619 
1620 
1621 /* iconv */
1622 //php.ini配置iconv
1623 [iconv]
1624 ;iconv.input_encoding = ISO-8859-1
1625 ;iconv.output_encoding = ISO-8859-1
1626 ;iconv.internal_encoding = ISO-8859-1
1627 iconv_set_encoding($type, $charset);
1628     $type:input_encoding,output_encoding,internal_encoding
1629 iconv_get_encoding([$type = "all"])
1630     $type:all,input_encoding,output_encoding,internal_encoding
1631 
1632 
1633 
1634 iconv($in_charset, $out_charset, $str) //将字符串转换为目标编码
1635 
1636 指定编码,可解决中文字符的统计、查询、截取等!
1637 iconv_strlen($str [,$charset]) //统计字符串的字符数
1638 iconv_strpos($str, $needle, $offset [,$charset]) //查找子串首次出现的位置
1639 iconv_strrpos($str, $needle [,$charset]) //查找子串最后一次出现的位置
1640 iconv_substr($str, $offset [,$len [,$charset]]) //截取子串
1641 
1642 
1643 /* 【字符串函数】*/
1644 addslashes($str)    //使用反斜线转移字符串
1645 stripcslashes($str) //反引用一个使用addcslashes转义的字符串
1646 stripslashes($str)  //反引用一个引用字符串
1647 chr($ascii) //返回ASCII码的字符
1648 ord($char)  //返回字符的ASCII码
1649 substr_count($haystack, $needle)    //计算子串出现的次数
1650 count_chars($str [,$mode])  统计每个字节值出现的次数
1651     //0 - 以所有的每个字节值作为键名,出现次数作为值的数组。  
1652     //1 - 与0相同,但只列出出现次数大于零的字节值。  
1653     //2 - 与0相同,但只列出出现次数等于零的字节值。  
1654     //3 - 返回由所有使用了的字节值组成的字符串。  
1655     //4 - 返回由所有未使用的字节值组成的字符串。 
1656 crypt($str, [$salt])    //单向字符串散列
1657 str_split($str [,$len]) //将字符串按长度分割为数组
1658 explode($separ, $str)   //使用一个字符串分割另一个字符串
1659 implode([$glue,] $arr)  //将数组元素的值根据$glue连接成字符串
1660 chunk_split($str [,$len [,$end]])   //将字符串分割成小块
1661     $len:每段字符串的长度,$end:每段字符串末尾加的字符串(如"\r\n")
1662 html_entity_decode($str [,$flags [,$encoding]]) //将HTML实体转成字符信息
1663 htmlentities($str [,$flags [,$encoding]])   //将字符信息转成HTML实体
1664 htmlspecialchars_decode($str)   //将特殊HTML实体转成字符信息
1665 htmlspecialchars($str [,$flags [,$encoding]])   //将字符信息转成特殊HTML实体
1666 lcfirst($str)   //将字符串首字母转成小写
1667 ucfirst($str)   //将字符串首字母转成大写
1668 ucwords($str)   //将字符串中每个单词的首字母转换为大写
1669 strtolower($str)    //将字符串转化为小写
1670 strtoupper($str)    //将字符串转化为大写
1671 trim($str [,$charlist]) //去除字符串首尾处的空白字符(或者其他字符)
1672 ltrim($str [,$charlist])    //去除字符串首段的空白字符(或者其他字符)
1673 rtrim($str [,$charlist])    //去除字符串末端的空白字符(或者其他字符)
1674 md5_file($file) //计算指定文件的MD5散列值
1675 md5($str)   //计算字符串的MD5散列值
1676 money_format($format, $num) //将数字格式化为货币形式
1677 number_format($num) //格式化数字
1678 nl2br($str) //在字符串所有新行之前插入HTML换行标记<br />
1679 parse_str($str, [$arr]) //解析字符串
1680 print($str) //输出字符串
1681 printf      //输出格式化字符串
1682 sprintf($format [,$args...])    //格式化字符串
1683 sha1_file   //计算文件的sha1散列值
1684 sha1        //计算字符串的sha1散列值
1685 similar_text($first, $second [,$percent])   //计算两个字符串的相似度
1686     返回在两个字符串中匹配字符的数目,$percent存储相似度百分比
1687 str_replace($search, $replace, $str [,$count [,$type]])  //子字符串替换
1688 str_ireplace    //字符串替换(忽略大小写)
1689 str_pad($str, $len [,$pad [,$type]])  //使用另一个字符串填充字符串为指定长度
1690     $type:在何处填充。STR_PAD_RIGHT,STR_PAD_LEFT 或 STR_PAD_BOTH
1691 str_repeat($str, $num)  //重复一个字符串
1692 str_shuffle($str)   //随机打乱一个字符串
1693 str_word_count($str [,$format [,$charlist]])    //返回字符串中单词的使用情况
1694 strcasecmp($str1, $str2)    //二进制安全比较字符串(不区分大小写)
1695     如果str1小于str2,返回负数;如果str1大于str2,返回正数;二者相等则返回0。
1696 strcmp($str1, $str2)    //二进制安全字符串比较
1697 strcoll($str1, $str1)   //基于区域设置的字符串比较(区分大小写,非二进制安全)
1698 strcspn($str1, $str1 [,$start [,$len]])   //获取不匹配遮罩的起始子字符串的长度
1699 strip_tags($str)    //从字符串中去除HTML和PHP标记
1700 strpos($haystack, $needle [,$offset])   //查找字符串首次出现的位置
1701 stripos($haystack, $needle [,$offset])    //查找字符串首次出现的位置(不区分大小写)
1702 strripos($haystack, $needle [,$offset])   //计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
1703 strrpos($haystack, $needle [,$offset])   //计算指定字符串在目标字符串中最后一次出现的位置
1704 strlen($str)    //获取字符串长度
1705 strpbrk($haystack, $str)    //在字符串中查找一组字符的任何一个字符
1706 strrev($str)    //反转字符串
1707     join('', array_reverse(preg_split("//u", $str))); //实现对UTF-8字符串的反转
1708 strspn$subject, $mask)  //计算字符串中全部字符都存在于指定字符集合中的第一段子串的长度。
1709 strstr($haystack, $needle)   //查找字符串的首次出现
1710 stristr($haystack, $needle)   //查找字符串的首次出现(不区分大小写)
1711 strrchr($haystack, $needle) //查找指定字符在字符串中的最后一次出现
1712 strtok($str, $token)    //标记分割字符串
1713 substr_compare($main_str, $str, $offset [,$len) //二进制安全比较字符串(从偏移位置比较指定长度)
1714 substr_replace$str, $replace, $start [,$len]    //替换字符串的子串
1715 strtr($str, $from, $to) //转换指定字符
1716 substr($str, $start [,$len])    //返回字符串的子串
1717 vfprintf$handle, $format, $args)    //将格式化字符串写入流
1718 vprintf($format, $args) //输出格式化字符串
1719 vsprintf($format, $args) //返回格式化字符串
1720 wordwrap($str [,$width=75 [,$break='\n']])  //打断字符串为指定数量的字串
1721 
1722 crc32($str) //计算一个字符串的crc32多项式
1723     crc32算法[循环冗余校验算法]
1724     生成str的32位循环冗余校验码多项式。将数据转换成整数。
1725 
1726 /* mbstring(多字节字符串) */
1727 //需开启mbstring扩展
1728 mb_strimwidth($str, $start, $width [,$trim [,$encoding]])   //保留指定的子串(并补充)
1729 mb_stripos($str, $needle [,$offset [,$encoding]])   //查找子串首次出现的位置(忽略大小写)
1730 mb_strpos($str, $needle [,$offset [,$encoding]])   //查找子串首次出现的位置
1731 mb_strripos($str, $needle [,$offset [,$encoding]])   //查找子串最后一次出现的位置(忽略大小写)
1732 mb_strrpos($str, $needle [,$offset [,$encoding]])   //查找子串最后一次出现的位置
1733 mb_strstr($str, $needle [,$before [,$encoding]])    //返回子串首次出现位置之后(前)的字符串
1734 mb_stristr($str, $needle [,$before [,$encoding]])    //返回子串首次出现位置之后(前)的字符串(忽略大小写)
1735 mb_strrchr($str, $needle [,$before [,$encoding]])    //返回字符最后一次出现位置之后(前)的字符串
1736 mb_strrichr($str, $needle [,$before [,$encoding]])    //返回字符最后一次出现位置之后(前)的字符串(忽略大小写)
1737 
1738 mb_strtoupper($str [,$encoding])    //转换成大写
1739 mb_strtolower($str [,$encoding])    //转换成小写
1740 
1741 mb_strlen($str [,$encoding])    //获取字符串长度
1742 mb_split($pattern, $str [,$limit])  //将字符串分割成数组
1743 mb_substr($str, $start [,$len [,$encoding]])    //获取字符串的子串
1744 mb_strcut($str, $start [,$len [,$encoding]])    //获取字符串的子串
1745 mb_strwidth($str [,$encoding])  //获取字符串的宽度
1746 mb_substr_count($str, $needle [,$encoding]) //子串在字符串中出现的次数
1747 
1748 
1749 /* PCRE函数 */
1750 preg_filter($pattern, $replace, $subject [,$limit [,&$count]])  执行一个正则表达式搜索和替换
1751 preg_replace($pattern, $replace, $subject [,$limit [,&$count]])  执行一个正则表达式搜索和替换
1752 preg_replace_callback($pattern, $callback, $subject [,$limit [,&$count]])   执行一个正则表达式搜索并且使用一个回调进行替换
1753 preg_grep($pattern, $input [,$flags])   返回匹配模式的数组条目
1754 preg_match($pattern, $subject [,&$matches [,$flags [,$offset]]]) 执行一个正则表达式匹配
1755 preg_match_all($pattern, $subject [,&$matches [,$flags [,$offset]]]) 执行一个全局正则表达式匹配
1756     $matches存放返回的结果
1757         $matches[0][n] (n>=0) 表示存放第n+1个匹配到的结果
1758         $matches[m][n] (m>=1, n>=0) 表示存放第n+1个匹配到结果的第m个表达式的内容
1759 preg_split($pattern, $subject [,$limit [,$flags]])  通过一个正则表达式分隔字符串
1760     $limit表示限制分隔得到的子串最多只有limit个,-1表示不限制
1761     $flags参数1762         PREG_SPLIT_NO_EMPTY:将返回分隔后的非空部分
1763         PREG_SPLIT_DELIM_CAPTURE:用于分隔的模式中的括号表达式将被捕获并返回
1764         PREG_SPLIT_OFFSET_CAPTURE:对于每一个出现的匹配返回时将会附加字符串偏移量
1765 preg_quote($str [,$delimiter])  转义正则表达式字符
1766 preg_last_error()   返回最后一个PCRE正则执行产生的错误代码
1767 
1768 
1769 /* Math函数 */
1770 base_convert($number, $frombase, $tobase)   //在任意进制之间转换数字
1771 ceil($float)    //向上取整
1772 floor($float)   //向下取整
1773 exp($float) //计算e的指数
1774 hypot($x, $y)   //计算直角三角形的斜边长
1775 is_nan($val)    //判断是否为合法数值
1776 log($arg [,$base=e])  //自然对数
1777 max($num1, $num2, ...)  //找出最大值
1778     max($arr)   //找出数组中的最大值
1779 min($num1, $num2, ...)  //找出最小值
1780 rand([$min], $max)  //产生一个随机整数
1781 srand([$seed])  //播下随机数发生器种子
1782 mt_rand([$min], $max)   //生成更好的随机数
1783 mt_srand($seed)     //播下一个更好的随机数发生器种子
1784 pi()    //得到圆周率值
1785 pow($base, $exp)    //指数表达式
1786 sqrt($float)    //求平方根
1787 deg2rad($float) //将角度转换为弧度
1788 rad2deg($float) //将弧度数转换为相应的角度数
1789 round($val [,$pre=0]) //对浮点数进行四舍五入
1790 fmod($x, $y) //返回除法的浮点数余数
1791 
1792 
1793 
1794 /* 【MySQL函数】 */
1795 mysql_client_encoding([$link])  //返回字符集的名称
1796 mysql_set_charset($charset [,$link])    //设置客户端字符集编码
1797 mysql_connect($host, $user, $pass)  //打开一个到MySQL服务器的连接
1798 mysql_create_db($db [,$link])   //新建一个MySQL数据库
1799 mysql_pconnect($host, $user, $pass) //打开一个到MySQL服务器的持久连接
1800 mysql_ping([$link]) //Ping一个服务器连接,如果没有连接则重新连接
1801 mysql_close([$link])    //关闭MySQL连接
1802 
1803 mysql_data_seek($result, $row)  //移动内部结果的指针
1804 mysql_errno([$link])    //返回上一个MySQL操作中的错误信息的数字编码
1805 mysql_error([$link])    //返回上一个MySQL操作产生的文本错误信息
1806 mysql_affected_rows([$link])  //取得前一次MySQL操作所影响的记录行数
1807 mysql_info([$link]) //取得最近一条查询的信息
1808 mysql_insert_id([$link])    //取得上一步INSERT操作产生的ID
1809 
1810 mysql_query($sql [,$link])  //发送一条MySQL查询
1811 mysql_unbuffered_query($sql [,$link])   //向MySQL发送一条SQL查询,并不获取和缓存结果的行
1812 mysql_db_query($db, $sql [,$link])  //发送一条MySQL查询
1813 
1814 mysql_escape_string($str)   //转义一个字符串用于mysql_query
1815 mysql_real_escape_string($str)  //转义SQL语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集
1816 
1817 mysql_fetch_array($result [,$type]) //从结果集中取得一行作为关联数组,或数字数组,或二者兼有
1818 mysql_fetch_assoc($result)  //从结果集中取得一行作为关联数组
1819 mysql_fetch_object($result) //从结果集中取得一行作为对象
1820 mysql_fetch_row($result)    //从结果集中取得一行作为枚举数组
1821 mysql_fetch_field($result)  //从结果集中取得列信息并作为对象返回
1822 mysql_num_fields($result)   //取得结果集中字段的数目
1823 mysql_num_rows($result) //取得结果集中行的数目
1824 
1825 mysql_fetch_lengths($result)    //取得结果集中每个输出的长度
1826 mysql_field_flags($result, $field_offset)    //从结果中取得和指定字段关联的标志
1827 mysql_field_len($result, $field_offset)    //返回指定字段的长度
1828 mysql_field_name($result, $field_offset)    //取得结果中指定字段的字段名
1829 mysql_field_seek($result, $field_offset)    //将结果集中的指针设定为制定的字段偏移量
1830 mysql_field_table($result, $field_offset)   //取得指定字段所在的表名
1831 mysql_field_type($result, $field_offset)    //取得结果集中指定字段的类型
1832 mysql_free_result($result)  //释放结果内存
1833 
1834 mysql_list_dbs([$link]) //列出MySQL服务器中所有的数据库
1835 mysql_list_fields($db, $table [,$link]) //列出MySQL结果中的字段
1836 mysql_list_processes([$link])   //列出MySQL进程
1837 mysql_list_tables($db [,$link]) //列出MySQL数据库中的表
1838 
1839 mysql_result($result, $row [$field])    //取得结果数据
1840 mysql_select_db($db [,$link])   //选择MySQL数据库
1841 mysql_tablename($result, $i)    //取得表名
1842 mysql_db_name($result, $row [,$field])  //取得mysql_list_dbs()调用所返回的数据库名
1843 
1844 mysql_stat([$link]) //取得当前系统状态
1845 mysql_thread_id([$link])    //返回当前线程的ID
1846 mysql_get_client_info() //取得MySQL客户端信息
1847 mysql_get_host_info()   //取得MySQL主机信息
1848 mysql_get_proto_info()  //取得MySQL协议信息
1849 mysql_get_server_info() //取得MySQL服务器信息
1850 
1851 
1852 /* 【SQL注入】 */
1853 特殊字符导致的问题:
1854     1. 转义:mysql_real_escape_string()
1855         对外来数据(GPC: GET, POST, COOKIE)进行转义
1856     2. 先查询当前记录行,再匹配用户名
1857 
1858 //魔术引号机制
1859 自动为所有提交到服务器的数据增加特殊符号的转义。
1860 当打开时,所有的单引号,双引号,反斜线和NULL字符都会被自动加上一个反斜线进行转义。这和addslashes()作用完全相同。
1861 php.ini配置:
1862     magic_quotes_gpc = Off
1863 get_magic_quotes_gpc()  获取当前魔术引号机制的配置信息
1864 
1865 /* 【错误处理】 */
1866 解析错误、运行错误
1867 //标准错误:
1868     级别、信息、文件、行号
1869     trigger_error   触发一个用户自定义的error/warning/notice错误信息
1870 
1871 //php.ini配置,ini_set()
1872 error_reporting         设置报告哪些级别的错误
1873 # 错误报告:显示到页面
1874     display_errors = On 是否显示错误报告
1875 # 错误日志:存放到文件
1876     log_errors = on     是否开启错误日志
1877     error_log           发送错误信息到错误日志文件
1878 - 错误报告和错误日志可同时启用!
1879 
1880 自定义错误处理器
1881 set_error_handler — 注册自定义错误处理器函数
1882 - 自定义处理器函数包含4个参数,分别是级别、信息、文件、行号
1883 - 开启自定义错误处理器,则系统内置的错误报告和错误日志则不会执行。
1884 - 自定义错误处理器函数返回false,则自定义函数结束后系统内置的会继续执行。
1885 - 用户定义的错误级别(E_USER_ERROR),可以被自定义的错误处理器所捕获并继续执行。系统内置的错误,则脚本会立即停止。
1886 restore_error_handler — 恢复预定义错误处理器函数
1887 error_get_last — 获取最近的错误信息
1888 
1889 //错误处理函数
1890 debug_backtrace 产生一条回溯跟踪
1891     返回数组,包含的键值:function, line, file, class, object, type, args
1892 debug_print_backtrace 打印一条回溯
1893 
1894 //错误常量
1895 手册>错误处理
1896 
1897 #生产模式
1898 关闭错误报告,记录错误日志。
1899 #开发模式
1900 关闭错误日志,开启错误报告。
1901 
1902 //异常
1903 面向对象语法中的错误处理方式。
1904 一个异常就是一个包含当前异常信息的对象。
1905 预定义异常类Exception及其扩展类。
1906 #抛出异常
1907 触发一个异常的错误
1908 throw new UserException();
1909 如果没有被捕获,则报告致命错误。
1910 #监视异常
1911 try {代码段}
1912 #捕获异常
1913 catch (UserException $obj) {代码段}
1914 需要通过当前异常的类型匹配才可悲捕获。
1915 #异常处理器
1916 用以处理未被捕获的异常。
1917 异常处理器函数与catch类似,参数也是含类型的对象。
1918 set_exception_handler — 注册异常处理器函数
1919 restore_exception_handler — 恢复预定义的异常处理器函数
1920 
1921 
1922 #自定义异常
1923 用户定义的异常类须继承自Exception类。
1924 
1925 //异常相关属性
1926 protected string $message 异常消息内容
1927 protected int $code 异常代码
1928 protected string $file 抛出异常的文件名
1929 protected int $line 抛出异常在该文件中的行号
1930 //异常相关方法
1931 Exception::__construct — 异常构造函数
1932 Exception::getMessage — 获取异常消息内容
1933 Exception::getPrevious — 返回异常链中的前一个异常
1934 Exception::getCode — 获取异常代码
1935 Exception::getFile — 获取发生异常的程序文件名称
1936 Exception::getLine — 获取发生异常的代码在文件中的行号
1937 Exception::getTrace — 获取异常追踪信息
1938 Exception::getTraceAsString — 获取字符串类型的异常追踪信息
1939 Exception::__toString — 将异常对象转换为字符串
1940 Exception::__clone — 异常克隆
1941 
1942 /* 【数据库抽象层】 */
1943 PDO:PHP Data Objects
1944 PHO抽象层默认被加载,但需加载相应数据库的驱动。
1945 PDO是OOP语法,提供三个类:
1946 PDO:PDO自身
1947 PDOStatement:PDO语句类,提供对语句的后续处理
1948 PDOException:PDO异常类,提供对错误的异常处理
1949 
1950 //连接数据库
1951 PDO::__construct(str $dsn [,str $username [,str $password [,arr $driver_options]]])
1952 DSN:Data Source Name,数据源
1953 $dsn = 'mysql:dbname=testdb;host=127.0.0.1;port=3306';
1954 //执行没有返回结果的SQL语句
1955 int PDO::exec(str $statement)   //返回影响的记录数
1956 //执行有返回结果集的SQL语句
1957 PDOStatement PDO::query (string $statement) //返回PDOStatement对象
1958 //处理结果集(PDOStatement对象)
1959 array PDOStatement::fetchAll([int $fetch_style [,mixed $fetch_argument [,array $ctor_args = array()]]])    //默认返回关联+索引数组
1960 mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )  //返回一行
1961 string PDOStatement::fetchColumn ([ int $column_number = 0 ] )  //返回一列
1962 //释放资源
1963 unset($pdo) 或 $pdo = null
1964 
1965 //错误报告
1966 静默模式:silent mode,出现错误,不主动报告错误(默认)
1967 array PDO::errorInfo(void)
1968 警告模式:warning mode,出现错误,触发一个警告级别的错误
1969 异常错误:exception mode,出现错误,抛出异常
1970 bool PDO::setAttribute(int $attribute, mixed $value)    //设置PDO类属性值
1971 PDO::setAttribute('PDO::ATTR_ERRMODE', 'PDO::ERRMODE_SILENT | PDO::ERRMODE_WARNING | PDO::ERRMODE_EXCEPTION')
1972 
1973 //预处理式执行SQL
1974 可对数据自动转义,可有效抵制SQL注入。
1975 PDOStatement PDO::prepare(string $statement [,array $driver_options=array()])
1976 bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )
1977 bool PDOStatement::execute ([ array $input_parameters ] )
1978 
1979 
1980 /* 【AR模式】 */
1981 表  ->1982 字段 ->  类属性
1983 数据 ->  对象
1984 
1985 
1986 /* Date/Time */
1987 date($format [,$timestamp]) //格式化一个本地时间/日期,$timestamp默认为time()
1988     Y:4位数字完整表示的年份
1989     m:数字表示的月份,有前导零
1990     d:月份中的第几天,有前导零的2位数字
1991     j:月份中的第几天,没有前导零
1992     H:小时,24小时格式,有前导零
1993     h:小时,12小时格式,有前导零
1994     i:有前导零的分钟数
1995     s:秒数,有前导零
1996     L:是否为闰年,如果是闰年为1,否则为0
1997     M:三个字母缩写表示的月份,Jan到Dec
1998     W:年份中的第几周,每周从星期一开始
1999     z:年份中的第几天
2000     N:数字表示的星期中的第几天
2001     w:星期中的第几天,数字表示
2002     e:时区标识
2003     T:本机所在的时区
2004     U:从Unix纪元开始至今的秒数(时间戳)
2005 time() //返回当前的Unix时间戳(秒)
2006 microtime([$get_as_float]) //返回当前Unix时间戳和微秒数
2007     $get_as_float参数存在并且其值等价于TRUE,将返回一个浮点数
2008 strtotime($time [,$now]) //将任何英文文本的日期时间描述解析为Unix时间戳
2009     date("Y-m-d H:i:s", strtotime("-1 day")); //格式化前一天的时间戳
2010     "now"
2011     "10 September 2000"
2012     "+1 week"
2013     "+1 week -2 days 4 hours 2 seconds"
2014     "last Monday"
2015     "next Thursday"
2016 gmdate($format [,$timestamp]) //格式化一个GMT/UTC 日期/时间
2017 mktime([$hour = date("H") [,$minute = date("i") [,$second = date("s") [,$month = date("n") [,$day = date("j") [,$year = date("Y") [,$is_dst = -1]]]]]]]) //取得一个日期的Unix时间戳
2018 strftime($format [,$timestamp]) //根据区域设置格式化本地时间/日期
2019 date_default_timezone_get($timezone) //获取默认时区
2020 date_default_timezone_set($timezone) //设置默认时区
2021 
2022 
2023 /* DateTime */
2024 //date()函数能处理有效时间戳范围是格林威治时间 1901 年 12 月 13 日 20:45:54 到 2038 年 1 月 19 日 03:14:07(因为32位系统能最大正整数限制)
2025 DateTime::__construct([$time="now"]) //构造方法
2026     $time若是时间戳,则在时间戳前加@符号,如'@2345678'
2027 DateTime::setTimezone($timezone) //设置时区
2028     eg: $date->setTimezone(new DateTimeZone('PRC'));
2029 DateTime::format($format) //格式化时间戳,格式化字符串形式同date()函数
2030 
2031 
2032 /* $_SERVER */
2033 //示例URL:http://desktop/dir/demo.php?a=aaa&b=bbb
2034 PHP_SELF 当前执行脚本的文件名 // /dir/demo.php
2035 GATEWAY_INTERFACE 服务器使用的CGI规范的版本 // CGI/1.1
2036 SERVER_ADDR 当前运行脚本所在的服务器的IP地址 // 127.0.0.1
2037 SERVER_NAME 当前运行脚本所在的服务器的主机名 // desktop
2038 SERVER_SOFTWARE 服务器标识字符串 // Apache/2.2.22 (Win32) PHP/5.3.13
2039 SERVER_PROTOCOL 请求页面时通信协议的名称和版本 // HTTP/1.1
2040 REQUEST_METHOD 访问页面使用的请求方式 // GET
2041 REQUEST_TIME 请求开始时的时间戳 // 1386032633
2042 QUERY_STRING 查询字符串(参数) // a=aaa&b=bbb
2043 DOCUMENT_ROOT 当前运行脚本所在的文档根目录 // C:/Users/Administrator/Desktop
2044 HTTP_ACCEPT 当前请求头中Accept:项的内容 // text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
2045 HTTP_ACCEPT_CHARSET 当前请求头中Accept-Charset:项的内容 // UTF-8,*
2046 HTTP_ACCEPT_ENCODING 当前请求头中Accept-Encoding:项的内容 // gzip, deflate
2047 HTTP_ACCEPT_LANGUAGE 当前请求头中Accept-Language:项的内容 // zh-cn,zh;q=0.5
2048 HTTP_CONNECTION 当前请求头中Connection:项的内容 // keep-alive
2049 HTTP_HOST 当前请求头中Host:项的内容 // desktop
2050 HTTP_REFERER 引导用户代理到当前页的前一页的地址
2051 HTTP_USER_AGENT 当前请求头中User-Agent:项的内容 // Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
2052 HTTPS 如果脚本是通过HTTPS协议被访问,则被设为一个非空的值
2053 REMOTE_ADDR 浏览当前页面的用户的IP地址 // 127.0.0.1
2054 REMOTE_HOST 浏览当前页面的用户的主机名
2055 REMOTE_PORT 用户机器上连接到Web服务器所使用的端口号 // 49197
2056 REMOTE_USER 经验证的用户
2057 REDIRECT_REMOTE_USER 验证的用户,如果请求已在内部重定向
2058 SCRIPT_FILENAME 当前执行脚本的绝对路径 // C:/Users/Administrator/Desktop/dir/demo.php
2059 SERVER_ADMIN 该值指明了Apache服务器配置文件中的SERVER_ADMIN参数 //admin@shocker.com
2060 SERVER_PORT Web服务器使用的端口 // 80
2061 SERVER_SIGNATURE 包含了服务器版本和虚拟主机名的字符串
2062 PATH_TRANSLATED 当前脚本所在文件系统(非文档根目录)的基本路径
2063 SCRIPT_NAME 当前脚本的路径 // /dir/demo.php
2064 REQUEST_URI URI用来指定要访问的页面 // /dir/demo.php?a=aaa&b=bbb
2065 PHP_AUTH_DIGEST 客户端发送的“Authorization” HTTP头内容
2066 PHP_AUTH_PW 用户输入的密码
2067 AUTH_TYPE 认证的类型
2068 PATH_INFO 包含由客户端提供的、跟在真实脚本名称之后并且在查询语句(query string)之前的路径信息
2069 ORIG_PATH_INFO 在被PHP处理之前,“PATH_INFO”的原始版本
2070 
2071 
2072 
2073 
2074 /* 缓存 */
2075 1. ob缓存(输出缓存)(需开启)
2076     php.ini设置中开启并设置输出缓存大小:output_buffering = 4096
2077     ob_start()  开启当前脚本页面的输出缓存
2078     如果输出缓存打开,则输出的数据先放到输出缓存(header函数前可以有输出),否则直接放入程序缓存。
2079     header()函数发送的内容直接放入程序缓存。
2080     开启输出缓存后,输出缓存数据会刷新到程序缓存,然后有Apache封装成http响应包返回给浏览器。
2081     输出缓存:存放的数据是从开启输出缓存开始返回给浏览器的所有静态页面数据!
2082 2. 程序缓存(内部缓存,必须存在,不能关闭)
2083 3. 浏览器缓存
2084 
2085 /* ob缓存(输出控制) */ Output Buffering
2086 ob_start()  //打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存在输出缓冲区里面。
2087     ob_start('ob_gzhandler'); //将gz编码的数据发送到支持压缩页面的浏览器
2088 
2089 ob_clean();            //删除内部缓冲区的内容,不关闭缓冲区(不输出)。
2090 ob_end_clean();        //删除内部缓冲区的内容,关闭缓冲区(不输出)。
2091 ob_get_clean();        //返回内部缓冲区的内容,关闭缓冲区。相当于执行ob_get_contents()与ob_end_clean()
2092 ob_flush();            //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,不关闭缓冲区。
2093 ob_end_flush();        //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,关闭缓冲区。
2094 ob_get_flush();        //返回内部缓冲区的内容,并关闭缓冲区,再释放缓冲区的内容。相当于ob_end_flush()并返回缓冲区内容。
2095 flush();               //将当前为止程序的所有输出发送到用户的浏览器
2096 
2097 ob_get_contents();     //返回缓冲区的内容,不输出。
2098 ob_get_length();       //返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。
2099 ob_get_level();        //Return the nesting level of the output buffering mechanism.
2100 ob_get_status();       //获取ob状态信息
2101 
2102 ob_implicit_flush();   //打开或关闭绝对刷新,默认为关闭,打开后ob_implicit_flush(true),所谓绝对刷新,即当有输出语句(e.g: echo)被执行时,便把输出直接发送到浏览器,而不再需要调用flush()或等到脚本结束时才输出。
2103 
2104 ob_gzhandler               //ob_start回调函数,用gzip压缩缓冲区的内容。
2105 ob_list_handlers           //List all output handlers in use
2106 output_add_rewrite_var     //Add URL rewriter values
2107 output_reset_rewrite_vars  //Reset URL rewriter values
2108 
2109 这些函数的行为受php_ini设置的影响:
2110 output_buffering       //该值为ON时,将在所有脚本中使用输出控制;若该值为一个数字,则代表缓冲区的最大字节限制,当缓存内容达到该上限时将会自动向浏览器输出当前的缓冲区里的内容。
2111 output_handler         //该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。
2112 implicit_flush         //作用同ob_implicit_flush,默认为Off。
2113 
2114 //ob缓存作用
2115 1)防止在浏览器有输出之后再使用setcookie()、header()或session_start()等发送头文件的函数造成的错误。其实这样的用法少用为好,养成良好的代码习惯。
2116 2)捕捉对一些不可获取的函数的输出,比如phpinfo()会输出一大堆的HTML,但是我们无法用一个变量例如$info=phpinfo();来捕捉,这时候ob就管用了。
2117 3)对输出的内容进行处理,例如进行gzip压缩,例如进行简繁转换,例如进行一些字符串替换。
2118 4)生成静态文件,其实就是捕捉整页的输出,然后存成文件。经常在生成HTML,或者整页缓存中使用。
2119 
2120 
2121 /* 网站并发 */
2122 测试工具:apache/bin/ab.exe
2123 用法:cmd{%apache-bin%}>ab.exe -n 执行访问次数 -c 用户并发数量 URL地址
2124 MPM(多路处理模块):perfork(预处理模式), worker(工作者模式), winnt(Win系统)
2125 MPM配置:httpd-mpm.conf
2126 查看当前MPM模式:httpd –l    mpm_xxx.c中xxx表示当前模式类型
2127 httpd.conf配置(开启MPM):#Include conf/extra/httpd-mpm.conf
2128 #参考配置
2129 #配置文件:extra/httpd-mpm.conf
2130 #mpm_winnt.c
2131 <IfModule mpm_winnt_module>
2132     ThreadsPerChild      1000   #中型网站1500-5500合理
2133     MaxRequestsPerChild  0
2134 </IfModule>
2135 #mpm_prefork.c
2136 <IfModule mpm_prefork_module>
2137     StartServers    5       #预先启动
2138     MinSpareServers 5
2139     MaxSpareServers 10      #最大空闲进程
2140     ServerLimit     1500    #用于修改apache编程参数
2141     MaxClients      1000    #最大并发数
2142     MaxRequestsPerChild 0   #一个进程对应的线程数,对worker更用
2143 </IfModule>
2144 #如果你的网站pv值上百万
2145 ServerLimit     2500   #用于修改apache编程参数
2146 MaxClients      2000   #最大并发数
2147 
2148 
2149 /* 静态化 */
2150 1. 页面URL长度不超过255字节
2151 2. meta信息尽量完整,keywords5个左右
2152 3. 前端不要使用框架
2153 4. 图片alt属性添加信息
2154 5. 静态页面不要带动态值
2155 
2156 <script type="text/javascript" language="javascript" src="url"></script>
2157 url可以是js/php/图片等,返回的数据替换<script>标签所在位置的内容!相当于简单的Ajax
2158 
2159 
2160 /* Apache压缩 */
2161 gzip/deflate
2162 
2163 
2164 /* XSS攻击 */
2165 #恶意JS代码
2166 #不规则HTML代码
2167 
2168 开源过滤器:htmlpurifier
2169 
2170 //获取COOKIE
2171 <script>
2172 var c = document.cookie; //获取COOKIE
2173 var script = document.createElement('script'); //创建script标签
2174 script.src = 'demo.php?c=' + c; //发送到指定的文件接收
2175 document.body.appendChild(script); //添加到DOM对象中生效
2176 </script>
2177 
2178 
2179 /* 命令行CLI */
2180 //显示帮助信息
2181 php -h
2182 //解析并运行-f选项给定的文件名
2183 php [-f] <file> [--] [args...]
2184 //在命令行内运行单行PHP代码
2185 php [options] -r <code> [--] [args...]
2186 无需加上PHP的起始和结束标识符,否则将会导致语法解析错误
2187 //调用phpinfo()函数并显示出结果
2188 php -i/--info
2189 //检查PHP语法
2190 php -l/--syntax-check
2191 //打印出内置以及已加载的PHP及Zend模块
2192 php -m/--modules
2193 //将PHP,PHP SAPI和Zend的版本信息写入标准输出
2194 php -v/--version
2195 
2196 //参数接收
2197 $argv    传递给脚本的参数数组
2198     第一个参数总是当前脚本的文件名,因此$argv[0]就是脚本文件名
2199 $argc    传递给脚本的参数数目
2200     脚本的文件名总是作为参数传递给当前脚本,因此$argc的最小值为1
2201 包含当运行于命令行下时传递给当前脚本的参数的数组
2202 此两个变量仅在register_argc_argv打开时可用
2203 
2204 
2205 /* 设计模式 */
2206 单例模式:为一个类生成一个唯一的对象。使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
2207 工厂模式:封装对象的建立过程。可以在对象本身创建对象工厂或者是一个额外的工厂类
2208 MVC模式:用户->控制器->模型->控制器->视图->控制器->用户
2209 
2210 
2211 /* 配置选项 */
2212 set_time_limit($seconds) //设置脚本最大执行时间(默认30秒),0表示不限制
2213 ini_get($varname) //获取一个配置选项的值
2214 ini_set($varname, $newvalue) //为一个配置选项设置值
2215 extension_loaded($ext_name) //检测一个扩展是否已经加载
2216 get_extension_funcs($ext_name) //返回模块函数名的数组
2217 
2218 
2219 /* 【其他】 */
2220 version_compare(str $ver1, str $ver2 [,str $operator])  //比较版本号
2221     $operator表示操作符,可选:<, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne
2222     如果省略$operator,返回两个版本号的差值。
2223 符号@    用于抑制系统运行错误的报告显示
2224 memory_get_usage    //获取当期内存使用情况
2225 memory_get_peak_usage   //获取内存使用的峰值
2226 getrusage   //获取CPU使用情况(Windows不可用)
2227 uniqid([$prefix])   //获取一个带前缀、基于当前时间微秒数的唯一ID
2228 highlight_string($str [,$return])   //字符串的语法高亮
2229     $return:设置为TRUE,高亮后的代码不会被打印输出,而是以字符串的形式返回。高亮成功返回TRUE,否则返回FALSE。
2230 highlight_file($file [,$return])    //语法高亮一个文件
2231 __halt_compiler     //中断编译器的执行
2232 get_browser     //获取浏览器具有的功能
2233     get_browser ([ string $user_agent [, bool $return_array = false ]] )
2234     如果设置为 TRUE,该函数会返回一个 array,而不是 object
2235 eval($code) //把字符串作为PHP代码执行
2236 gzcompress($str [,$level=-1])   //压缩字符串
2237 gzuncompress($str)  //解压缩字符串
2238 gzencode($str [,$level=-1])   //压缩字符串
2239 gzdecode($str)  //解压缩字符串
2240 ignore_user_abort($bool) //设置客户端断开连接时是否中断脚本的执行

 

//语法错误(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_MAX                    INT最大值,32位平台时值为2147483647PHP_INT_SIZE                   INT字长,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     oct    hexhexdec()    十六进制转十进制        也可写hex2dec()dechex()    十进制转十六进制        也可写dec2hex()bindec()    二进制转十进制        也可写bin2dec()decbin()    十进制转二进制        也可写dex2bin()octdec()    八进制转十进制        也可写oct2dec()decoct()    十进制转八进制        也可写dec2oct()

/* 浮点数 */浮点数不能比较大小 !!!几乎所有小数,在保存时都是近似值而不是精确值!最大值:+/- 1.8E308PHP所能保存的最长小数位:14位
/* 单引号字符串 */单引号字符串中,只能转义反斜杠和单引号
/* 双引号字符串 */只解析字符串一次 !!!eval     把字符串作为PHP代码执行大括号包裹变量,可确定变量名界限。如:"aaa{$bbb}ccc"双引号中可以将ASCII码转换为字符"\x61" -> a    // 字符串中不需0,整型中才是0x前导"\x49\x54\x43\x41\x53\x54" -> ITCAST将ASCII转成字符函数chr()将字符转成ASCII函数ord()#双引号转义列表\n 换行\r 回车\t 水平制表符\\ 反斜线\$ 美元标记\v 垂直制表符\e Escape\f 换页\" 双引号"\[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_object       is_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. 默认参数可以是非标量类型,比如数组、null        d. 任何默认参数必须放在任何非默认参数的右侧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. $GLOBALS    1) 不能存在超全局变量,但可以有超全局的数据!    2) 将需要的数据放到超全局变量的数组内,但统一使用$GLOBALS    3) $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()初始化一下就可解决。

/* 【遍历数组】 */* 先找到元素,再获取键和值
foreach    foreach (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\n";}


/* 【数组函数】 *///统计计算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    回调函数void        void作为返回类型意味着函数的返回值是无用的。            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+'    读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。        'a'     写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。        'a+'    读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。        'x'     创建并以写入方式打开,将文件指针指向文件头。        'x+'    创建并以读写方式打开,将文件指针指向文件头。fclose($handle) 关闭一个已打开的文件指针fread($handle, $length) 读取文件(可安全用于二进制文件)fwrite($handle, $string [,$length]) 写入文件(可安全用于二进制文件)rewind($handle) 倒回文件指针的位置ftell($handle)  返回文件指针读/写的位置fseek($handle, $offset [,$whence])  在文件指针中定位feof($handle)   测试文件指针是否到了文件结束的位置fgets   从文件指针中读取一行fgetss  从文件指针中读取一行并过滤掉HTML标记flock($handle, $opt) 轻便的咨询文件锁定    $opt:LOCK_SH 取得共享锁定(读取的程序);LOCK_EX 取得独占锁定(写入的程序);LOCK_UN 释放锁定(无论共享或独占)

readfile($file) 读入一个文件并写入到输出缓冲fflush($handle) 将缓冲内容输出到文件
touch($file [,$time [,$atime]])   设定文件的访问和修改时间fileatime   取得文件的上次访问时间filectime   取得文件的inode修改时间filegroup   取得文件的组fileinode   取得文件的inodefilemtime   取得文件修改时间fileowner   取得文件的所有者fileperms   取得文件的权限filesize    取得文件大小filetype    取得文件类型

/* fileinfo */ 获取/设置文件信息#扩展Fileinfo,配置php.ini#extension=php_fileinfo.dllfinfo_open([$opt]) //创建一个文件信息资源finfo_file($finfo, $file [,$opt]) //获取文件信息finfo_set_flags($finfo, $opt) //设置文件信息项finfo_close($finfo) //关闭文件信息资源
mime_content_type($file) //获取文件的MIME类型
$opt参数选项:FILEINFO_MIME_ENCODING 文件编码类型FILEINFO_MIME_TYPE 文件MIME类型

//目录chdir($dir)         改变当前目录chroot($dir)        将当前目录改变为当前进程的根目录closedir($handle)   关闭目录句柄dir($dir)           返回一个目录的实例对象getcwd()            取得当前工作目录opendir($path)      打开目录句柄readdir($handle)    从目录句柄中读取条目rewinddir($handle)  倒回目录句柄scandir($dir [,$order])     列出指定路径中的文件和目录glob($pattern [,$flags])    寻找与模式匹配的文件路径    $flags:        GLOB_MARK - 在每个返回的项目中加一个斜线          GLOB_NOSORT - 按照文件在目录中出现的原始顺序返回(不排序)          GLOB_NOCHECK - 如果没有文件匹配则返回用于搜索的模式          GLOB_NOESCAPE - 反斜线不转义元字符          GLOB_BRACE - 扩充 {a,b,c} 来匹配 'a','b' 或 'c'          GLOB_ONLYDIR - 仅返回与模式匹配的目录项     查找多种后缀名文件:glob('*.{php,txt}', GLOB_BRACE);

/* 解压缩 *///新建ZipArchive对象$zip = new ZipArchive;//打开ZIP文件$zip->open($file [,$flags]);    $flags:        ZIPARCHIVE::OVERWRITE 覆盖(不存在会自动创建)        ZIPARCHIVE::CREATE 添加(不存在会自动创建)        ZIPARCHIVE::EXCL        ZIPARCHIVE::CHECKCONS//关闭正在处理的ZIP文件//解压缩ZIP文件$zip->extractTo($dest, [$entries]);    $dest:解压到的文件夹,$entries:解压的条目//添加文件到ZIP文件$zip->addFile($file, [$newname]);       $newname可以为"dir/file",这样可以将文件添加到压缩文件中的某个目录下。其他函数也如此。//添加文件到ZIP文件,而内容来自字符串$zip->addFromString($file, $str);//添加空文件夹到ZIP文件$zip->addEmptyDir($dir);//通过索引删除ZIP中的文件或文件夹$zip->deleteIndex($index);//通过名称删除ZIP中的文件或文件夹$zip->deleteName($name);//设置ZIP文件注释$zip->setArchiveComment($str);//获取ZIP文件注释$zip->getArchiveComment();//通过索引获取文件内容$zip->getFromIndex($index);//通过名称获取文件内容$zip->getFromName($name);//获取索引文件的文件名称$zip->getNameIndex($index);//通过索引重命名文件$zip->renameIndex($index, $newname);//通过名称重命名文件$zip->renameName($name, $newname);
//若将文件夹内容打包成ZIP文件,需循环文件夹的所有目录及文件function addFileToZip($path, $zip) {    //打开当前文件夹$path    $handle = opendir($path);    //循环读取子文件夹及文件    //为防止文件名本身可被转换为false的情况(比如为"0"),则需用不全等!==    while ($file = readdir($handle) !== false) {        //过滤假文件夹        if ($file != '.' && $file != '..') {            //对于子文件夹则递归调用本函数            if (is_dir($path . '/' . $file)) {                addFileToZip($path.'/'.$file, $zip);            } else {                //将文件添加到ZIP对象                $zip->addFile($path . '/' . $file);            }        }    }    //关闭文件夹$path    closedir($path);}// ----- END 解压缩 ----- //

/* 【文件上传】 */enctype="multipart/form-data"   //FORM标签必须的属性$_FILES 上传文件信息数组变量error   上传错误信息  无错误  文件大小超过php.ini配置        1) upload_max_filesize 允许上传的最大文件大小        2) post_max_size 最大的POST数据大小        3) memory_limit 每个脚本能够使用的最大内存数量(默认128MB)  文件大小超过浏览器表单配置        MAX_FILE_SIZE   表示表单数据最大文件大小,该元素需在文件上传域之前。(默认2M)        <input type="hidden" name="MAX_FILE_SIZE" value="102400">  文件只有部分被上传  文件没有被上传    6,7 临时文件写入时失败  找不到临时文件  文件写入失败name    文件名type    文件类型tmp_name    上传文件临时路径size    文件大小move_uploaded_file($path, $newpath);    //将上传的文件移动到新位置is_uploaded_file($file) //判断是否为POST上传的文件//多文件上传<input type="file" name="updfile[]" /> //HTML中以数组提交$_FILES['updfile']['tmp_name'][0]   //服务器端可访问第一个文件的临时路径,其他属性类似

//php.ini配置file_uploads = On 是否允许HTTP上传文件upload_max_filesize 上传文件大小限制,默认为2Mpost_max_size   post方式表单数据总大小限制,默认为8Mupload_tmp_dir  上传文件临时目录,默认是系统临时目录    需设置上传文件临时目录,给其最小权限GET方式的最大传输量为2K

/* 【批量提交】 */FORM表单中的name值可用名称加中括号的形式,在$_POST获取表单数据时,可多项提交形成数组。比如多文件上传file,复选框提交checkbox等。<input type="checkbox" name="id[]" value="值1" /><input type="checkbox" name="id[]" value="值2" />$id = $_POST['id']; //则可获得全部被选中的复选框值,形成索引数组如果name值为:<input type="checkbox" name="id[one]" value="值1" /><input type="checkbox" name="id[two]" value="值2" />$id = $_POST['id'];  //则可获取所有name为id[...]的值,形成管理数组

/* iconv *///php.ini配置iconv[iconv];iconv.input_encoding = ISO-8859-1;iconv.output_encoding = ISO-8859-1;iconv.internal_encoding = ISO-8859-1iconv_set_encoding($type, $charset);    $type:input_encoding,output_encoding,internal_encodingiconv_get_encoding([$type = "all"])    $type:all,input_encoding,output_encoding,internal_encoding


iconv($in_charset, $out_charset, $str) //将字符串转换为目标编码
指定编码,可解决中文字符的统计、查询、截取等!iconv_strlen($str [,$charset]) //统计字符串的字符数iconv_strpos($str, $needle, $offset [,$charset]) //查找子串首次出现的位置iconv_strrpos($str, $needle [,$charset]) //查找子串最后一次出现的位置iconv_substr($str, $offset [,$len [,$charset]]) //截取子串

/* 【字符串函数】*/addslashes($str)    //使用反斜线转移字符串stripcslashes($str) //反引用一个使用addcslashes转义的字符串stripslashes($str)  //反引用一个引用字符串chr($ascii) //返回ASCII码的字符ord($char)  //返回字符的ASCII码substr_count($haystack, $needle)    //计算子串出现的次数count_chars($str [,$mode])  统计每个字节值出现的次数    //0 - 以所有的每个字节值作为键名,出现次数作为值的数组。      //1 - 与0相同,但只列出出现次数大于零的字节值。      //2 - 与0相同,但只列出出现次数等于零的字节值。      //3 - 返回由所有使用了的字节值组成的字符串。      //4 - 返回由所有未使用的字节值组成的字符串。 crypt($str, [$salt])    //单向字符串散列str_split($str [,$len]) //将字符串按长度分割为数组explode($separ, $str)   //使用一个字符串分割另一个字符串implode([$glue,] $arr)  //将数组元素的值根据$glue连接成字符串chunk_split($str [,$len [,$end]])   //将字符串分割成小块    $len:每段字符串的长度,$end:每段字符串末尾加的字符串(如"\r\n")html_entity_decode($str [,$flags [,$encoding]]) //将HTML实体转成字符信息htmlentities($str [,$flags [,$encoding]])   //将字符信息转成HTML实体htmlspecialchars_decode($str)   //将特殊HTML实体转成字符信息htmlspecialchars($str [,$flags [,$encoding]])   //将字符信息转成特殊HTML实体lcfirst($str)   //将字符串首字母转成小写ucfirst($str)   //将字符串首字母转成大写ucwords($str)   //将字符串中每个单词的首字母转换为大写strtolower($str)    //将字符串转化为小写strtoupper($str)    //将字符串转化为大写trim($str [,$charlist]) //去除字符串首尾处的空白字符(或者其他字符)ltrim($str [,$charlist])    //去除字符串首段的空白字符(或者其他字符)rtrim($str [,$charlist])    //去除字符串末端的空白字符(或者其他字符)md5_file($file) //计算指定文件的MD5散列值md5($str)   //计算字符串的MD5散列值money_format($format, $num) //将数字格式化为货币形式number_format($num) //格式化数字nl2br($str) //在字符串所有新行之前插入HTML换行标记<br />parse_str($str, [$arr]) //解析字符串print($str) //输出字符串printf      //输出格式化字符串sprintf($format [,$args...])    //格式化字符串sha1_file   //计算文件的sha1散列值sha1        //计算字符串的sha1散列值similar_text($first, $second [,$percent])   //计算两个字符串的相似度    返回在两个字符串中匹配字符的数目,$percent存储相似度百分比str_replace($search, $replace, $str [,$count [,$type]])  //子字符串替换str_ireplace    //字符串替换(忽略大小写)str_pad($str, $len [,$pad [,$type]])  //使用另一个字符串填充字符串为指定长度    $type:在何处填充。STR_PAD_RIGHT,STR_PAD_LEFT 或 STR_PAD_BOTHstr_repeat($str, $num)  //重复一个字符串str_shuffle($str)   //随机打乱一个字符串str_word_count($str [,$format [,$charlist]])    //返回字符串中单词的使用情况strcasecmp($str1, $str2)    //二进制安全比较字符串(不区分大小写)    如果str1小于str2,返回负数;如果str1大于str2,返回正数;二者相等则返回0。strcmp($str1, $str2)    //二进制安全字符串比较strcoll($str1, $str1)   //基于区域设置的字符串比较(区分大小写,非二进制安全)strcspn($str1, $str1 [,$start [,$len]])   //获取不匹配遮罩的起始子字符串的长度strip_tags($str)    //从字符串中去除HTML和PHP标记strpos($haystack, $needle [,$offset])   //查找字符串首次出现的位置stripos($haystack, $needle [,$offset])    //查找字符串首次出现的位置(不区分大小写)strripos($haystack, $needle [,$offset])   //计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)strrpos($haystack, $needle [,$offset])   //计算指定字符串在目标字符串中最后一次出现的位置strlen($str)    //获取字符串长度strpbrk($haystack, $str)    //在字符串中查找一组字符的任何一个字符strrev($str)    //反转字符串    join('', array_reverse(preg_split("//u", $str))); //实现对UTF-8字符串的反转strspn$subject, $mask)  //计算字符串中全部字符都存在于指定字符集合中的第一段子串的长度。strstr($haystack, $needle)   //查找字符串的首次出现stristr($haystack, $needle)   //查找字符串的首次出现(不区分大小写)strrchr($haystack, $needle) //查找指定字符在字符串中的最后一次出现strtok($str, $token)    //标记分割字符串substr_compare($main_str, $str, $offset [,$len) //二进制安全比较字符串(从偏移位置比较指定长度)substr_replace$str, $replace, $start [,$len]    //替换字符串的子串strtr($str, $from, $to) //转换指定字符substr($str, $start [,$len])    //返回字符串的子串vfprintf$handle, $format, $args)    //将格式化字符串写入流vprintf($format, $args) //输出格式化字符串vsprintf($format, $args) //返回格式化字符串wordwrap($str [,$width=75 [,$break='\n']])  //打断字符串为指定数量的字串
crc32($str) //计算一个字符串的crc32多项式    crc32算法[循环冗余校验算法]    生成str的32位循环冗余校验码多项式。将数据转换成整数。
/* mbstring(多字节字符串) *///需开启mbstring扩展mb_strimwidth($str, $start, $width [,$trim [,$encoding]])   //保留指定的子串(并补充)mb_stripos($str, $needle [,$offset [,$encoding]])   //查找子串首次出现的位置(忽略大小写)mb_strpos($str, $needle [,$offset [,$encoding]])   //查找子串首次出现的位置mb_strripos($str, $needle [,$offset [,$encoding]])   //查找子串最后一次出现的位置(忽略大小写)mb_strrpos($str, $needle [,$offset [,$encoding]])   //查找子串最后一次出现的位置mb_strstr($str, $needle [,$before [,$encoding]])    //返回子串首次出现位置之后(前)的字符串mb_stristr($str, $needle [,$before [,$encoding]])    //返回子串首次出现位置之后(前)的字符串(忽略大小写)mb_strrchr($str, $needle [,$before [,$encoding]])    //返回字符最后一次出现位置之后(前)的字符串mb_strrichr($str, $needle [,$before [,$encoding]])    //返回字符最后一次出现位置之后(前)的字符串(忽略大小写)
mb_strtoupper($str [,$encoding])    //转换成大写mb_strtolower($str [,$encoding])    //转换成小写
mb_strlen($str [,$encoding])    //获取字符串长度mb_split($pattern, $str [,$limit])  //将字符串分割成数组mb_substr($str, $start [,$len [,$encoding]])    //获取字符串的子串mb_strcut($str, $start [,$len [,$encoding]])    //获取字符串的子串mb_strwidth($str [,$encoding])  //获取字符串的宽度mb_substr_count($str, $needle [,$encoding]) //子串在字符串中出现的次数

/* PCRE函数 */preg_filter($pattern, $replace, $subject [,$limit [,&$count]])  执行一个正则表达式搜索和替换preg_replace($pattern, $replace, $subject [,$limit [,&$count]])  执行一个正则表达式搜索和替换preg_replace_callback($pattern, $callback, $subject [,$limit [,&$count]])   执行一个正则表达式搜索并且使用一个回调进行替换preg_grep($pattern, $input [,$flags])   返回匹配模式的数组条目preg_match($pattern, $subject [,&$matches [,$flags [,$offset]]]) 执行一个正则表达式匹配preg_match_all($pattern, $subject [,&$matches [,$flags [,$offset]]]) 执行一个全局正则表达式匹配    $matches存放返回的结果        $matches[0][n] (n>=0) 表示存放第n+1个匹配到的结果        $matches[m][n] (m>=1, n>=0) 表示存放第n+1个匹配到结果的第m个表达式的内容preg_split($pattern, $subject [,$limit [,$flags]])  通过一个正则表达式分隔字符串    $limit表示限制分隔得到的子串最多只有limit个,-1表示不限制    $flags参数:        PREG_SPLIT_NO_EMPTY:将返回分隔后的非空部分        PREG_SPLIT_DELIM_CAPTURE:用于分隔的模式中的括号表达式将被捕获并返回        PREG_SPLIT_OFFSET_CAPTURE:对于每一个出现的匹配返回时将会附加字符串偏移量preg_quote($str [,$delimiter])  转义正则表达式字符preg_last_error()   返回最后一个PCRE正则执行产生的错误代码

/* Math函数 */base_convert($number, $frombase, $tobase)   //在任意进制之间转换数字ceil($float)    //向上取整floor($float)   //向下取整exp($float) //计算e的指数hypot($x, $y)   //计算直角三角形的斜边长is_nan($val)    //判断是否为合法数值log($arg [,$base=e])  //自然对数max($num1, $num2, ...)  //找出最大值    max($arr)   //找出数组中的最大值min($num1, $num2, ...)  //找出最小值rand([$min], $max)  //产生一个随机整数srand([$seed])  //播下随机数发生器种子mt_rand([$min], $max)   //生成更好的随机数mt_srand($seed)     //播下一个更好的随机数发生器种子pi()    //得到圆周率值pow($base, $exp)    //指数表达式sqrt($float)    //求平方根deg2rad($float) //将角度转换为弧度rad2deg($float) //将弧度数转换为相应的角度数round($val [,$pre=0]) //对浮点数进行四舍五入fmod($x, $y) //返回除法的浮点数余数


/* 【MySQL函数】 */mysql_client_encoding([$link])  //返回字符集的名称mysql_set_charset($charset [,$link])    //设置客户端字符集编码mysql_connect($host, $user, $pass)  //打开一个到MySQL服务器的连接mysql_create_db($db [,$link])   //新建一个MySQL数据库mysql_pconnect($host, $user, $pass) //打开一个到MySQL服务器的持久连接mysql_ping([$link]) //Ping一个服务器连接,如果没有连接则重新连接mysql_close([$link])    //关闭MySQL连接
mysql_data_seek($result, $row)  //移动内部结果的指针mysql_errno([$link])    //返回上一个MySQL操作中的错误信息的数字编码mysql_error([$link])    //返回上一个MySQL操作产生的文本错误信息mysql_affected_rows([$link])  //取得前一次MySQL操作所影响的记录行数mysql_info([$link]) //取得最近一条查询的信息mysql_insert_id([$link])    //取得上一步INSERT操作产生的ID
mysql_query($sql [,$link])  //发送一条MySQL查询mysql_unbuffered_query($sql [,$link])   //向MySQL发送一条SQL查询,并不获取和缓存结果的行mysql_db_query($db, $sql [,$link])  //发送一条MySQL查询
mysql_escape_string($str)   //转义一个字符串用于mysql_querymysql_real_escape_string($str)  //转义SQL语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集
mysql_fetch_array($result [,$type]) //从结果集中取得一行作为关联数组,或数字数组,或二者兼有mysql_fetch_assoc($result)  //从结果集中取得一行作为关联数组mysql_fetch_object($result) //从结果集中取得一行作为对象mysql_fetch_row($result)    //从结果集中取得一行作为枚举数组mysql_fetch_field($result)  //从结果集中取得列信息并作为对象返回mysql_num_fields($result)   //取得结果集中字段的数目mysql_num_rows($result) //取得结果集中行的数目
mysql_fetch_lengths($result)    //取得结果集中每个输出的长度mysql_field_flags($result, $field_offset)    //从结果中取得和指定字段关联的标志mysql_field_len($result, $field_offset)    //返回指定字段的长度mysql_field_name($result, $field_offset)    //取得结果中指定字段的字段名mysql_field_seek($result, $field_offset)    //将结果集中的指针设定为制定的字段偏移量mysql_field_table($result, $field_offset)   //取得指定字段所在的表名mysql_field_type($result, $field_offset)    //取得结果集中指定字段的类型mysql_free_result($result)  //释放结果内存
mysql_list_dbs([$link]) //列出MySQL服务器中所有的数据库mysql_list_fields($db, $table [,$link]) //列出MySQL结果中的字段mysql_list_processes([$link])   //列出MySQL进程mysql_list_tables($db [,$link]) //列出MySQL数据库中的表
mysql_result($result, $row [$field])    //取得结果数据mysql_select_db($db [,$link])   //选择MySQL数据库mysql_tablename($result, $i)    //取得表名mysql_db_name($result, $row [,$field])  //取得mysql_list_dbs()调用所返回的数据库名
mysql_stat([$link]) //取得当前系统状态mysql_thread_id([$link])    //返回当前线程的IDmysql_get_client_info() //取得MySQL客户端信息mysql_get_host_info()   //取得MySQL主机信息mysql_get_proto_info()  //取得MySQL协议信息mysql_get_server_info() //取得MySQL服务器信息

/* 【SQL注入】 */特殊字符导致的问题:    1. 转义:mysql_real_escape_string()        对外来数据(GPC: GET, POST, COOKIE)进行转义    2. 先查询当前记录行,再匹配用户名
//魔术引号机制自动为所有提交到服务器的数据增加特殊符号的转义。当打开时,所有的单引号,双引号,反斜线和NULL字符都会被自动加上一个反斜线进行转义。这和addslashes()作用完全相同。php.ini配置:    magic_quotes_gpc = Offget_magic_quotes_gpc()  获取当前魔术引号机制的配置信息
/* 【错误处理】 */解析错误、运行错误//标准错误:    级别、信息、文件、行号    trigger_error   触发一个用户自定义的error/warning/notice错误信息
//php.ini配置,ini_set()error_reporting         设置报告哪些级别的错误# 错误报告:显示到页面    display_errors = On 是否显示错误报告# 错误日志:存放到文件    log_errors = on     是否开启错误日志    error_log           发送错误信息到错误日志文件- 错误报告和错误日志可同时启用!
自定义错误处理器set_error_handler — 注册自定义错误处理器函数- 自定义处理器函数包含4个参数,分别是级别、信息、文件、行号- 开启自定义错误处理器,则系统内置的错误报告和错误日志则不会执行。- 自定义错误处理器函数返回false,则自定义函数结束后系统内置的会继续执行。- 用户定义的错误级别(E_USER_ERROR),可以被自定义的错误处理器所捕获并继续执行。系统内置的错误,则脚本会立即停止。restore_error_handler — 恢复预定义错误处理器函数error_get_last — 获取最近的错误信息
//错误处理函数debug_backtrace 产生一条回溯跟踪    返回数组,包含的键值:function, line, file, class, object, type, argsdebug_print_backtrace 打印一条回溯
//错误常量手册>错误处理
#生产模式关闭错误报告,记录错误日志。#开发模式关闭错误日志,开启错误报告。
//异常面向对象语法中的错误处理方式。一个异常就是一个包含当前异常信息的对象。预定义异常类Exception及其扩展类。#抛出异常触发一个异常的错误throw new UserException();如果没有被捕获,则报告致命错误。#监视异常try {代码段}#捕获异常catch (UserException $obj) {代码段}需要通过当前异常的类型匹配才可悲捕获。#异常处理器用以处理未被捕获的异常。异常处理器函数与catch类似,参数也是含类型的对象。set_exception_handler — 注册异常处理器函数restore_exception_handler — 恢复预定义的异常处理器函数

#自定义异常用户定义的异常类须继承自Exception类。
//异常相关属性protected string $message 异常消息内容protected int $code 异常代码protected string $file 抛出异常的文件名protected int $line 抛出异常在该文件中的行号//异常相关方法Exception::__construct — 异常构造函数Exception::getMessage — 获取异常消息内容Exception::getPrevious — 返回异常链中的前一个异常Exception::getCode — 获取异常代码Exception::getFile — 获取发生异常的程序文件名称Exception::getLine — 获取发生异常的代码在文件中的行号Exception::getTrace — 获取异常追踪信息Exception::getTraceAsString — 获取字符串类型的异常追踪信息Exception::__toString — 将异常对象转换为字符串Exception::__clone — 异常克隆
/* 【数据库抽象层】 */PDO:PHP Data ObjectsPHO抽象层默认被加载,但需加载相应数据库的驱动。PDO是OOP语法,提供三个类:PDO:PDO自身PDOStatement:PDO语句类,提供对语句的后续处理PDOException:PDO异常类,提供对错误的异常处理
//连接数据库PDO::__construct(str $dsn [,str $username [,str $password [,arr $driver_options]]])DSN:Data Source Name,数据源$dsn = 'mysql:dbname=testdb;host=127.0.0.1;port=3306';//执行没有返回结果的SQL语句int PDO::exec(str $statement)   //返回影响的记录数//执行有返回结果集的SQL语句PDOStatement PDO::query (string $statement) //返回PDOStatement对象//处理结果集(PDOStatement对象)array PDOStatement::fetchAll([int $fetch_style [,mixed $fetch_argument [,array $ctor_args = array()]]])    //默认返回关联+索引数组mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )  //返回一行string PDOStatement::fetchColumn ([ int $column_number = 0 ] )  //返回一列//释放资源unset($pdo) 或 $pdo = null
//错误报告静默模式:silent mode,出现错误,不主动报告错误(默认)array PDO::errorInfo(void)警告模式:warning mode,出现错误,触发一个警告级别的错误异常错误:exception mode,出现错误,抛出异常bool PDO::setAttribute(int $attribute, mixed $value)    //设置PDO类属性值PDO::setAttribute('PDO::ATTR_ERRMODE', 'PDO::ERRMODE_SILENT | PDO::ERRMODE_WARNING | PDO::ERRMODE_EXCEPTION')
//预处理式执行SQL可对数据自动转义,可有效抵制SQL注入。PDOStatement PDO::prepare(string $statement [,array $driver_options=array()])bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )bool PDOStatement::execute ([ array $input_parameters ] )

/* 【AR模式】 */表  ->  类字段 ->  类属性数据 ->  对象

/* Date/Time */date($format [,$timestamp]) //格式化一个本地时间/日期,$timestamp默认为time()    Y:4位数字完整表示的年份    m:数字表示的月份,有前导零    d:月份中的第几天,有前导零的2位数字    j:月份中的第几天,没有前导零    H:小时,24小时格式,有前导零    h:小时,12小时格式,有前导零    i:有前导零的分钟数    s:秒数,有前导零    L:是否为闰年,如果是闰年为1,否则为0    M:三个字母缩写表示的月份,Jan到Dec    W:年份中的第几周,每周从星期一开始    z:年份中的第几天    N:数字表示的星期中的第几天    w:星期中的第几天,数字表示    e:时区标识    T:本机所在的时区    U:从Unix纪元开始至今的秒数(时间戳)time() //返回当前的Unix时间戳(秒)microtime([$get_as_float]) //返回当前Unix时间戳和微秒数    $get_as_float参数存在并且其值等价于TRUE,将返回一个浮点数strtotime($time [,$now]) //将任何英文文本的日期时间描述解析为Unix时间戳    date("Y-m-d H:i:s", strtotime("-1 day")); //格式化前一天的时间戳    "now"    "10 September 2000"    "+1 week"    "+1 week -2 days 4 hours 2 seconds"    "last Monday"    "next Thursday"gmdate($format [,$timestamp]) //格式化一个GMT/UTC 日期/时间mktime([$hour = date("H") [,$minute = date("i") [,$second = date("s") [,$month = date("n") [,$day = date("j") [,$year = date("Y") [,$is_dst = -1]]]]]]]) //取得一个日期的Unix时间戳strftime($format [,$timestamp]) //根据区域设置格式化本地时间/日期date_default_timezone_get($timezone) //获取默认时区date_default_timezone_set($timezone) //设置默认时区

/* DateTime *///date()函数能处理有效时间戳范围是格林威治时间 1901 年 12 月 13 日 20:45:54 到 2038 年 1 月 19 日 03:14:07(因为32位系统能最大正整数限制)DateTime::__construct([$time="now"]) //构造方法    $time若是时间戳,则在时间戳前加@符号,如'@2345678'DateTime::setTimezone($timezone) //设置时区    eg: $date->setTimezone(new DateTimeZone('PRC'));DateTime::format($format) //格式化时间戳,格式化字符串形式同date()函数

/* $_SERVER *///示例URL:http://desktop/dir/demo.php?a=aaa&b=bbbPHP_SELF 当前执行脚本的文件名 // /dir/demo.phpGATEWAY_INTERFACE 服务器使用的CGI规范的版本 // CGI/1.1SERVER_ADDR 当前运行脚本所在的服务器的IP地址 // 127.0.0.1SERVER_NAME 当前运行脚本所在的服务器的主机名 // desktopSERVER_SOFTWARE 服务器标识字符串 // Apache/2.2.22 (Win32) PHP/5.3.13SERVER_PROTOCOL 请求页面时通信协议的名称和版本 // HTTP/1.1REQUEST_METHOD 访问页面使用的请求方式 // GETREQUEST_TIME 请求开始时的时间戳 // 1386032633QUERY_STRING 查询字符串(参数) // a=aaa&b=bbbDOCUMENT_ROOT 当前运行脚本所在的文档根目录 // C:/Users/Administrator/DesktopHTTP_ACCEPT 当前请求头中Accept:项的内容 // text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8HTTP_ACCEPT_CHARSET 当前请求头中Accept-Charset:项的内容 // UTF-8,*HTTP_ACCEPT_ENCODING 当前请求头中Accept-Encoding:项的内容 // gzip, deflateHTTP_ACCEPT_LANGUAGE 当前请求头中Accept-Language:项的内容 // zh-cn,zh;q=0.5HTTP_CONNECTION 当前请求头中Connection:项的内容 // keep-aliveHTTP_HOST 当前请求头中Host:项的内容 // desktopHTTP_REFERER 引导用户代理到当前页的前一页的地址HTTP_USER_AGENT 当前请求头中User-Agent:项的内容 // Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1HTTPS 如果脚本是通过HTTPS协议被访问,则被设为一个非空的值REMOTE_ADDR 浏览当前页面的用户的IP地址 // 127.0.0.1REMOTE_HOST 浏览当前页面的用户的主机名REMOTE_PORT 用户机器上连接到Web服务器所使用的端口号 // 49197REMOTE_USER 经验证的用户REDIRECT_REMOTE_USER 验证的用户,如果请求已在内部重定向SCRIPT_FILENAME 当前执行脚本的绝对路径 // C:/Users/Administrator/Desktop/dir/demo.phpSERVER_ADMIN 该值指明了Apache服务器配置文件中的SERVER_ADMIN参数 //admin@shocker.comSERVER_PORT Web服务器使用的端口 // 80SERVER_SIGNATURE 包含了服务器版本和虚拟主机名的字符串PATH_TRANSLATED 当前脚本所在文件系统(非文档根目录)的基本路径SCRIPT_NAME 当前脚本的路径 // /dir/demo.phpREQUEST_URI URI用来指定要访问的页面 // /dir/demo.php?a=aaa&b=bbbPHP_AUTH_DIGEST 客户端发送的“Authorization” HTTP头内容PHP_AUTH_PW 用户输入的密码AUTH_TYPE 认证的类型PATH_INFO 包含由客户端提供的、跟在真实脚本名称之后并且在查询语句(query string)之前的路径信息ORIG_PATH_INFO 在被PHP处理之前,“PATH_INFO”的原始版本



/* 缓存 */1. ob缓存(输出缓存)(需开启)    php.ini设置中开启并设置输出缓存大小:output_buffering = 4096    ob_start()  开启当前脚本页面的输出缓存    如果输出缓存打开,则输出的数据先放到输出缓存(header函数前可以有输出),否则直接放入程序缓存。    header()函数发送的内容直接放入程序缓存。    开启输出缓存后,输出缓存数据会刷新到程序缓存,然后有Apache封装成http响应包返回给浏览器。    输出缓存:存放的数据是从开启输出缓存开始返回给浏览器的所有静态页面数据!2. 程序缓存(内部缓存,必须存在,不能关闭)3. 浏览器缓存
/* ob缓存(输出控制) */ Output Bufferingob_start()  //打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存在输出缓冲区里面。    ob_start('ob_gzhandler'); //将gz编码的数据发送到支持压缩页面的浏览器
ob_clean();            //删除内部缓冲区的内容,不关闭缓冲区(不输出)。ob_end_clean();        //删除内部缓冲区的内容,关闭缓冲区(不输出)。ob_get_clean();        //返回内部缓冲区的内容,关闭缓冲区。相当于执行ob_get_contents()与ob_end_clean()ob_flush();            //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,不关闭缓冲区。ob_end_flush();        //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,关闭缓冲区。ob_get_flush();        //返回内部缓冲区的内容,并关闭缓冲区,再释放缓冲区的内容。相当于ob_end_flush()并返回缓冲区内容。flush();               //将当前为止程序的所有输出发送到用户的浏览器
ob_get_contents();     //返回缓冲区的内容,不输出。ob_get_length();       //返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。ob_get_level();        //Return the nesting level of the output buffering mechanism.ob_get_status();       //获取ob状态信息
ob_implicit_flush();   //打开或关闭绝对刷新,默认为关闭,打开后ob_implicit_flush(true),所谓绝对刷新,即当有输出语句(e.g: echo)被执行时,便把输出直接发送到浏览器,而不再需要调用flush()或等到脚本结束时才输出。
ob_gzhandler               //ob_start回调函数,用gzip压缩缓冲区的内容。ob_list_handlers           //List all output handlers in useoutput_add_rewrite_var     //Add URL rewriter valuesoutput_reset_rewrite_vars  //Reset URL rewriter values
这些函数的行为受php_ini设置的影响:output_buffering       //该值为ON时,将在所有脚本中使用输出控制;若该值为一个数字,则代表缓冲区的最大字节限制,当缓存内容达到该上限时将会自动向浏览器输出当前的缓冲区里的内容。output_handler         //该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。implicit_flush         //作用同ob_implicit_flush,默认为Off。
//ob缓存作用1)防止在浏览器有输出之后再使用setcookie()、header()或session_start()等发送头文件的函数造成的错误。其实这样的用法少用为好,养成良好的代码习惯。2)捕捉对一些不可获取的函数的输出,比如phpinfo()会输出一大堆的HTML,但是我们无法用一个变量例如$info=phpinfo();来捕捉,这时候ob就管用了。3)对输出的内容进行处理,例如进行gzip压缩,例如进行简繁转换,例如进行一些字符串替换。4)生成静态文件,其实就是捕捉整页的输出,然后存成文件。经常在生成HTML,或者整页缓存中使用。

/* 网站并发 */测试工具:apache/bin/ab.exe用法:cmd{%apache-bin%}>ab.exe -n 执行访问次数 -c 用户并发数量 URL地址MPM(多路处理模块):perfork(预处理模式), worker(工作者模式), winnt(Win系统)MPM配置:httpd-mpm.conf查看当前MPM模式:httpd –l    mpm_xxx.c中xxx表示当前模式类型httpd.conf配置(开启MPM):#Include conf/extra/httpd-mpm.conf#参考配置#配置文件:extra/httpd-mpm.conf#mpm_winnt.c<IfModule mpm_winnt_module>    ThreadsPerChild      1000   #中型网站1500-5500合理    MaxRequestsPerChild  0</IfModule>#mpm_prefork.c<IfModule mpm_prefork_module>    StartServers    5       #预先启动    MinSpareServers 5    MaxSpareServers 10      #最大空闲进程    ServerLimit     1500    #用于修改apache编程参数    MaxClients      1000    #最大并发数    MaxRequestsPerChild 0   #一个进程对应的线程数,对worker更用</IfModule>#如果你的网站pv值上百万ServerLimit     2500   #用于修改apache编程参数MaxClients      2000   #最大并发数

/* 静态化 */1. 页面URL长度不超过255字节2. meta信息尽量完整,keywords5个左右3. 前端不要使用框架4. 图片alt属性添加信息5. 静态页面不要带动态值
<script type="text/javascript" language="javascript" src="url"></script>url可以是js/php/图片等,返回的数据替换<script>标签所在位置的内容!相当于简单的Ajax

/* Apache压缩 */gzip/deflate

/* XSS攻击 */#恶意JS代码#不规则HTML代码
开源过滤器:htmlpurifier
//获取COOKIE<script>var c = document.cookie; //获取COOKIEvar script = document.createElement('script'); //创建script标签script.src = 'demo.php?c=' + c; //发送到指定的文件接收document.body.appendChild(script); //添加到DOM对象中生效</script>

/* 命令行CLI *///显示帮助信息php -h//解析并运行-f选项给定的文件名php [-f] <file> [--] [args...]//在命令行内运行单行PHP代码php [options] -r <code> [--] [args...]无需加上PHP的起始和结束标识符,否则将会导致语法解析错误//调用phpinfo()函数并显示出结果php -i/--info//检查PHP语法php -l/--syntax-check//打印出内置以及已加载的PHP及Zend模块php -m/--modules//将PHP,PHP SAPI和Zend的版本信息写入标准输出php -v/--version
//参数接收$argv    传递给脚本的参数数组    第一个参数总是当前脚本的文件名,因此$argv[0]就是脚本文件名$argc    传递给脚本的参数数目    脚本的文件名总是作为参数传递给当前脚本,因此$argc的最小值为1包含当运行于命令行下时传递给当前脚本的参数的数组此两个变量仅在register_argc_argv打开时可用

/* 设计模式 */单例模式:为一个类生成一个唯一的对象。使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。工厂模式:封装对象的建立过程。可以在对象本身创建对象工厂或者是一个额外的工厂类MVC模式:用户->控制器->模型->控制器->视图->控制器->用户

/* 配置选项 */set_time_limit($seconds) //设置脚本最大执行时间(默认30秒),0表示不限制ini_get($varname) //获取一个配置选项的值ini_set($varname, $newvalue) //为一个配置选项设置值extension_loaded($ext_name) //检测一个扩展是否已经加载get_extension_funcs($ext_name) //返回模块函数名的数组

/* 【其他】 */version_compare(str $ver1, str $ver2 [,str $operator])  //比较版本号    $operator表示操作符,可选:<, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne    如果省略$operator,返回两个版本号的差值。符号@    用于抑制系统运行错误的报告显示memory_get_usage    //获取当期内存使用情况memory_get_peak_usage   //获取内存使用的峰值getrusage   //获取CPU使用情况(Windows不可用)uniqid([$prefix])   //获取一个带前缀、基于当前时间微秒数的唯一IDhighlight_string($str [,$return])   //字符串的语法高亮    $return:设置为TRUE,高亮后的代码不会被打印输出,而是以字符串的形式返回。高亮成功返回TRUE,否则返回FALSE。highlight_file($file [,$return])    //语法高亮一个文件__halt_compiler     //中断编译器的执行get_browser     //获取浏览器具有的功能    get_browser ([ string $user_agent [, bool $return_array = false ]] )    如果设置为 TRUE,该函数会返回一个 array,而不是 objecteval($code) //把字符串作为PHP代码执行gzcompress($str [,$level=-1])   //压缩字符串gzuncompress($str)  //解压缩字符串gzencode($str [,$level=-1])   //压缩字符串gzdecode($str)  //解压缩字符串ignore_user_abort($bool) //设置客户端断开连接时是否中断脚本的执行

posted @ 2017-01-09 09:25  歲夢灬沉浮  阅读(831)  评论(0编辑  收藏  举报