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 }