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() 。
这些方法被称为"魔术方法。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。
__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():返回输出缓冲区内容的长度。