1. 怎么理解php里面的序列化与反序列化?

序列化是将对象转换为字节流。反序列化就是将流转换为对象。

这两个过程结合起来,可以轻松地存储和传输数据,在网络中可以做到跨平台、快速传输。

两种序列化方式serialize和json

1)serialize和json序列化结果的区别

分别用serialize/unserialize函数与json_encode/json_decode函数对对象数组进行序列化和反序列化:

// 对象
$web = new stdClass;
$web->site = 'tantengvip';
$web->owner = 'tuntun';
$web->age = 5;
var_dump(serialize($web));
var_dump(unserialize(serialize($web)));
var_dump(json_encode($web));
var_dump(json_decode(json_encode($web)));
// 结果
string(87) "O:8:"stdClass":3:{s:4:"site";s:10:"tantengvip";s:5:"owner";s:6:"tuntun";s:3:"age";i:5;}"
object(stdClass)#2 (3) {
["site"]=>string(10) "tantengvip"
["owner"]=>string(6) "tuntun"
["age"]=>int(5)
}
string(46) "{"site":"tantengvip","owner":"tuntun","age":5}"
object(stdClass)#2 (3) {
["site"]=>string(10) "tantengvip"
["owner"]=>string(6) "tuntun"
["age"]=>int(5)
} // 数组:
$web = array();
$web['site'] = 'tantengvip';
$web['owner'] = 'tuntun';
$web['age'] = 5;
var_dump(serialize($web));
var_dump(unserialize(serialize($web)));
var_dump(json_encode($web));
var_dump(json_decode(json_encode($web), true));
// 结果
string(74) "a:3:{s:4:"site";s:10:"tantengvip";s:5:"owner";s:6:"tuntun";s:3:"age";i:5;}"
array(3) {
["site"]=>string(10) "tantengvip"
["owner"]=>string(6) "tuntun"
["age"]=>int(5)
}
string(46) "{"site":"tantengvip","owner":"tuntun","age":5}"
array(3) {
["site"]=>string(10) "tantengvip"
["owner"]=>string(6) "tuntun"
["age"]=>int(5)
}

不管是对象还是数组,用serialize和json进行序列化,反序列化回来的结果都相同,区别在于序列化的格式。

2)serialize和json序列化的对比

序列化 serialize json
可读性 编码后的文本不可读,无法被其他语言的系统引用。 变量序列化后可读性强,可以给其他系统使用。
编码格式 允许非UTF-8的变量。 只对UFT-8的数据有效。
处理对象 支持除了stdClass外的其他实例。 只对stdClass类的示例有效。
速度 较小数据的情况下,serialize比json快数量级。 大量数据的情况下,json比serialize稍差。
使用范围 对象的存储使用serialize。 与对象无关的数据存储可以使用json,如包含大量数字的数组等。

3)serialize和json序列化对对象内成员变量和方法的处理

class Test {
private $pri = 'pri';
public $class = 'Test';
public function __construct() {
$this->class = 'Test construct';
$this->pri = 'pri construct';
}
public function hello() {
echo 'hello!';
}
}
$test = new Test();
var_dump(serialize($test));
var_dump(unserialize(serialize($test)));
var_dump(json_encode($test));
var_dump(json_decode(json_encode($test)));
// 结果
string(86) "O:4:"Test":2:{s:9:"?Test?pri";s:13:"pri construct";s:5:"class";s:14:"Test construct";}"
object(Test)#2 (2) {
["pri":"Test":private]=>string(13) "pri construct"
["class"]=>string(14) "Test construct"
}
string(26) "{"class":"Test construct"}"
object(stdClass)#2 (1) {
["class"]=>string(14) "Test construct"
}

serialize序列化和反序列化只要是类的变量都可以,但是类的成员方法都无法进行序列化和反序列化。

而json序列化和反序列化只能序列化/反序列化类中的公有成员变量,不能序列化/反序列化类中的私有成员变量,其成员方法也无法进行序列化和反序列化。

2. 怎么遍历一个对象,有哪几种方式?

1)使用foreach遍历对象

如果在对象之外用foreach只能输出公有的属性,不能输出私有的和保护的属性。

class object {
public $a = 1;
protected $b = 2;
private $c = 3;
}
$obj = new object();
foreach($obj as $key => $val){
echo $key.'-'.$val;
}
// 结果
a-1

2)迭代器

  • 实现Iterator(迭代器)接口,让对象自行决定如何遍历以及每次遍历时哪些值可用。

一般的迭代器内部需要下面的方法:

Iterator extends Traversable {
// 返回当前元素
abstract public mixed current (void)
// 返回当前元素的索引
abstract public scalar key (void)
// 移动到下一个元素
abstract public void next (void)
// 从头重新开始
abstract public void rewind (void)
// 检查迭代结尾
abstract public boolean valid (void)
}

Example:实现Iterator接口的对象遍历

class MyIterator implements Iterator {
private $var = array(); public function __construct($array) {
if (is_array($array)) {
$this->var = $array;
}
} public function rewind() {
echo "倒回第一个元素\n";
reset($this->var);
} public function current() {
$var = current($this->var);
echo "当前元素: $var\n";
return $var;
} public function key() {
$var = key($this->var);
echo "当前元素的键: $var\n";
return $var;
} public function next() {
$var = next($this->var);
echo "移向下一个元素: $var\n";
return $var;
} public function valid() {
$var = $this->current() !== false;
echo "检查有效性: {$var}\n";
return $var;
}
} $values = array(1,2,3);
$it = new MyIterator($values); foreach ($it as $k => $v) {
print "此时键值对 -- key $k: value $v\n\n";
}
// 结果为:
倒回第一个元素
当前元素: 1
检查有效性: 1
当前元素: 1
当前元素的键: 0
此时键值对 -- key 0: value 1 移向下一个元素: 2
当前元素: 2
检查有效性: 1
当前元素: 2
当前元素的键: 1
此时键值对 -- key 1: value 2 移向下一个元素: 3
当前元素: 3
检查有效性: 1
当前元素: 3
当前元素的键: 2
此时键值对 -- key 2: value 3 移向下一个元素:
当前元素:
检查有效性:
  • 不实现接口Iterator,实现他的子接口IteratorAggregate。

使用Iterator的执行过程如下:

1、将对象中数组的元素置为第一个。

2、输出当前元素的值。

3、检查有效性。

4、输出当前元素的值。

5、输出当前元素的键。

6、移向下一个元素,重复2、3、4、5步骤。

7、如果某索引下没有值,就此中断。

缺点是需要实现5个函数,可以用IteratorAggregate接口替代Iterator,因为IteratorAggregate只需要实现一个方法IteratorAggregate::getIterator()就能完成对象的遍历。

Example:通过实现IteratorAggregate来遍历对象

class myData implements IteratorAggregate {
public $property1 = "Public property one";
public $property2 = "Public property two";
public $property3 = "Public property three"; public function __construct() {
$this->property4 = "last property";
} public function getIterator() {
// ArrayIteratoer从PHP数组创建一个迭代器,当其和IteratorAggregate类一起使用时,免去了直接实现Iterator接口的方法的工作。
return new ArrayIterator($this);
}
} $obj = new myData;
foreach($obj as $key => $value) {
var_dump($key, $value);
echo "\n";
}
// 结果为:
string(9) "property1"
string(19) "Public property one" string(9) "property2"
string(19) "Public property two" string(9) "property3"
string(21) "Public property three" string(9) "property4"
string(13) "last property"

3. 反射是什么意思,一般应用在什么场景?

反射指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。简而言之,就是通过对象实例反向分析,从而获取其信息。

用途:

1)获取类的信息,生成描述文档

2)对对象进行调试

使用场景:

MVC里,依赖注入、控制反转,用的就是反射的特性

4. 讲讲你对php的异常和错误的理解。

异常是指程序运行中不符合预期情况以及与正常流程不同的状况。错误则属于自身问题,是一种非法语法或者环境问题导致的、让编译器无法通过检查设置无法运行的情况。

PHP一旦遇到非正常代码,通常都是触发错误,而不是抛出异常。换言之,PHP无法自动捕获有意义的异常,只有主动throw后,才能捕获异常。

捕获这个异常需要使用if……else结构,保证代码是正常的,然后作出逻辑判断,遇到错误,就手动抛出异常,再捕获,即try……catch。

PHP的序列化、对象、反射、异常与错误的更多相关文章

  1. 使用DataContractJsonSerializer发序列化对象时出现的异常

    最近服务器上的某个程序的错误日志中频繁出现以下异常: Deserialising: There was an error deserializing the object of type {type} ...

  2. JAVA-JSP内置对象之exception对象用来处理错误异常

    相关资料:<21天学通Java Web开发> exception对象1.exception对象用来处理错误异常.2.如果要使用exception对象,必须指定page中的isErrorPa ...

  3. 3.Sprint 代理对象与原始对象的异常错误

    代码案例分析 Service层添加了注解@Transactional @Service @Transactional public class CustomerService extends Base ...

  4. Android使用HttpURLConnection通过POST方式发送java序列化对象

    使用HttpURLConnection类不仅可以向WebService发送字符串,还可以发送序列化的java对象,实现Android手机和服务器之间的数据交互. Android端代码: public ...

  5. C# 调用Webservice并传递序列化对象

    原文:C# 调用Webservice并传递序列化对象 C#动态调用WebService注意要点 1.动态调用的url后面注意一定要加上?WSDL   例如:string _url = "ht ...

  6. Java 序列化 对象序列化和反序列化

    Java 序列化 对象序列化和反序列化 @author ixenos 对象序列化是什么 1.对象序列化就是把一个对象的状态转化成一个字节流. 我们可以把这样的字节流存储为一个文件,作为对这个对象的复制 ...

  7. Error serializing object:序列化对象时出错

    序列化对象时出错 :Error serializing object. Error serializing object. Cause: java.io.NotSerializableExceptio ...

  8. 《java中异常和错误》

    异常和错误的区别. 异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发 ...

  9. JavaScript学习(2):对象、集合以及错误处理

    在这篇文章里,我们讨论一下JavaScript中的对象.数组以及错误处理. 1. 对象 对象是JavaScript中的一种基本类型,它内部包含一些属性,我们可以对这些属性进行增删操作. 1.1 属性 ...

随机推荐

  1. 用jdk1.6的pack200和unpack200,对jar文件进行压缩和解压 .pack.gz

    用jdk1.6的pack200和unpack200,对jar文件进行压缩和解压 解压xxx.jar.pack.gz为xxx.jar:unpack200 -r xxx.jar.pack.gz xxx.j ...

  2. 用SAS提交SAS代码

    OPTIONS NOXWAIT;%LET PATH=%STR(C:\Program Files\SAS\SAS 9.1);%LET CODEPATH=%STR(D:\001.RIPP.MODEL);% ...

  3. 关于 ElementUI 通知组件 notification 重叠问题的解决方案

    转载链接:https://blog.csdn.net/csdn_yudong/article/details/101271214 ElementUI 通知组件(notification) 多个时会重叠 ...

  4. Linux命令-nohup和&

    基础 在linux终端或控制台上执行命令时,可能不希望脚本占住屏幕需要在后台执行脚本,有几种方法让脚本在后台执行: & 当在前台运行某个作业时,终端被该作业占据:可以在命令后面加上& ...

  5. python初级(302) 7 列表(二)冒泡排序

    一.复习: 1.如何创建一个空列表,如何创建一个有数据的列表 2.列表可以包含的内容 3.从列表中获取元素和修改元素的方法 4.列表的分片 5.增加元素和删除元素 6.选择排序的算法: 一堆数据,每次 ...

  6. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器软件正式环境安装部署攻略

    背景介绍 EasyDSS流媒体服务器软件,提供一站式的转码.点播.直播.时移回放服务,极大地简化了开发和集成的工作.其中,点播功能主要包含:上传.转码.分发.直播功能,主要包含:直播.录像, 直播支持 ...

  7. Ubuntu tricks

    linux 复制文件夹内所有文件到另一个文件夹 cp -Rf /home/user1/* /root/temp/ 将 /home/user1目录下的所有东西拷到/root/temp/下而不拷贝user ...

  8. 让typecho支持PHP7

    在PHP7环境下新安装Typecho默认是使用Pdo_Mysql数据库引擎驱动 如果之前Typecho运行环境不是PHP7,后来才升级为PHP7的,那么,需要将你的Typecho数据库引擎修改为Pdo ...

  9. windows mysql手动添加my.ini 服务启动不了

    [mysqld] character-set-server=utf8 #绑定IPv4和3306端口 bind-address=0.0.0.0 port= default_storage_engine= ...

  10. 使用ReadtheDocs托管技术文档

    ReadtheDocs Read the Docs非常适合写软件文档以及编写一些教程.电子书之类.对于一些一两篇文章就能写清楚的可以记笔记或写博客, 但是如果要写成一个系列的,不如写成一本书的形式,更 ...