<?php

namespace loyalsoft;

/**
 * 扩展对象的一些通用方法
 * 使用方法: $var = new XX($obj); ... 用完后注意进行回存.(相当于克隆一个原始对象,若需覆盖原始对象记得回存操作)
 * @version
 *          1.0.1 改名, PHP 7以后的语法中已经将Object作为关键字 --gwang 2017年8月2日
 *          1.0.0 Created at 2017-3-28. by --gwang
 * @author gwang (mail@wanggangzero.cn)
 * @copyright ? 2017-3-28, SJZ LoyalSoft Corporation & gwang. All rights reserved.
 */
class Object_ext {

    /**
     * 默认构造函数,能够智能提取关联数组或者是object中的字段进行初始化.
     * Ps. 不会进行递归类型检查, php的serilize函数也没有附带字段的类型信息
     */
    function __construct($arg = null) {
        if (func_num_args() != 1 || is_null($arg)) {
            return;
        }
        $para = is_array($arg) ? $arg : (array) $arg;                           # 关联数组
        $vars = get_class_vars(get_class($this));                               # 后期绑定，获得实例的实际类名称=>属性数组
        foreach ($vars as $name => $value) {
            $this->$name = isset($para[$name]) ? $para[$name] : $value;         # 取参数中的或者默认值
        }
    }

    /**
     * 从对象加载数据(赋值给自己的字段)
     * @param array/Object $obj
     */
    protected function LoadFrom($obj) {
        if (func_num_args() != 1 || is_null($obj)) {
            die("too many args or arg obj was null!");
        }
        $para = is_array($obj) ? $obj : (array) $obj;                           # 转关联数组
        $vars = get_class_vars(get_class($this));                               # 后期绑定，获得实例的实际类名称=>属性数组
        foreach ($vars as $name => $value) {
            $this->$name = isset($para[$name]) ? $para[$name] : $value;         # 取参数中的或者默认值
        }
        return $this;
    }

    public function __toString() {
        return $this->toString();
    }

    protected function toString() {
        $str = JsonUtil::encode($this);
        return $str;
    }

}
