コード例 #1
0
        public virtual void __construct(Context ctx, PhpValue /*string|array*/ function, PhpValue /*string|int*/ parameter)
        {
            // resolve RoutineInfo:

            PhpTypeInfo declaringclass = null;
            RoutineInfo routine        = null;

            var function_str = function.AsString();

            if (function_str != null)
            {
                routine = ctx.GetDeclaredFunction(function_str);
            }
            else
            {
                var function_arr = function.AsArray();
                if (function_arr != null && function_arr.Count == 2)
                {
                    declaringclass = ReflectionUtils.ResolvePhpTypeInfo(ctx, function_arr[0]); // cannot be null
                    routine        = declaringclass.RuntimeMethods[function_arr[1].ToStringOrThrow(ctx)];
                }
            }

            if (routine != null)
            {
                var func = (declaringclass == null)
                ? (ReflectionFunctionAbstract) new ReflectionFunction(routine)
                : new ReflectionMethod(declaringclass, routine);

                // resolve parameter:
                var parameters = ReflectionUtils.ResolveReflectionParameters(func, routine.Methods);
                var pstr       = parameter.AsString();
                if (pstr != null)
                {
                    SetParameter(parameters.First(p => p._name == pstr));
                    return;
                }
                else
                {
                    if (parameter.IsLong(out long index) && index < parameters.Count && index >= 0)
                    {
                        SetParameter(parameters[(int)index]);
                        return;
                    }
                }
            }

            throw new ReflectionException();
        }
コード例 #2
0
        /// <summary>
        /// Get the parameters as an array of <see cref="ReflectionParameter"/>.
        /// </summary>
        /// <returns>The parameters, as <see cref="ReflectionParameter"/> objects.</returns>
        public PhpArray getParameters(Context ctx)
        {
            var parameters = ReflectionUtils.ResolveReflectionParameters(ctx, this, _routine.Methods);

            //

            var arr = new PhpArray(parameters.Count);

            for (int i = 0; i < parameters.Count; i++)
            {
                arr.Add(PhpValue.FromClass(parameters[i]));
            }

            return(arr);
        }
コード例 #3
0
        /// <summary>
        /// Get the parameters as an array of <see cref="ReflectionParameter"/>.
        /// </summary>
        /// <returns>The parameters, as <see cref="ReflectionParameter"/> objects.</returns>
        public PhpArray getParameters(Context ctx)
        {
            var parameters = ReflectionUtils.ResolveReflectionParameters(ctx, this, _routine.Methods);

            //

            var arr = new PhpArray(parameters.Count);

            for (int i = 0; i < parameters.Count; i++)
            {
                Debug.Assert(!parameters[i]._isVariadic || i == parameters.Count - 1, "Variadic can be only last parameter");

                arr.Add(PhpValue.FromClass(parameters[i]));
            }

            return(arr);
        }
コード例 #4
0
        /// <summary>
        /// Get the parameters as an array of <see cref="ReflectionParameter"/>.
        /// </summary>
        /// <returns>The parameters, as <see cref="ReflectionParameter"/> objects.</returns>
        public PhpArray getParameters(Context ctx)
        {
            var parameters = ReflectionUtils.ResolveReflectionParameters(ctx, this, _routine.Methods);

            //

            var arr = new PhpArray(parameters.Count);

            for (int i = 0; i < parameters.Count; i++)
            {
                var p = parameters[i];

                arr.Add(PhpValue.FromClass(p));

                if (p.isVariadic())
                {
                    break;                 // variadic must be the last one
                }
            }

            return(arr);
        }