protected function pickle($var, $level = 0)
{
if (is_bool($var) || is_null($var) || is_int($var) || is_float($var)) {
return $var;
}
if (is_string($var)) {
// intentionally @
return @iconv('UTF-16', 'UTF-8//IGNORE', iconv($this->encoding, 'UTF-16//IGNORE', $var));
}
if (is_array($var)) {
static $marker;
if ($marker === null) {
$marker = uniqid("", true);
}
// detects recursions
if (isset($var[$marker])) {
return '*RECURSION*';
}
if ($this->maxPickleDepth && $level >= $this->maxPickleDepth) {
return '...';
}
$var[$marker] = true;
$res = [];
foreach ($var as $k => &$v) {
if ($k !== $marker) {
$res[$this->pickle($k)] = $this->pickle($v, $level + 1);
}
}
unset($var[$marker]);
return $res;
}
if (is_object($var)) {
$arr = (array) $var;
$arr['__class##'] = get_class($var);
static $list = [];
// detects recursions
if (in_array($var, $list, true)) {
return '*RECURSION*';
}
if ($level < $this->maxPickleDepth || !$this->maxPickleDepth) {
$list[] = $var;
$res = [];
foreach ($arr as $k => &$v) {
if ($k[0] === "") {
$k = substr($k, strrpos($k, "") + 1);
}
$res[$this->pickle($k)] = $this->pickle($v, $level + 1);
}
array_pop($list);
return $res;
}
return '...';
}
if (is_resource($var)) {
return '*' . get_resource_type($var) . ' resource*';
}
return '*unknown type*';
}