周梦康 发表于 2016-09-18 2362 次浏览 标签 : php反射代码碎片
class BaseModel
{
  const XXX = 'test';

  /**
   * 获取子类自定义的常量 ( 不包含父类定义的常量 )
   *
   * @param $class
   * @return array
   */
  static function getConstants($class) {

      $oClass = new \ReflectionClass($class);
      $arr1 = $oClass->getConstants();
      $arr2 = $oClass->getParentClass()->getConstants();

      return array_diff($arr1,$arr2);
  }
}

class ScoreModel extends BaseModel
{
  const RULE_TYPE_ROUND_TABLE_CREATE = 'round_table_create';

  public static function systemOperate(){
    var_dump(self::getConstants(__CLASS__));
  }
}

ScoreModel::systemOperate();
class ScoreModel extends BaseModel
{
  const RULE_TYPE_ROUND_TABLE_CREATE = 'round_table_create';

  private static $score_rule = [];

  private static function scoreRuleInit(){
    $array = [];

    // 本应该从数据库取,这里直接模拟了
    $array[self::RULE_TYPE_ROUND_TABLE_CREATE] = [
        'type' => 1,
        'score' => 10,
        'money' => 10,
        'desc' => '创建圆桌话题'
    ];

    return $array;
  }

  public static function systemOperate($rule_type){
    // 这一步的判断就拦截了一些无意义的类型干扰,防止下面的规则初始化操作
    if (!in_array($rule_type,self::getConstants(__CLASS__))){
        return false;
    }

    if (!isset(self::$score_rule[$rule_type])){
        self::$score_rule = array_merge(self::$score_rule,self::scoreRuleInit());
    }

    var_dump(self::$score_rule);
  }
}

ScoreModel::systemOperate(ScoreModel::RULE_TYPE_ROUND_TABLE_CREATE);


评论列表