public static Memory callStatic(Environment env, TraceInfo trace,
                                    MethodEntity method, @Nullable String staticClass,
                                    Memory[] args, boolean checkAccess)
            throws Throwable {
        if (checkAccess)
            checkAccess(env, trace, method);

        Memory result = method.getImmutableResultTyped(env, trace);

        if (result != null) {
            return result;
        }

        String originClassName = method.getClazz().getName();
        String originMethodName = method.getName();

        String staticClazz = staticClass == null ? originClassName : staticClass;

        Memory[] passed = InvokeArgumentHelper.makeArguments(
                env, args, method.getParameters(), originClassName, originMethodName, staticClass, trace
        );

        CallStack callStack = trace != null && method.isUsesStackTrace() ? env.getCallStack() : null;

        try {
            if (callStack != null) {
                callStack.push(trace, null, passed, originMethodName, method.getClazz(), staticClazz);
            }

            return method.invokeStatic(env, passed);
        } finally {
            if (callStack != null) {
                callStack.pop();
            }
        }
    }
Method is invoked via bytecode

@throws Throwable
jphp-runtime/src/php/runtime/invoke/InvokeHelper.java