phpserializer.js 更新

Opera Mobile 这个 phpserializer.js 开始来自 www.devpro.it,后来我将其引入了 PHPRPC 中,今天安装了 Windows Mobile 5 模拟器,并在上面安装了 Opera Mobile 版,打开 CoolCode.CN 后发现所有用了 PHPRPC 的插件都不好用了。因为 Windows Mobile 5 上没有 JavaScript 调试器,而且 Opera Mobile 本身也不报错,所以很难调试,后来通过从本机用 Ethereal 抓包分析的方法,断定是 phpserializer.js 中序列化部分有问题。之后单独对它进行编程调试,发现原因出自 constructor 属性上,该属性对于内置对象来说,在 Opera Mobile 上的值与 PC 上是不同的。 该文件在 PHPRPC 中和使用 PHPRPC 的插件中都包含,使用它的 WordPress 插件有:Alexa RankCoolPlayerCoolWeatherGooglePRPagePost 2。它们现在都已经进行了更新,使用了这些插件的用户可以重新下载更新,之后就可以在 Opera Mobile 上完美的运行这些插件了。 右图为在 Opera Mobile for Windows Mobile 5 Pocket PC 的截图。 下面是修改之后的代码,除了修改为可以兼容 Opera Mobile 以外,还对序列化代码进行了优化: /** * Object PHP_Serializer * JavaScript to PHP serialize / unserialize class. * This class is designed to convert php variables to javascript * and javascript variables to php with a php serialize unserialize * compatible way. * * PARSABLE PHP TO JAVASCRIPT VARIABLES: * [ PHP TYPE ] [ JAVASCRIPT TYPE ] * array Array * class Object (*) * string String * boolean Boolean * undefined or null null * integer / double Number * * PARSABLE JAVASCRIPT TO PHP VARIABLES: * [ JAVASCRIPT TYPE ] [ PHP TYPE ] * Array array * Object class (*) * String string * Boolean boolean * null null * Number int or double * Date class * Error class * Function anything (*) * __class anything (*) * * (*) NOTE: * Any PHP serialized class requires the native PHP class to be used, then it's not a * PHP => JavaScript converter, it's just a usefull serilizer class for each * compatible JS and PHP variable types. * However is possible to change public parameters. * Lambda, Resources or other dedicated PHP variables are not usefull for JavaScript. * (i.e. * $v = create_function('', 'return 1;'); serialize($v); * $conn = mydb_connect(); serialize($conn); * ) * There are same restrictions for javascript functions too then these will not be sent * (but will be filtered / ignored automatically). * _____________________________________________ * * EXAMPLE: * var php = new PHP_Serializer(); * alert(php.unserialize(php.serialize(somevar))); * // should alert the original value of somevar * --------------------------------------------- * @author Andrea Giammarchi * @site www.devpro.it * @date 2005/11/26 * @lastmod 2006/04/06 22:15 * [faster serialize for IE browser] by andot * [fix error in Opera Mobile] by andot * [add utf16to8 and utf8to16 to string serialize and unserialize] by andot * @credits Special thanks to Fabio Sutto for some ideas and some debug * Special thanks to kentaromiura for a faster loop idea while unserialize * @version 1.6d, tested on FireFox 1.0.7, FireFox 1.5, IE 6 SP2, Opera 8, Opera 9, Opera Mobile */ function PHP_Serializer() { this.__cut = (String(Object).indexOf('(')!=16)?9:10; } function PHP_Serializer__String(__s) { __s = utf16to8(__s); return ['s:',__s.length,':"',__s,'";'].join(''); } function PHP_UnSerializer__String() { this.__c += 2; var sls = this.__s.substr(this.__c,(this.__s.indexOf(':',this.__c)-this.__c)); var sli = parseInt(sls); sls = this.__c + sls.length + 2; this.__c = sls + sli + 2; return utf8to16(this.__s.substr(sls,sli)); } function PHP_Serializer__Boolean(__s) { return (['b:',(__s==false?'0':'1'),';'].join('')); } function PHP_UnSerializer__Boolean() { var tmp = (this.__s.substr((this.__c+2),1)=='1'?true:false); this.__c += 4; return tmp; } function PHP_Serializer__Number(__s) { __s = String(__s); return [((__s.indexOf('.')==-1)?'i:':'d:'),__s,';'].join(''); } function PHP_UnSerializer__Number() { var sli = this.__s.indexOf(';',(this.__c+1))-2; var tmp = Number(this.__s.substr((this.__c+2),(sli-this.__c))); this.__c = sli + 3; return tmp; } function PHP_Serializer__Function() { return ''; } function PHP_Serializer__Undefined() { return 'N;'; } function PHP_UnSerializer__Undefined() { this.__c += 2; return null; } function PHP_Serializer__Common_ArrayObject(__s) { var n; var a = 0; var ser = new Array(); for(var b in __s) { n = (__s[b] == null); if(n || (__s[b].constructor != Function && b != '__class')) { ser[a++]=((!isNaN(b))?this.__number(b):this.__string(b))+ (n?this.__undefined():this.serialize(__s[b])); } } return [a,ser.join('')]; } function PHP_UnSerializer__Common_ArrayObject(tmp) { this.__c += 2; var a = this.__s.indexOf(':',this.__c); var k = parseInt(this.__s.substr(this.__c,(a-this.__c))) + 1; this.__c = a + 2; while(--k) tmp[this[this.__s.substr(this.__c,1)]()] = this[this.__s.substr(this.__c,1)](); return tmp; } function PHP_Serializer__Date(__s) { var ser = this.__common_array_object(__s); return ['O:4:"Date":',ser[0],':{',ser[1],'}'].join(''); } function PHP_Serializer__Error(__s) { var ser = this.__common_array_object(__s); return ['O:5:"Error":'+ser[0]+':{'+ser[1]+'}'].join(''); } function PHP_Serializer__Object(__s) { var o = String(__s.constructor); var oname = o.substr(this.__cut,o.indexOf('(')-this.__cut); var ser = this.__common_array_object(__s); return ['O:',oname.length,':"',oname,'":',ser[0],':{',ser[1],'}'].join(''); } function PHP_UnSerializer__Object() { var tmp = 's'+this.__s.substr(++this.__c,(this.__s.indexOf(':',(this.__c+3))-this.__c))+';'; var a = tmp.substr(2,(tmp.indexOf(':',2)-2)); var o = tmp.substr((a.length+4),parseInt(a)); if(eval("typeof("+o+") == 'undefined'")) eval('function '+o+'(){}'); this.__c += (tmp.length-3); eval('tmp = this.__common(new '+o+'());'); ++this.__c; return tmp; } function PHP_Serializer__Array(__s) { var ser = this.__common_array_object(__s); return ['a:',ser[0],':{',ser[1],'}'].join(''); } function PHP_UnSerializer__Array() { var tmp = this.__common(new Array()); ++this.__c; return tmp; } function PHP_Serializer__serialize(what) { if(what==null) var ser = this.__undefined(); else switch (what.constructor) { case Array: var ser = this.Array(what); break; case Boolean: var ser = this.Boolean(what); break; case Number: var ser = this.Number(what); break; case String: var ser = this.String(what); break; case Function: var ser = this.Function(what); break; case Date: var ser = this.Date(what); break; case Error: var ser = this.Error(what); break; default: var ser = this.Object(what); } return ser; } function PHP_UnSerializer__unserialize(what) { this.__c = 0; this.__s = what; delete what; return this[this.__s.substr(this.__c,1)](); } PHP_Serializer.prototype.Array = PHP_Serializer__Array; PHP_Serializer.prototype.Boolean = PHP_Serializer__Boolean; PHP_Serializer.prototype.Number = PHP_Serializer.prototype.__number = PHP_Serializer__Number; PHP_Serializer.prototype.String = PHP_Serializer.prototype.__string = PHP_Serializer__String; PHP_Serializer.prototype.Function = PHP_Serializer__Function; PHP_Serializer.prototype.Date = PHP_Serializer__Date; PHP_Serializer.prototype.Error = PHP_Serializer__Error; PHP_Serializer.prototype.Object = PHP_Serializer__Object; PHP_Serializer.prototype.__common_array_object = PHP_Serializer__Common_ArrayObject; PHP_Serializer.prototype.__undefined = PHP_Serializer__Undefined; PHP_Serializer.prototype.serialize = PHP_Serializer__serialize; PHP_Serializer.prototype.s = PHP_UnSerializer__String; PHP_Serializer.prototype.b = PHP_UnSerializer__Boolean; PHP_Serializer.prototype.i = PHP_Serializer.prototype.d = PHP_UnSerializer__Number; PHP_Serializer.prototype.N = PHP_UnSerializer__Undefined; PHP_Serializer.prototype.__common = PHP_UnSerializer__Common_ArrayObject; PHP_Serializer.prototype.O = PHP_UnSerializer__Object; PHP_Serializer.prototype.a = PHP_UnSerializer__Array; PHP_Serializer.prototype.unserialize = PHP_UnSerializer__unserialize;

标签: PHP, JavaScript, PHPRPC

« 上一篇 | 下一篇 »

只显示10条记录相关文章

发表评论

评论 (必须):