PHP最全笔记(四)(值得收藏,不时翻看一下)

// 序列化(串行化)

# 数据传输均是字符串类型

# 除了资源类型,均可序列化

# 序列化在存放数据时,存放数据本身,也存放数据类型

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的大小有限,而且不同浏览器的限制不同。

posted @ 2016-11-26 00:04  代码描绘人生  阅读(153)  评论(0编辑  收藏  举报