php - 在 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,也没有任何关于脚本终止的信息被转储到我的终端。没有解析错误,致命错误等。
有什么问题,如何让脚本一直执行到最后?抱歉,但我在命名空间和接口上遗漏了什么吗?
解决方案
推荐阅读
- asp.net-core - web.config 在 DevOps drop 中被替换为默认值
- java - JNDI - 如何使用嵌入在 JAR、WAR 或 EAR 中的文件在提供程序 URL 中使用?
- python - 尝试从 Windows cmd 执行简单的 HelloWorld.py 文件时遇到问题
- assembly - CF 标志的难以理解的行为
- vba - 如果单元格等于特定值,则复制 Excel 行
- google-chrome - GC 更新到 87.0.4280.66 后 localhost 中的 ERR_CONNECTION_REFUSED
- javascript - Custom login page with OKTA and Angular 10
- c - 当我尝试使用 char 数组或指针时,c++ fopen() 返回一个 NULL 指针
- php - 如何通过 cUrl 登录 Instagram?
- python - 从 flask-socketio 向特定客户端发送消息