PHPStan\Rules\FunctionCallParametersCheck::check PHP Method

check() public method

public check ( PHPStan\Reflection\ParametersAcceptor $function, PhpParser\Node\Expr\FuncCall | PhpParser\Node\Expr\MethodCall | PhpParser\Node\Expr\StaticCall $funcCall, array $messages ) : array
$function PHPStan\Reflection\ParametersAcceptor
$funcCall PhpParser\Node\Expr\FuncCall | PhpParser\Node\Expr\MethodCall | PhpParser\Node\Expr\StaticCall
$messages array Six message templates
return array
    public function check(ParametersAcceptor $function, $funcCall, array $messages) : array
    {
        if ($function instanceof FunctionReflection && $function->getName() === 'implode') {
            $functionParametersMinCount = 1;
            $functionParametersMaxCount = 2;
        } else {
            $functionParametersMinCount = 0;
            $functionParametersMaxCount = 0;
            foreach ($function->getParameters() as $parameter) {
                if (!$parameter->isOptional()) {
                    $functionParametersMinCount++;
                }
                $functionParametersMaxCount++;
            }
            if ($function->isVariadic()) {
                $functionParametersMaxCount = -1;
            }
        }
        $invokedParametersCount = count($funcCall->args);
        foreach ($funcCall->args as $arg) {
            if ($arg->unpack) {
                $invokedParametersCount = max($functionParametersMinCount, $functionParametersMaxCount);
                break;
            }
        }
        if ($invokedParametersCount < $functionParametersMinCount || $invokedParametersCount > $functionParametersMaxCount) {
            if ($functionParametersMinCount === $functionParametersMaxCount) {
                return [sprintf($invokedParametersCount === 1 ? $messages[0] : $messages[1], $invokedParametersCount, $functionParametersMinCount)];
            } elseif ($functionParametersMaxCount === -1 && $invokedParametersCount < $functionParametersMinCount) {
                return [sprintf($invokedParametersCount === 1 ? $messages[2] : $messages[3], $invokedParametersCount, $functionParametersMinCount)];
            } elseif ($functionParametersMaxCount !== -1) {
                return [sprintf($invokedParametersCount === 1 ? $messages[4] : $messages[5], $invokedParametersCount, $functionParametersMinCount, $functionParametersMaxCount)];
            }
        }
        return [];
    }

Usage Example

Example #1
0
 /**
  * @param \PhpParser\Node\Expr\New_ $node
  * @param \PHPStan\Analyser\Scope $scope
  * @return string[]
  */
 public function processNode(Node $node, Scope $scope) : array
 {
     if (!$node->class instanceof \PhpParser\Node\Name) {
         return [];
     }
     $class = (string) $node->class;
     if ($class === 'static') {
         return [];
     }
     if ($class === 'self') {
         $class = $scope->getClass();
         if ($class === null) {
             return [];
         }
     }
     if (!$this->broker->hasClass($class)) {
         return [sprintf('Instantiated class %s not found.', $class)];
     }
     $classReflection = $this->broker->getClass($class);
     if ($classReflection->isInterface()) {
         return [sprintf('Cannot instantiate interface %s.', $classReflection->getName())];
     }
     if ($classReflection->isAbstract()) {
         return [sprintf('Instantiated class %s is abstract.', $classReflection->getName())];
     }
     if (!$classReflection->hasMethod('__construct') && !$classReflection->hasMethod($class)) {
         if (count($node->args) > 0) {
             return [sprintf('Class %s does not have a constructor and must be instantiated without any parameters.', $classReflection->getName())];
         }
         return [];
     }
     return $this->check->check($classReflection->hasMethod('__construct') ? $classReflection->getMethod('__construct') : $classReflection->getMethod($class), $node, ['Class ' . $classReflection->getName() . ' constructor invoked with %d parameter, %d required.', 'Class ' . $classReflection->getName() . ' constructor invoked with %d parameters, %d required.', 'Class ' . $classReflection->getName() . ' constructor invoked with %d parameter, at least %d required.', 'Class ' . $classReflection->getName() . ' constructor invoked with %d parameters, at least %d required.', 'Class ' . $classReflection->getName() . ' constructor invoked with %d parameter, %d-%d required.', 'Class ' . $classReflection->getName() . ' constructor invoked with %d parameters, %d-%d required.']);
 }
All Usage Examples Of PHPStan\Rules\FunctionCallParametersCheck::check
FunctionCallParametersCheck