php经典实例-笔记2

来源:互联网 发布:怎么在淘宝刷好评赚钱 编辑:程序博客网 时间:2024/05/22 00:55

1、串行化

方法:serialize()、unserialize()

这有利于存储或传递 PHP 的值,同时不丢失其类型和结构。当序列化对象时,PHP 将试图在序列动作之前调用该对象的成员函数 __sleep()。这样就允许对象在被序列化之前做任何清除操作。类似的,当使用 unserialize() 恢复对象时, 将调用__wakeup() 成员函数。这样就使得对象能够重新建立起序列化时未能保留的各种状态。

当把序列化的数据放在url中在页面之间传递时,需要对这些数据调用urlecode(),以确保对其中的url元字符进行处理。

 

串行化接口或序列化接口:serializable

实现此接口的类将不再支持__sleep()和__wakeup()。不论何时,只要有实例需要被序列化,serialize方法都将被调用,它将不会调用 __destruct() 或有其他方法,除非程序化地调用此方法。当数据被反序列化时,类将被感知并且调用合适的 unserialize() 方法而不是调用 __construct()。如果需要执行标准的构造器,你应该在这个方法中进行处理。

自定义的序列化接口需要实现序列化接口的serialize()和unserialize()方法。

class obj implements Serializable {      private $data;      public function __construct() {          $this->data = "My private data";      }      public function serialize() {          return serialize($this->data);      }      public function unserialize($data) {          $this->data = unserialize($data);      }      public function getData() {          return $this->data;      }  }  $obj = new obj;  $ser = serialize($obj);  print $ser."<br>";   //C:3:"obj":23:{s:15:"My private data";}  $newobj = unserialize($ser);  var_dump($newobj->getData());  //My private data


2、魔术方法

__construct()__destruct()__call()__callStatic()__get()__set()__isset()__unset()__sleep()__wakeup()__toString()__invoke()__set_state() __clone() 。

这些方法被称为"魔术方法。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。

(1)__sleep()和__wakeup()

__sleep()常用于提交未提交的数据,或者类似的清理操作。serialize()函数会首先检查类中是否存在__sleep(),存在的话,就先调用这个方法。它的功能就是清理对象,并返回一个包含对象中所有应该被序列化的变量名称的数组。如果此方法未返回任何内容,则null被序列化。

__wakeup()是预先准备需要的资源,例如重新建立数据库连接,或者其他的初始化操作。早unserialize()时会检测是否存在__wakeup(),有则先调用它。

class Connection {    protected $link;    private $server, $username, $password, $db;        public function __construct($server, $username, $password, $db)    {        $this->server = $server;        $this->username = $username;        $this->password = $password;        $this->db = $db;        $this->connect();    }        private function connect()    {        $this->link = mysql_connect($this->server, $this->username, $this->password);        mysql_select_db($this->db, $this->link);    }        public function __sleep()    {        return array('server', 'username', 'password', 'db');    }        public function __wakeup()    {        $this->connect();    }}

(2)__toString()

用于一个类被当成字符串时应该怎样回应。 此方法必须返回一个字符串,否则或报E_RECOVERABLE_ERROR 级别的致命错误。

3、print_r() 和var_dump()

可以捕获它们的输出结果。

print_r():将第二个参数设置我true,则不打印结果,而是返回输出。

var_dump():不支持这种操作,需要使用到输出控制函数

$a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x','y','z'));  ob_start();  var_dump($a);  $temp = ob_get_contents();  ob_end_clean();  print $temp;

 

print_r()也可以这么操作,但没必要。

4、输出控制函数

(1)ob_start():打开输出控制缓冲。当输出缓冲是活跃的时候,没有输出能从脚本送出(除http标头外),而是被存储在内部缓冲区中。输出缓冲区是可堆叠的,这即意谓着,当有一个 ob_start() 是活跃的时, 你可以调用另一个 ob_start() 。但是必须注意缓存区的顺序关闭和数据的顺序读取。

(2)ob_clean():清空(擦掉)输出缓冲区。只是清除掉缓存区的内容,并没有销毁缓存区。

(3)ob_end_clean():清空(擦除)缓冲区并关闭输出缓冲。清除缓存区内容,并销毁缓存区。

(4)ob_get_contents():返回输出缓冲区的内容,但是不会清除内容。

(5)ob_get_clean():得到当前缓冲区的内容并删除当前输出缓冲区。

(6)ob_flush():冲刷出(送出)输出缓冲区中的内容。此函数不会销毁输出缓冲区。

(7)ob_end_flush():冲刷出(送出)输出缓冲区内容并关闭缓冲。此函数同时会销毁输出缓冲区。

(8)ob_get_flush():刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。

(9)ob_get_length():返回输出缓冲区内容的长度。