code: public static function getType($val, &$typeMore = null)
      {
          if (\is_string($val)) {
              $type = 'string';
              if (\is_numeric($val)) {
                  $typeMore = 'numeric';
              } elseif ($val === self::UNDEFINED) {
                  $type = 'undefined';    // not a native php type!
              } elseif ($val === self::RECURSION) {
                  $type = 'recursion';    // not a native php type!
              }
          } elseif (\is_array($val)) {
              if (\in_array(self::ABSTRACTION, $val, true)) {
                  $type = $val['type'];
                  $typeMore = 'abstraction';
              } elseif (AbstractArray::isCallable($val)) {
                  $type = 'callable';
                  $typeMore = 'raw';  // needs abstracted
              } else {
                  $type = 'array';
                  $typeMore = 'raw';  // needs abstracted
              }
          } elseif (\is_bool($val)) {
              $type = 'bool';
              $typeMore = \json_encode($val);
          } elseif (\is_float($val)) {
              $type = 'float';
          } elseif (\is_int($val)) {
              $type = 'int';
          } elseif (\is_null($val)) {
              $type = 'null';
          } elseif (\is_object($val)) {
              $type = 'object';
              $typeMore = 'raw';  // needs abstracted
          } elseif (\is_resource($val) || \strpos(\print_r($val, true), 'Resource') === 0) {
              // is_resource() returns false for a closed resource
              // (it's also not a string)
              $type = 'resource';
              $typeMore = 'raw';  // needs abstracted
          }
          return $type;
      }
docs: Returns value's type
  
  @param mixed  $val      value
  @param string $typeMore will be populated with additional type info ("numeric"/"binary")
  
  @return string