github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/runtime/protobuf/convert.php (about)

     1  <?php
     2  include '../vendor/autoload.php';
     3  include '${cls_name}.php';
     4  include 'GPBMetadata/Runtime/Protobuf/${cls_name}.php';
     5  
     6  $typeArr = array("double", "float", "int32", "int64", "uint32", "uint64", "sint32", "sint64",
     7      "fixed32", "fixed64", "sfixed32", "sfixed64", "bool", "string", "bytes");
     8  
     9  $inst = new ${cls_name}();
    10  
    11  printSep("set properties");
    12  
    13  $reflect = new ReflectionObject($inst);
    14  $methods = $reflect->getMethods();
    15  foreach ($methods as $key => $value) {
    16      $setMethodName = $value->getName();
    17      $found = strpos($setMethodName, 'set');
    18      if ($found !== false) {
    19          $repeated = false;
    20          $setMethodParamCls = "";
    21  
    22          parserFieldPropsFromComments($value, $repeated, $setMethodParamCls);
    23          setFieldDefaultValue($inst, $repeated, $setMethodName, $setMethodParamCls);
    24      }
    25  }
    26  
    27  $data = $inst->serializeToString();
    28  file_put_contents('data.bin', $data);
    29  
    30  $data = file_get_contents('data.bin');
    31  $decode = new Person();
    32  $decode->mergeFromString($data);
    33  
    34  printSep("print object");
    35  $prefix = 0;
    36  printObj($decode, $prefix);
    37  
    38  function setFieldDefaultValue(&$parentObj, $repeated, $setMethodName, $setMethodParamCls)
    39  {
    40      $parentReflect = new ReflectionObject($parentObj);
    41      $parentObjType = $parentReflect->getName();
    42      echo "object type      = $parentObjType\n";
    43      echo "field type       = $setMethodParamCls\n";
    44      echo "field method     = $setMethodName\n";
    45      echo "field repeated   = $repeated\n\n";
    46  
    47      if (isStandType($setMethodParamCls)) { //
    48          $defaultVal = getDefaultValByType($setMethodParamCls, $repeated);
    49          call_user_func(array($parentObj, $setMethodName), $defaultVal);
    50  
    51          return;
    52      }
    53  
    54      require "./$setMethodParamCls.php";
    55  
    56      $childObj = new $setMethodParamCls();
    57      $childReflect = new ReflectionObject($childObj);
    58      $childMethods = $childReflect->getMethods();
    59      $isEnum = true;
    60      foreach ($childMethods as $key => $value) {
    61          $childSetMethodName = $value->getName();
    62          $found = strpos($childSetMethodName, 'set');
    63          if ($found === false) {
    64              continue;
    65          }
    66  
    67          $isEnum = false; // enum has no set method
    68  
    69          $childRepeated = 0;
    70          $childSetMethodParamCls = "";
    71          parserFieldPropsFromComments($value, $childRepeated, $childSetMethodParamCls);
    72          setFieldDefaultValue($childObj, $childRepeated, $childSetMethodName, $childSetMethodParamCls);
    73      }
    74  
    75      if ($isEnum) return;
    76  
    77      $children = $repeated? array($childObj) : $childObj;
    78      call_user_func(array($parentObj, $setMethodName), $children);
    79  }
    80  
    81  function parserFieldPropsFromComments($value, &$repeated, &$className)
    82  {
    83      $comments = $value->getDocComment();
    84      // <code>.Address address = 4;</code>
    85      $pattern = '/<code>(repeated\s)?\.?(.+?)\s/is';
    86      preg_match($pattern, $comments, $match);
    87      if (sizeof($match) >= 3) {
    88          $repeated = $match[1];
    89          $className = $match[2];
    90      } else if (sizeof($match) >= 2) {
    91          $repeated = false;
    92          $className = $match[1];
    93      }
    94      $repeated = trim($repeated);
    95      if ($repeated === 'repeated')
    96          $repeated = 1;
    97      else
    98          $repeated = 0;
    99  
   100      $className = trim($className);
   101  }
   102  
   103  function getDefaultValByType($type, $repeat)
   104  {
   105      if (!$repeat) {
   106          return getRandValByType($type);
   107      }
   108  
   109      $count = rand(3, 30);
   110      $ret = array();
   111      for ($i = 0; $i < $count; $i++) {
   112          $item = getRandValByType($type);
   113          $ret[$i] = $item;
   114      }
   115  
   116      return $ret;
   117  }
   118  
   119  function getRandValByType($type)
   120  {
   121      if ($type === 'bool') { // : string
   122          $ret = rand(0, 1);
   123          return $ret;
   124  
   125      } else if ($type === 'string') { // : string
   126          $r = rand(3, 100);
   127          $ret = getRandStr($r);
   128          return $ret;
   129  
   130      } else if ($type === 'float') { // java float: float
   131          $start = pow(2, 7) * -1;
   132          $end = pow(2, 7) - 1;
   133  
   134          $ret = getRandFloat($start, $end);
   135          return $ret;
   136  
   137      } else if ($type === 'double') { // java double: float
   138          $start = pow(2, 10) * -1;
   139          $end = pow(2, 10) - 1;
   140  
   141          $ret = getRandFloat($start, $end);
   142          return $ret;
   143  
   144      } else if ($type === 'int32' || $type === 'sint32' || $type === 'sfixed32') { // go int32 : integer
   145          $start = pow(2, 31) * -1;
   146          $end = pow(2, 31) - 1; // 2147483647
   147  
   148          $ret = rand($start, $end);
   149          return $ret;
   150  
   151      } else if ($type === 'uint32' || $type === 'fixed32') { // go uint32 : integer
   152          $end = pow(2, 32) - 1; // 4294967295
   153  
   154          $ret = rand(0, $end);
   155          return $ret;
   156  
   157      } else if ($type === 'int64' || $type === 'sint64' || $type === 'sfixed64') { // go int64 : integer/string
   158          $ret = randUint64('9223372036854775807');
   159  
   160          $sign = rand(0, 1);
   161          if ($sign == 0) {
   162              $ret *= -1;
   163          }
   164          return $ret;
   165  
   166      } else if ($type === 'uint64' || $type === 'fixed64') { // go uint64 : integer
   167          $ret = randUint64('18446744073709551615');
   168          return $ret;
   169  
   170      }
   171  }
   172  
   173  function printObj($obj, $prefix)
   174  {
   175      $reflect = new ReflectionObject($obj);
   176      $name = $reflect->getName();
   177      echo str_repeat(' ', $prefix) . "[$name]\n";
   178  
   179      if ($name === 'Google\Protobuf\Internal\RepeatedField') {
   180          foreach ($obj as $key => $value) {
   181              printObj($value, $prefix + 3);
   182          }
   183      }
   184      if ($name)
   185  
   186          $methods = $reflect->getMethods();
   187      foreach ($methods as $key => $value) {
   188          $methodName = $value->getName();
   189          $found = strpos($methodName, 'get');
   190          if ($found !== false && $methodName !== "getClass" && $methodName !== "getType" && $methodName !== "getLegacyClass"
   191              && $methodName !== "getIterator") {
   192              if ($methodName === 'getAddressItems') {
   193                  echo '';
   194              }
   195  
   196              $repeated = false;
   197              $className = "";
   198              parserFieldPropsFromComments($value, $repeated, $className);
   199              $var = call_user_func(array($obj, $methodName));
   200  
   201              if (isStandType($className) || gettype($var) === 'integer') {
   202                  printField($methodName, $var, $repeated, $className, $prefix + 3);
   203                  continue;
   204              }
   205  
   206              $name = str_repeat(' ', $prefix + 3) . substr($methodName, 3);
   207              $name = str_pad($name, 26, " ", STR_PAD_RIGHT);
   208              echo "$name\n";
   209              printObj($var, $prefix + 3);
   210          }
   211      }
   212  }
   213  
   214  function printField($methodName, $var, $repeated, $className, $prefix)
   215  {
   216      if ($className === 'bool') {
   217          if ($var) $var = 'true';
   218          else $var = 'false';
   219      }
   220  
   221      if (!$repeated) {
   222          $name = str_repeat(' ', $prefix) . substr($methodName, 3);
   223          $name = str_pad($name, 26, " ", STR_PAD_RIGHT);
   224          echo "$name = $var\n";
   225          return;
   226      }
   227  
   228      $arr = array();
   229      foreach ($var as $key => $value) {
   230          $arr[] = $value;
   231      }
   232  
   233      $name = str_pad(str_repeat(' ', $prefix) . substr($methodName, 3), 26, " ", STR_PAD_RIGHT);
   234      echo "$name = [" . join(",", $arr) . "] \n";
   235  }
   236  
   237  function isStandType($className)
   238  {
   239      global $typeArr;
   240  
   241      return in_array($className, $typeArr);
   242  }
   243  
   244  function getRandStr($length = 10)
   245  {
   246      srand(date("s"));
   247      $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
   248      $string = "";
   249      while (strlen($string) < $length) {
   250          $string .= substr($chars, (rand() % (strlen($chars))), 1);
   251      }
   252      return ($string);
   253  }
   254  
   255  function randUint64($maxStrValue){
   256      $result = '';
   257      $maxBegin = '';
   258  
   259      for($i = 0; $i < strlen($maxStrValue); $i++){
   260          $maxDigit = $maxStrValue[$i];
   261  
   262          if($result === $maxBegin){
   263              $result .= random_int(0, $maxDigit);
   264          }else{
   265              $result .= random_int(0, 9);
   266          }
   267          $maxBegin .= $maxDigit;
   268      }
   269  
   270      $result = '1' . substr($result,1);
   271      return intval($result);
   272  }
   273  
   274  function getRandFloat($min = 0, $max = 1)
   275  {
   276      $rl = mt_rand() / mt_getrandmax();
   277      return ($min + ($rl * ($max - $min)));
   278  }
   279  
   280  function printSep($title)
   281  {
   282      echo(str_repeat("=", 16) . " " . $title . " " . str_repeat("=", 16) . "\n");
   283  }