/** * Get parameter description * * @param ParameterReflection $param * @return string|null */ public function getParamDescription(ParameterReflection $param) { $docBlock = $param->getDeclaringFunction()->getDocBlock(); $docBlockLines = explode("\n", $docBlock->getContents()); $pattern = "/\\@param\\s+([\\w\\\\_\\[\\]\\|]+)\\s+(\\\${$param->getName()})\\s(.*)/"; $matches = []; foreach ($docBlockLines as $line) { if (preg_match($pattern, $line, $matches)) { return $matches[3]; } } }
/** * Check if parameter is an array. * * @param ParameterReflection $param * @return bool */ protected function _isArrayParam($param) { $isArray = $param->isArray(); $docBlock = $param->getDeclaringFunction()->getDocBlock(); /** If array type is not set explicitly in the method interface, examine annotations */ if (!$isArray && $docBlock) { /** This pattern will help to skip parameters declarations which precede to the current one */ $precedingParamsPattern = str_repeat('.*\\@param.*', $param->getPosition()); $paramType = str_replace('\\', '\\\\', $param->getType()); if (preg_match("/.*{$precedingParamsPattern}\\@param\\s+({$paramType}\\[\\]).*/is", $docBlock->getContents())) { $isArray = true; } } return $isArray; }
/** * Get the parameter type * * @param ParameterReflection $param * @return string */ public function getParamType(ParameterReflection $param) { $type = $param->getType(); if ($type == 'array') { // try to determine class, if it's array of objects $docBlock = $param->getDeclaringFunction()->getDocBlock(); $pattern = "/\\@param\\s+([\\w\\\\_]+\\[\\])\\s+\\\${$param->getName()}\n/"; if (preg_match($pattern, $docBlock->getContents(), $matches)) { return $matches[1]; } return "{$type}[]"; } return $type; }