作为程序员一定要保持良好的睡眠,才能好编程

PHP笔记汇总(2)

发布时间:2016-11-23

/* 【数组函数】 */


//如果在导出或导入的情况下,使用下面的代码:

ini_set('max_execution_time', '0');
ini_set("memory_limit","1024M");
//统计计算
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    递归地合并一个或多个数组


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    创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值

    如果两个数组的单元数不同或者数组为空时返回FALSEarray_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 或者 floatcallback    回调函数

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_ASSOCMYSQL_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->方法名()- 类成员,内部通过selfparent指定,外部通过类名指定,均用::访问,访问属性时需加$

    类名::$属性名    类名::方法名()        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])

    $flagsFILE_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 $namemixed $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 $namearray $arguments)

__callStatic    当在调用一个不可访问的静态方法(如未定义,或者不可见)时自动被调用

        public static mixed __callStatic(string $namearray $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是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。

cookieHTTP标头的一部分,因此setcookie()函数必须在其它信息被输出到浏览器前调用,这和对header()函数的限制类似。可以使用输出缓冲函数来延迟脚本的输出,直到按需要设置好了所有的cookie或者其它HTTP标头。

 

// 新增

setcookie    新增一条cookie信息setcookie($name [,$value [,$expire [,$path [,$domain [,$secure [,$httponly]]]]]])#注意:setcookie()函数前不能有输出!除非开启ob缓存!

参数说明$name    - cookie的识别名称

    使用$_COOKIE['name']抵用名为namecookie$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的大小有限,而且不同浏览器的限制不同。

 

// 删除

方法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,默认为当前域名下的所有目录及其子目录生效。即默认设置cookiepath值为'/'

4. 服务器保存session数据

    默认保存方式:每个会话都会生成一个session数据文件,文件名为:sess_SessionID5. session可以存储除了资源以外的任何类型数据。

    数据被序列化后再保存到文件中。6. $_SESSION的元素下标不能为整型

    因为只对元素值进行序列化。

    元素内的数组下标无此要求。7. 生存周期

    默认是浏览器关闭

        因为浏览器保存的cookie变量SessionID是临时的

        但是服务器端的session数据文件不一定消失(需要等待session的垃圾回收机制来处理)

    可以延长cookiePHPSESSID变量的生命周期。(不推荐)

    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' 表示MD5128 位),'1' 表示SHA-1160 位)。

session.hash_bits_per_character    允许用户定义将二进制散列数据转换为可读的格式时每个字符存放多少个比特。

    可能值为 '4'0-9a-f),'5'0-9a-v),以及 '6'0-9a-zA-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_probabilitysession.gc_divisor合起来定义了在每个会话初始化时启动gcgarbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动gc进程。session.gc_divisor默认为100session.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      画一椭圆并填充

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);