/// <summary> /// Resolves path according to PHP semantics, lookups the file in runtime tables and calls its Main method. /// </summary> /// <param name="cd">Current script directory. Used for relative path resolution. Can be <c>null</c> to not resolve against current directory.</param> /// <param name="path">The relative or absolute path to resolve and include.</param> /// <param name="locals">Variables scope for the included script.</param> /// <param name="this">Reference to <c>this</c> variable.</param> /// <param name="self">Reference to current class context.</param> /// <param name="once">Whether to include according to include once semantics.</param> /// <param name="throwOnError">Whether to include according to require semantics.</param> /// <returns>Inclusion result value.</returns> public PhpValue Include(string cd, string path, PhpArray locals, object @this = null, RuntimeTypeHandle self = default(RuntimeTypeHandle), bool once = false, bool throwOnError = false) { ScriptInfo script; if (FileSystemUtils.TryGetScheme(path, out var schemespan)) { // SCHEME://SOMETHING script = HandleIncludeWithScheme(schemespan, cd, path.Substring(schemespan.Length + 3)); } else { // regular inclusion resolution script = ScriptsMap.ResolveInclude(path, RootPath, IncludePaths, WorkingDirectory, cd); } if (script.IsValid) { return((once && _scripts.IsIncluded(script.Index)) ? PhpValue.True : script.Evaluate(this, locals, @this, self)); } else { return(HandleMissingScript(cd, path, throwOnError)); } }
/// <summary> /// Resolves path according to PHP semantics, lookups the file in runtime tables and calls its Main method. /// </summary> /// <param name="cd">Current script directory. Used for relative path resolution. Can be <c>null</c> to not resolve against current directory.</param> /// <param name="path">The relative or absolute path to resolve and include.</param> /// <param name="locals">Variables scope for the included script.</param> /// <param name="this">Reference to <c>this</c> variable.</param> /// <param name="self">Reference to current class context.</param> /// <param name="once">Whether to include according to include once semantics.</param> /// <param name="throwOnError">Whether to include according to require semantics.</param> /// <returns>Inclusion result value.</returns> public PhpValue Include(string cd, string path, PhpArray locals, object @this = null, RuntimeTypeHandle self = default(RuntimeTypeHandle), bool once = false, bool throwOnError = false) { var script = ScriptsMap.ResolveInclude(path, RootPath, IncludePaths, WorkingDirectory, cd); if (script.IsValid) { if (once && _scripts.IsIncluded(script.Index)) { return(PhpValue.Create(true)); } else { return(script.Evaluate(this, locals, @this, self)); } } else { if (TryIncludeFileContent(path)) // include non-compiled file (we do not allow dynamic compilation yet) { return(PhpValue.Null); } else { var cause = string.Format(Resources.ErrResources.script_not_found, path); PhpException.Throw( throwOnError ? PhpError.Error : PhpError.Notice, Resources.ErrResources.script_inclusion_failed, path, cause, string.Join(";", IncludePaths), cd); if (throwOnError) { throw new ArgumentException(cause); } return(PhpValue.False); } } }
/// <summary> /// Tries to resolve compiled script according to given path. /// </summary> public static ScriptInfo TryResolveScript(string root, string path) => ScriptsMap.ResolveInclude(path, root, null, null, null);
public static ScriptInfo TryResolveScript(string root, string path) => ScriptsMap.ResolveInclude(path, root, include_path: null, working_dir: root, script_dir: null);