Включение файла с пространством имен в PHP неожиданно завершает работу сценария, даже если это include_once - PullRequest
0 голосов
/ 30 января 2020

Я начал с попытки включить каждый файл в проект 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 dumps (прошу прощения за пользовательский формат, поставляемый с 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);

}

У foreach l oop нет проблем до элемента с индексом 15. Сценарий завершается при включении этого файла. Я знаю это, потому что функция d () до включения была выполнена, но не функция d () после включения. Я запустил скрипт в командной строке и использовал PHP7 .2.10 из MAMP 4 в macOS 10.13.6.

Это полное содержимое этого файла:

   <?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, никакой информации о завершении скрипта нет что бы ни было сброшено в мой терминал. Нет ошибки синтаксического анализа, фатальная ошибка и т. Д. c.

В чем проблема и как заставить скрипт выполнить весь процесс до конца? Извините, но я что-то упустил в пространствах имен и интерфейсах?

...