首页 > 解决方案 > 在 PHP 中包含名称空间的文件意外终止脚本,即使它是 include_once

问题描述

我首先尝试将每个文件包含在 GitHub 项目中。我的目的是在那之后调用 get_declared_classes() 作为一种反射形式,这样我就可以了解项目中声明了哪些类。我从没想过会遇到这个问题,经过大量研究和测试后我没有解决方案。请帮忙。

我正在使用的项目:https ://github.com/farafiri/PHP-parsing-tool

我把它下载到一个文件夹中。写了这段代码:

$toparse = shell_exec("find '/Users/user/Documents/PHP-parsing-tool-master/src' -iname '*.php' 2> /dev/null");
$filenames = explode("\n", $toparse);
//d() is a custom function that acts like var_dump.
d($filenames);

$filenames 转储(请原谅 d() 附带的自定义格式。基本上 $filenames 是一个由 77 个元素组成的数组,每个元素是一个字符串,表示 Github 项目中每个文件的路径):

array (77) [
    0 => string (77) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/RuleCondition.php"
    1 => string (76) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/SequenceItem.php"
    2 => string (71) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/Integer.php"
    3 => string (70) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/Series.php"
    4 => string (68) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/Time.php"
    5 => string (69) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/Regex.php"
    6 => string (105) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/ItemRestrictions/ItemRestrictionInterface.php"
    7 => string (98) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/ItemRestrictions/ItemRestrictionOr.php"
    8 => string (99) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/ItemRestrictions/ItemRestrictionAnd.php"
    9 => string (91) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/ItemRestrictions/FollowedBy.php"
    10 => string (83) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/ItemRestrictions/Is.php"
    11 => string (88) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/ItemRestrictions/Contain.php"
    12 => string (99) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/ItemRestrictions/ItemRestrictionNot.php"
    13 => string (72) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/TextNode.php"
    14 => string (86) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/WhiteCharactersContext.php"
    15 => string (82) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/ExtensionInterface.php"
    16 => string (70) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/Choice.php"
    17 => string (80) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/ItemRestrictions.php"
    18 => string (68) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/Base.php"
    19 => string (73) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/Lookahead.php"
    20 => string (80) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/ParametrizedNode.php"
    21 => string (71) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/Unorder.php"
    22 => string (68) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/Text.php"
    23 => string (76) "/Users/user/Documents/PHP-parsing-tool-master/src/Extension/StringObject.php"
    24 => string (70) "/Users/user/Documents/PHP-parsing-tool-master/src/ParsingException.php"
    25 => string (60) "/Users/user/Documents/PHP-parsing-tool-master/src/Parser.php"
    26 => string (64) "/Users/user/Documents/PHP-parsing-tool-master/src/Util/Regex.php"
    27 => string (64) "/Users/user/Documents/PHP-parsing-tool-master/src/Util/Error.php"
    28 => string (75) "/Users/user/Documents/PHP-parsing-tool-master/src/SyntaxTreeNode/Series.php"
    29 => string (85) "/Users/user/Documents/PHP-parsing-tool-master/src/SyntaxTreeNode/PredefinedString.php"
    30 => string (75) "/Users/user/Documents/PHP-parsing-tool-master/src/SyntaxTreeNode/Branch.php"
    31 => string (73) "/Users/user/Documents/PHP-parsing-tool-master/src/SyntaxTreeNode/Base.php"
    32 => string (76) "/Users/user/Documents/PHP-parsing-tool-master/src/SyntaxTreeNode/Numeric.php"
    33 => string (73) "/Users/user/Documents/PHP-parsing-tool-master/src/SyntaxTreeNode/Root.php"
    34 => string (73) "/Users/user/Documents/PHP-parsing-tool-master/src/SyntaxTreeNode/Leaf.php"
    35 => string (77) "/Users/user/Documents/PHP-parsing-tool-master/src/SyntaxTreeNode/LeafTime.php"
    36 => string (71) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNodeCopier.php"
    37 => string (72) "/Users/user/Documents/PHP-parsing-tool-master/src/Examples/CSVParser.php"
    38 => string (88) "/Users/user/Documents/PHP-parsing-tool-master/src/Examples/YamlLikeIndentationParser.php"
    39 => string (89) "/Users/user/Documents/PHP-parsing-tool-master/src/Examples/ArithmeticExpressionParser.php"
    40 => string (73) "/Users/user/Documents/PHP-parsing-tool-master/src/Examples/JSONParser.php"
    41 => string (75) "/Users/user/Documents/PHP-parsing-tool-master/src/Examples/JSONFormater.php"
    42 => string (86) "/Users/user/Documents/PHP-parsing-tool-master/src/Examples/BooleanExpressionParser.php"
    43 => string (74) "/Users/user/Documents/PHP-parsing-tool-master/src/ParserAwareInterface.php"
    44 => string (63) "/Users/user/Documents/PHP-parsing-tool-master/src/Exception.php"
    45 => string (72) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/Series.php"
    46 => string (75) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/PEGBranch.php"
    47 => string (96) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/WhitespaceNegativeContextCheck.php"
    48 => string (81) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/BranchInterface.php"
    49 => string (74) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/BaseNode.php"
    50 => string (82) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/PredefinedString.php"
    51 => string (79) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/LeafInterface.php"
    52 => string (71) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/Regex.php"
    53 => string (86) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/BranchExtraCondition.php"
    54 => string (79) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/BranchFactory.php"
    55 => string (79) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/ParameterNode.php"
    56 => string (73) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/AnyText.php"
    57 => string (72) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/Branch.php"
    58 => string (72) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/Choice.php"
    59 => string (82) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/ItemRestrictions.php"
    60 => string (75) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/Decorator.php"
    61 => string (73) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/Numeric.php"
    62 => string (75) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/Lookahead.php"
    63 => string (82) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/ParametrizedNode.php"
    64 => string (87) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/BranchStringCondition.php"
    65 => string (79) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/NodeInterface.php"
    66 => string (88) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/WhitespaceContextCheck.php"
    67 => string (88) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/PredefinedSimpleString.php"
    68 => string (77) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/NaiveBranch.php"
    69 => string (73) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/Unorder.php"
    70 => string (81) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/BranchDecorator.php"
    71 => string (74) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/LeafTime.php"
    72 => string (70) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/Text.php"
    73 => string (71) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/TextS.php"
    74 => string (85) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarNode/ErrorTrackDecorator.php"
    75 => string (67) "/Users/user/Documents/PHP-parsing-tool-master/src/GrammarParser.php"
    76 => string (0) ""
]

然后:

foreach ($filenames as $n=>$f) {

    d($f);

    include_once $f;
    d($f);

}

直到索引为 15 的元素之前,foreach 循环都没有问题。脚本在包含该文件时终止。我知道这一点是因为执行包含之前的 d() 函数,而不是包含之后的 d() 函数。我在命令行上运行了脚本,并在 macOS 10.13.6 上使用了来自 MAMP 4 的 PHP7.2.10。

这是该文件的完整内容:

   <?php

    namespace ParserGenerator\Extension;
    echo "hello in interface";

    interface ExtensionInterface
    {
        function extendGrammar($grammarGrammar);

        function modifyBranches($grammar, $parsedGrammar, $grammarParser, $options);

        function createGrammarBranch($grammar, $grammarBranch, $grammarParser, $options);

        function fillGrammarBranch($grammar, $grammarBranch, $grammarParser, $options);

        function buildSequenceItem(&$grammar, $sequenceItem, $grammarParser, $options);

        function buildSequence($grammar, $rule, $grammarParser, $options);
    }

    echo "hello in interface 2";

回显“界面中的你好”后脚本终止。“接口 2 中的你好”从未得到回应。

奇怪的是,即使我的 php.ini 文件已经设置为 error_reporting=E_ALL 和 display_errors=On,也没有任何关于脚本终止的信息被转储到我的终端。没有解析错误,致命错误等。

有什么问题,如何让脚本一直执行到最后?抱歉,但我在命名空间和接口上遗漏了什么吗?

标签: phpreflectioninclude

解决方案


推荐阅读