1.利用反射技术
class T
{public function objToArray()
{
$arry = array();
$isAllEmpty = true;
$class = new ReflectionClass(get_class($this));
foreach($class->getProperties() as $p) {
foreach($class->getMethods(ReflectionMethod::IS_PUBLIC) as $m) {
$mName = $m->getName();
if(0 === stripos($mName, 'get') && 0 === strcasecmp(substr($mName, 3), $p->getName())) {
$value = $class->getMethod($mName)->invoke($this);
if(!empty($value)) {
$isAllEmpty = false;
}
$arry[$p->getName()] = $value;
break;
}
}
}
if($isAllEmpty) {
$arry = null;
}
return $arry;
}
protected static function arrayToObj($arr, $className)
{
$obj = null;
if(is_array($arr)) {
$class = null;
try {
$class = new ReflectionClass($className);
} catch(Exception $e) {
throw $e;
}
if(!empty($class)) {
$obj = $class->newInstance();
foreach($arr as $key => $value) {
$find = false;
foreach($class->getProperties(ReflectionProperty::IS_PRIVATE) as $p) {
if(0 === strcasecmp($key, $p->getName())) {
foreach($class->getMethods(ReflectionMethod::IS_PUBLIC) as $m) {
$mName = $m->getName();
if(0 === stripos($mName, 'set') && 0 === strcasecmp(substr($mName, 3), $key)) {
$class->getMethod($mName)->invoke($obj, $value);
$find = true;
break;
}
}
break;
}
if($find) {
break;
}
}
}
}
}
return $obj;
}
}