132 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						||
/*
 | 
						||
 * Copyright (c) 2017-2018 THL A29 Limited, a Tencent company. All Rights Reserved.
 | 
						||
 *
 | 
						||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						||
 * you may not use this file except in compliance with the License.
 | 
						||
 * You may obtain a copy of the License at
 | 
						||
 *
 | 
						||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
						||
 *
 | 
						||
 * Unless required by applicable law or agreed to in writing,
 | 
						||
 * software distributed under the License is distributed on an
 | 
						||
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 | 
						||
 * KIND, either express or implied.  See the License for the
 | 
						||
 * specific language governing permissions and limitations
 | 
						||
 * under the License.
 | 
						||
 */
 | 
						||
 | 
						||
namespace TencentCloud\Common;
 | 
						||
 | 
						||
use \ReflectionClass;
 | 
						||
 | 
						||
/**
 | 
						||
 * 抽象model类,禁止client引用
 | 
						||
 * @package TencentCloud\Common
 | 
						||
 */
 | 
						||
abstract class AbstractModel
 | 
						||
{
 | 
						||
    /**
 | 
						||
     * 内部实现,用户禁止调用
 | 
						||
     */
 | 
						||
    public function serialize()
 | 
						||
    {
 | 
						||
        $ret = $this->objSerialize($this);
 | 
						||
        return $ret;
 | 
						||
    }
 | 
						||
 | 
						||
    private function objSerialize($obj)
 | 
						||
    {
 | 
						||
        $memberRet = [];
 | 
						||
        $ref = new ReflectionClass(get_class($obj));
 | 
						||
        $memberList = $ref->getProperties();
 | 
						||
        foreach ($memberList as $x => $member) {
 | 
						||
            $name = ucfirst($member->getName());
 | 
						||
            $member->setAccessible(true);
 | 
						||
            $value = $member->getValue($obj);
 | 
						||
            if ($value === null) {
 | 
						||
                continue;
 | 
						||
            }
 | 
						||
            if ($value instanceof AbstractModel) {
 | 
						||
                $memberRet[$name] = $this->objSerialize($value);
 | 
						||
            } else {
 | 
						||
                if (is_array($value)) {
 | 
						||
                    $memberRet[$name] = $this->arraySerialize($value);
 | 
						||
                } else {
 | 
						||
                    $memberRet[$name] = $value;
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
        return $memberRet;
 | 
						||
    }
 | 
						||
 | 
						||
    private function arraySerialize($memberList)
 | 
						||
    {
 | 
						||
        $memberRet = [];
 | 
						||
        foreach ($memberList as $name => $value) {
 | 
						||
            if ($value === null) {
 | 
						||
                continue;
 | 
						||
            }
 | 
						||
            if ($value instanceof AbstractModel) {
 | 
						||
                $memberRet[$name] = $this->objSerialize($value);
 | 
						||
            } elseif (is_array($value)) {
 | 
						||
                $memberRet[$name] = $this->arraySerialize($value);
 | 
						||
            } else {
 | 
						||
                $memberRet[$name] = $value;
 | 
						||
            }
 | 
						||
        }
 | 
						||
        return $memberRet;
 | 
						||
    }
 | 
						||
 | 
						||
    private function arrayMerge($array, $prepend = null)
 | 
						||
    {
 | 
						||
        $results = array();
 | 
						||
        foreach ($array as $key => $value) {
 | 
						||
            if (is_array($value)) {
 | 
						||
                $results = array_merge($results, static::arrayMerge($value, $prepend . $key . '.'));
 | 
						||
            } else {
 | 
						||
                if (is_bool($value)) {
 | 
						||
                    $results[$prepend . $key] = json_encode($value);
 | 
						||
                } else {
 | 
						||
                    $results[$prepend . $key] = $value;
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
        return $results;
 | 
						||
    }
 | 
						||
 | 
						||
    abstract public function deserialize($param);
 | 
						||
 | 
						||
    /**
 | 
						||
     * @param string $jsonString json格式的字符串
 | 
						||
     */
 | 
						||
    public function fromJsonString($jsonString)
 | 
						||
    {
 | 
						||
        $arr = json_decode($jsonString, true);
 | 
						||
        $this->deserialize($arr);
 | 
						||
    }
 | 
						||
 | 
						||
    public function toJsonString()
 | 
						||
    {
 | 
						||
        $r = $this->serialize();
 | 
						||
        // it is an object rather than an array
 | 
						||
        if (empty($r)) {
 | 
						||
            return "{}";
 | 
						||
        }
 | 
						||
        return json_encode($r, JSON_UNESCAPED_UNICODE);
 | 
						||
    }
 | 
						||
 | 
						||
    public function __call($member, $param)
 | 
						||
    {
 | 
						||
        $act = substr($member, 0, 3);
 | 
						||
        $attr = substr($member, 3);
 | 
						||
        if ($act === "get") {
 | 
						||
            return $this->$attr;
 | 
						||
        } else {
 | 
						||
            if ($act === "set") {
 | 
						||
                $this->$attr = $param[0];
 | 
						||
            }
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 |