annotate vendor/nikic/php-parser/UPGRADE-2.0.md @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 4c8ae668cc8c
children
rev   line source
Chris@0 1 Upgrading from PHP-Parser 1.x to 2.0
Chris@0 2 ====================================
Chris@0 3
Chris@0 4 ### PHP version requirements
Chris@0 5
Chris@0 6 PHP-Parser now requires PHP 5.4 or newer to run. It is however still possible to *parse* PHP 5.2 and
Chris@0 7 PHP 5.3 source code, while running on a newer version.
Chris@0 8
Chris@0 9 ### Creating a parser instance
Chris@0 10
Chris@0 11 Parser instances should now be created through the `ParserFactory`. Old direct instantiation code
Chris@0 12 will not work, because the parser class was renamed.
Chris@0 13
Chris@0 14 Old:
Chris@0 15
Chris@0 16 ```php
Chris@0 17 use PhpParser\Parser, PhpParser\Lexer;
Chris@0 18 $parser = new Parser(new Lexer\Emulative);
Chris@0 19 ```
Chris@0 20
Chris@0 21 New:
Chris@0 22
Chris@0 23 ```php
Chris@0 24 use PhpParser\ParserFactory;
Chris@0 25 $parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
Chris@0 26 ```
Chris@0 27
Chris@0 28 The first argument to `ParserFactory` determines how different PHP versions are handled. The
Chris@0 29 possible values are:
Chris@0 30
Chris@0 31 * `ParserFactory::PREFER_PHP7`: Try to parse code as PHP 7. If this fails, try to parse it as PHP 5.
Chris@0 32 * `ParserFactory::PREFER_PHP5`: Try to parse code as PHP 5. If this fails, try to parse it as PHP 7.
Chris@0 33 * `ParserFactory::ONLY_PHP7`: Parse code as PHP 7.
Chris@0 34 * `ParserFactory::ONLY_PHP5`: Parse code as PHP 5.
Chris@0 35
Chris@0 36 For most practical purposes the difference between `PREFER_PHP7` and `PREFER_PHP5` is mainly whether
Chris@0 37 a scalar type hint like `string` will be stored as `'string'` (PHP 7) or as `new Name('string')`
Chris@0 38 (PHP 5).
Chris@0 39
Chris@0 40 To use a custom lexer, pass it as the second argument to the `create()` method:
Chris@0 41
Chris@0 42 ```php
Chris@0 43 use PhpParser\ParserFactory;
Chris@0 44 $lexer = new MyLexer;
Chris@0 45 $parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7, $lexer);
Chris@0 46 ```
Chris@0 47
Chris@0 48 ### Rename of the `PhpParser\Parser` class
Chris@0 49
Chris@0 50 `PhpParser\Parser` is now an interface, which is implemented by `Parser\Php5`, `Parser\Php7` and
Chris@0 51 `Parser\Multiple`. Parser tokens are now defined in `Parser\Tokens`. If you use the `ParserFactory`
Chris@0 52 described above to create your parser instance, these changes should have no further impact on you.
Chris@0 53
Chris@0 54 ### Removal of legacy aliases
Chris@0 55
Chris@0 56 All legacy aliases for classes have been removed. This includes the old non-namespaced `PHPParser_`
Chris@0 57 classes, as well as the classes that had to be renamed for PHP 7 support.
Chris@0 58
Chris@0 59 ### Deprecations
Chris@0 60
Chris@0 61 The `set()`, `setFirst()`, `append()` and `prepend()` methods of the `Node\Name` class have been
Chris@0 62 deprecated. Instead `Name::concat()` and `Name->slice()` should be used.
Chris@0 63
Chris@0 64 ### Miscellaneous
Chris@0 65
Chris@0 66 * The `NodeTraverser` no longer clones nodes by default. If you want to restore the old behavior,
Chris@0 67 pass `true` to the constructor.
Chris@0 68 * The legacy node format has been removed. If you use custom nodes, they are now expected to
Chris@0 69 implement a `getSubNodeNames()` method.
Chris@0 70 * The default value for `Scalar` node constructors was removed. This means that something like
Chris@0 71 `new LNumber()` should be replaced by `new LNumber(0)`.
Chris@0 72 * String parts of encapsed strings are now represented using `Scalar\EncapsStringPart` nodes, while
Chris@0 73 previously raw strings were used. This affects the `parts` child of `Scalar\Encaps` and
Chris@0 74 `Expr\ShellExec`.