PHP Reflection - Get Method Parameter Type As String

后端 未结 6 1869
無奈伤痛
無奈伤痛 2020-12-01 18:44

I\'m trying to use PHP reflection to dynamically load the class files of models automatically based upon the type of parameter that is in the controller method. Here\'s an e

6条回答
  •  一生所求
    2020-12-01 19:35

    I had similar problem, when checking getClass on reflection parameter when a class was not loaded. I made a wrapper function to get the class name from example netcoder made. Problem was that netcoder code didnt work if it was an array or not an class -> function($test) {} it would return the to string method for the reflection parameter.

    Below the way how i solved it, im using try catch because my code requires at some point the class. So if i request it the next time, get class works and doesnt throw an exception.

    /**
     * Because it could be that reflection parameter ->getClass() will try to load an class that isnt included yet
     * It could thrown an Exception, the way to find out what the class name is by parsing the reflection parameter
     * God knows why they didn't add getClassName() on reflection parameter.
     * @param ReflectionParameter $reflectionParameter
     * @return string Class Name
     */
    public function ResolveParameterClassName(ReflectionParameter $reflectionParameter)
    {
        $className = null;
    
        try
        {
                     // first try it on the normal way if the class is loaded then everything should go ok
            $className = $reflectionParameter->getClass()->name;
    
        }
        // if the class isnt loaded it throws an exception and try to resolve it the ugly way
        catch (Exception $exception)
        {
            if ($reflectionParameter->isArray())
            {
                return null;
            }
    
            $reflectionString = $reflectionParameter->__toString();
            $searchPattern = '/^Parameter \#' . $reflectionParameter->getPosition() . ' \[ \ ([A-Za-z]+) \$' . $reflectionParameter->getName() . ' \]$/';
    
            $matchResult = preg_match($searchPattern, $reflectionString, $matches);
    
            if (!$matchResult)
            {
                return null;
            }
    
            $className = array_pop($matches);
        }
    
        return $className;
    }
    

提交回复
热议问题