您好,欢迎访问一九零五行业门户网

重写YII的CJSON为WJSON输出model支持自定义变量

重写yii的cjson为wjson输出model支持自定义变量
因yii的cjson输出model时只能输出attributes变量,不能输出自定义变量,重新此类使之可以输出自定义变量
<?php /** * @author * 重写yii的cjson为wjson输出model支持自定义变量 * class wjson */ class wjson extends cjson { protected static function namevalue($name, $value) { return self::encode(strval($name)) . ':' . self::encode($value); } public static function encode($var) { switch (gettype($var)) { case 'boolean': return $var ? 'true' : 'false'; case 'null': return 'null'; case 'integer': return (int)$var; case 'double': case 'float': return str_replace(',', '.', (float)$var); // locale-independent representation case 'string': if (($enc = strtoupper(yii::app()->charset)) !== 'utf-8') $var = iconv($enc, 'utf-8', $var); if (function_exists('json_encode')) return json_encode($var); // strings are expected to be in ascii or utf-8 format $ascii = ''; $strlen_var = strlen($var); /* * iterate over every character in the string, * escaping with a slash or encoding to utf-8 where necessary */ for ($c = 0; $c < $strlen_var; ++$c) { $ord_var_c = ord($var{$c}); switch (true) { case $ord_var_c == 0x08: $ascii .= '\b'; break; case $ord_var_c == 0x09: $ascii .= '\t'; break; case $ord_var_c == 0x0a: $ascii .= '\n'; break; case $ord_var_c == 0x0c: $ascii .= '\f'; break; case $ord_var_c == 0x0d: $ascii .= '\r'; break; case $ord_var_c == 0x22: case $ord_var_c == 0x2f: case $ord_var_c == 0x5c: // double quote, slash, slosh $ascii .= '\\' . $var{$c}; break; case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7f)): // characters u-00000000 - u-0000007f (same as ascii) $ascii .= $var{$c}; break; case (($ord_var_c & 0xe0) == 0xc0): // characters u-00000080 - u-000007ff, mask 110xxxxx // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('c*', $ord_var_c, ord($var{$c + 1})); $c += 1; $utf16 = self::utf8toutf16be($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xf0) == 0xe0): // characters u-00000800 - u-0000ffff, mask 1110xxxx // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('c*', $ord_var_c, ord($var{$c + 1}), ord($var{$c + 2})); $c += 2; $utf16 = self::utf8toutf16be($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xf8) == 0xf0): // characters u-00010000 - u-001fffff, mask 11110xxx // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('c*', $ord_var_c, ord($var{$c + 1}), ord($var{$c + 2}), ord($var{$c + 3})); $c += 3; $utf16 = self::utf8toutf16be($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xfc) == 0xf8): // characters u-00200000 - u-03ffffff, mask 111110xx // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('c*', $ord_var_c, ord($var{$c + 1}), ord($var{$c + 2}), ord($var{$c + 3}), ord($var{$c + 4})); $c += 4; $utf16 = self::utf8toutf16be($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xfe) == 0xfc): // characters u-04000000 - u-7fffffff, mask 1111110x // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('c*', $ord_var_c, ord($var{$c + 1}), ord($var{$c + 2}), ord($var{$c + 3}), ord($var{$c + 4}), ord($var{$c + 5})); $c += 5; $utf16 = self::utf8toutf16be($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; } } return '"' . $ascii . '"'; case 'array': // treat as a json object if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { return '{' . join(',', array_map(array('wjson', 'namevalue'), array_keys($var), array_values($var))) . '}'; } // treat it like a regular array return '[' . join(',', array_map(array('wjson', 'encode'), $var)) . ']'; case 'object': if ($var instanceof traversable) { $vars = array(); foreach ($var as $k => $v) $vars[$k] = $v; } else $vars = get_object_vars($var); // related foreach ($var->relations() as $key => $related) { if ($var->hasrelated($key)) { $vars[$key] = $var->$key; } } return '{' . join(',', array_map(array('wjson', 'namevalue'), array_keys($vars), array_values($vars))) . '}'; default: return ''; } } }
其它类似信息

推荐信息