【php开源代码栏目提醒】:网学会员为广大网友收集整理了,Encoder.php,希望对大家有所帮助!
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to version 1.0 of the Zend Framework
* license, that is bundled with this package in the file LICENSE,
* and is available through the world-wide-web at the following URL:
* http://www.zend.com/license/framework/1_0.txt. If you did not
* receive a copy of the Zend Framework license and are unable to
* obtain it through the world-wide-
web, please send a note to
* license@zend.com so we can mail you a copy immediately.
*
* @package Zend_Json
* @copyright Copyright (c) 2006 Zend Technologies USA Inc. (http://www.zend.com/)
* @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
*/
/**
* Zend_Json_Exception
*/
require_once 'Zend/Json/Exception.php';
/**
* Encode
PHP constructs to JSON
*
* @package Zend_Json
* @copyright Copyright (c) 2006 Zend Technologies USA Inc. (http://www.zend.com/)
* @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
*/
class Zend_Json_Encoder
{
/**
* Array of visited objects; used to prevent cycling.
*
* @var array
*/
protected $_visited = array();
/**
* Constructor
*/
protected function __construct()
{
}
/**
* Use the JSON encoding scheme for the value specified
*
* @param mixed $value value the object to be encoded
* @return string The encoded value
*/
public static function encode($value)
{
$encoder = new Zend_Json_Encoder();
return $encoder->_encodeValue($value);
}
/**
* Recursive driver which determines the type of value to be encoded
* and then dispatches to the appropriate method. $values are either
* - objects (returns from {@link _encodeObject()})
* - arrays (returns from {@link _encodeArray()})
* - basic datums (e.g. numbers or strings) (returns from {@link _encodeDatum()})
*
* @param $value mixed The value to be encoded
* @return string Encoded value
*/
protected function _encodeValue(&$value)
{
if (is_object($value)) {
return $this->_encodeObject($value);
} else if (is_array($value)) {
return $this->_encodeArray($value);
}
return $this->_encodeDatum($value);
}
/**
* Encode an object to JSON by encoding each of the public properties
*
* A special property is added to the JSON object called '__className'
* that contains the name of the class of $value. This is used to decode
* the object on the client into a specific class.
*
* @param $value object
* @return string
* @throws Zend_Json_Exception
*/
protected function _encodeObject(&$value)
{
if ($this->_wasVisited($value)) {
throw new Zend_Json_Exception(
'Cycles not supported in JSON encoding, cycle introduced by '
. 'class "' . get_class($value) . '"'
);
}
$this->_visited[] = $value;
$props = '';
foreach (get_object_vars($value) as $name => $propValue) {
if (isset($propValue)) {
$props .= ', '
. $this->_encodeValue($name)
. ' : '
. $this->_encodeValue($propValue);
}
}
return '{' . '"__className": "' . get_class($value) . '"'
. $props . '}';
}
/**
* Determine if an object has been serialized already
*
* @access protected
* @param mixed $value
* @return boolean
*/
protected function _wasVisited(&$value)
{
if (in_array($value, $this->_visited, true)) {
return true;
}
return false;
}
/**
* JSON encode an array value
*
* Recursively encodes each value of an array and returns a JSON encoded
* array string.
*
* @param $array array
* @return string
*/
protected function _encodeArray(&$array)
{
$tmpArray = array();
$assoc = false;
// Check for associative array
foreach (array_keys($array) as $key) {
if (!is_int($key)) {
$assoc = true;
break;
}
}
if ($assoc) {
$result = '{';
foreach ($array as $key => $value) {
$key = (string) $key;
$tmpArray[] = $this->_encodeString($key)
. ' : '
. $this->_encodeValue($value);
}
$result .= implode(', ', $tmpArray);
$result .= '}';
} else {
$result = '[';
$length = count($array);
for ($i = 0; $i < $length; $i++) {
$tmpArray[] = $this->_encodeValue($array[$i]);
}
$result .= implode(', ', $tmpArray);
$result .= ']';
}
return $result;
}
/**
* JSON encode a basic data type (string, number, boolean, null)
*
* If value type is not a string, number, boolean, or null, the string
* 'null' is returned.
*
* @param $value mixed
* @return string
*/
protected function _encodeDatum(&$value)
{
$result = 'null';
if (is_numeric($value)) {
$result = (string)$value;
} elseif (is_string($value)) {
$result = $this->_encodeString($value);
} elseif (is_bool($value)) {
$result = $value ? 'true' : 'false';
}
return $result;
}
/**
* JSON encode a string value by e