Zephir\FunctionCall::isReadOnly PHP Method

isReadOnly() protected method

This method gets the reflection of a function to check if any of their parameters are passed by reference Built-in functions rarely change the parameters if they aren't passed by reference
protected isReadOnly ( string $funcName, array $expression ) : boolean
$funcName string
$expression array
return boolean
    protected function isReadOnly($funcName, array $expression)
    {
        if ($this->isBuiltInFunction($funcName)) {
            return false;
        }
        /**
         * These functions are supposed to be read-only but they change parameters ref-count
         */
        switch ($funcName) {
            case 'min':
            case 'max':
            case 'array_fill':
            case 'array_pad':
            case 'call_user_func':
            case 'call_user_func_array':
                return false;
        }
        $reflector = $this->getReflector($funcName);
        if ($reflector) {
            if (isset($expression['parameters'])) {
                /**
                 * Check if the number of parameters
                 */
                $numberParameters = count($expression['parameters']);
                if ($numberParameters < $reflector->getNumberOfRequiredParameters()) {
                    throw new CompilerException("The number of parameters passed is lesser than the number of required parameters by '" . $funcName . "'", $expression);
                }
            } else {
                $numberParameters = 0;
                if ($reflector->getNumberOfRequiredParameters() > 0) {
                    throw new CompilerException("The number of parameters passed is lesser than the number of required parameters by '" . $funcName . "'", $expression);
                }
            }
            if ($reflector->getNumberOfParameters() > 0) {
                foreach ($reflector->getParameters() as $parameter) {
                    if ($parameter->isPassedByReference()) {
                        return false;
                    }
                }
            }
            return true;
        }
        return false;
    }