Object.extend(Object,{
        toPHP: function(object) {
                var type = typeof object;
                switch (type) {
                        case 'undefined':
                        case 'function':
                        case 'unknown': return 'N;';
                        case 'boolean': return 'b:'+(object?'1':'0')+';';
                }
                if (object === null) return 'N;';
                if (object.toPHP) return object.toPHP();
                if (Object.isElement(object)) return null;
                var ret = [];
                for (var property in object) {
                        var value = Object.toPHP(object[property]);
                        if (value !== undefined)
                                ret.push(property.toString().toPHP() + value);
                }
                return 'a:'+ret.length+':{'+ ret.join('')+'}';
        }
});
Date.prototype.toPHP = function() {
  return 'i:'+this.getTime()+';';
};
Object.extend(String.prototype,{
        toPHP: function () {
                var s=this.escapeUTF();
                return 's:'+s.length+':"'+s+'";';
        },
        escapeUTF: function  () {
                var charCode,ret = '';
                for (i=0; i<this.length; i++) {
                        charCode = this.charCodeAt(i);
                        ret+=((charCode <= 127) && (charCode >=32))?
                                this.charAt(i):
                                ('&#x' + charCode.toString(16).toUpperCase() + ';');
                }
                return ret;
        }
});
Array.prototype.toPHP = function () {
        var ret=[];
        this.each(function (v,i) {
                ret.push(i.toPHP()+(!!v.toPHP?v.toPHP():Object.toPHP(v)));
        });
        return 'a:'+ret.length+':{'+ret.join('')+'}';
}
Number.prototype.toPHP = function () {
        return (parseInt(this)==parseFloat(this)?'i':'d')+':'+this.toString()+';';
}