admin
管理员
管理员
  • UID1
  • 粉丝2
  • 关注2
  • 发帖数339
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:6209回复:0

两千行PHP学习笔记

楼主#
更多 发布于:2015-03-23 17:39
分享到:
[code brush:php;toolbar:false;]//语法错误(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位平台时值为2147483647
PHP_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 "";
    $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('-_-');
 
 
/* 常量相关函数 */
defined
get_defined_constants
 
 
/* 预定义常量 */
__FILE__            所在文件的绝对路径
__LINE__            文件中的当前行号
__DIR__            文件所在目录
__FUNCTION__        函数名称
__CLASS__            类的名称
__METHOD__        类的方法名
__NAMESPACE__        当前命名空间的名称
 
 
/* 整型 */
整型占用4字节,共4*8=32位,最大值为2147483647,最小值为-2147483648,最小值的绝对值比最大值的大1
最高为表示正负,1表示负,0表示正
 
 
/* 进制转换函数 */
只能十进制与其他进制进行转换,只有六种
转换时,参数应是字符串(即不可含八进制的“0”或十六进制的“0x”)
    dec
     bin
     oct
    hex
hexdec()    十六进制转十进制        也可写hex2dec()
dechex()    十进制转十六进制        也可写dec2hex()
bindec()    二进制转十进制        也可写bin2dec()
decbin()    十进制转二进制        也可写dex2bin()
octdec()    八进制转十进制        也可写oct2dec()
decoct()    十进制转八进制        也可写dec2oct()
 
 
/* 浮点数 */
浮点数不能比较大小 !!!
几乎所有小数,在保存时都是近似值而不是精确值!
最大值:+/- 1.8E308
PHP所能保存的最长小数位: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];   // d
echo $str{0};   // a
 
 
/* 【类型操作函数】 */
//获取/设置类型
gettype($var) //获取变量的数据类型
settype($var, $type) //设置变量的数据类型
 
//类型判断
is_int
is_float
is_null
is_string
is_resource
is_array
is_bool
is_object      
is_numeric      检测变量是否为数字或数字字符串
 
//转换成指定的数据类型
boolval
floatval
intval
strval
 
//强制转换类型
(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; 等
endif
endwhile
endfor
endforeach
endswitch
 
 
/* 【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    $_SESSION
c. $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 "" . $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 "".$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...each
while (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) 如果对象属于该类或该类是此对象的父类则返回TRUE
is_subclass_of($obj, $class)    如果此对象是该类的子类,则返回TRUE
get_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');
 
 
/* 页面跳转 */
// PHP
header('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_加SessionID
5. session可以存储除了资源以外的任何类型数据。
    数据被序列化后再保存到文件中。
6. $_SESSION的元素下标不能为整型!
    因为只对元素值进行序列化。
    元素内的数组下标无此要求。
7. 生存周期
    默认是浏览器关闭
        因为浏览器保存的cookie变量SessionID是临时的
        但是服务器端的session数据文件不一定消失(需要等待session的垃圾回收机制来处理)
    可以延长cookie中PHPSESSID变量的生命周期。(不推荐)
    php.ini配置session.gc_maxlifetime
8. 删除数据
    $_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            获取或设置当前会话ID
session_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.ini
ini_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     为一幅图像分配颜色 + alpha
imagecolordeallocate        取消图像颜色的分配
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      画一椭圆并填充
imagefil
游客

返回顶部