1 Upgrading from PHP-Parser 3.x to 4.0
2 ====================================
4 ### PHP version requirements
6 PHP-Parser now requires PHP 7.0 or newer to run. It is however still possible to *parse* PHP 5.2-5.6
7 source code, while running on a newer version.
9 HHVM is no longer actively supported.
11 ### Changes to the node structure
13 * Many subnodes that previously held simple strings now store `Identifier` nodes instead (or
14 `VarLikeIdentifier` nodes if they have form `$ident`). The constructors of the affected nodes will
15 automatically convert strings to `Identifier`s and `Identifier`s implement `__toString()`. As such
16 some code continues to work without changes, but anything using `is_string()`, type-strict
17 comparisons or strict-mode may require adjustment. The following is an exhaustive list of all
21 * `NullableType::$type` (for simple types)
22 * `Param::$type` (for simple types)
23 * `Expr\ClassConstFetch::$name`
24 * `Expr\Closure::$returnType` (for simple types)
25 * `Expr\MethodCall::$name`
26 * `Expr\PropertyFetch::$name`
27 * `Expr\StaticCall::$name`
28 * `Expr\StaticPropertyFetch::$name` (uses `VarLikeIdentifier`)
29 * `Stmt\Class_::$name`
30 * `Stmt\ClassMethod::$name`
31 * `Stmt\ClassMethod::$returnType` (for simple types)
32 * `Stmt\Function::$name`
33 * `Stmt\Function::$returnType` (for simple types)
35 * `Stmt\Interface_::$name`
37 * `Stmt\PropertyProperty::$name` (uses `VarLikeIdentifier`)
38 * `Stmt\TraitUseAdaptation\Alias::$method`
39 * `Stmt\TraitUseAdaptation\Alias::$newName`
40 * `Stmt\TraitUseAdaptation\Precedence::$method`
41 * `Stmt\Trait_::$name`
42 * `Stmt\UseUse::$alias`
44 * Expression statements (`expr;`) are now represented using a `Stmt\Expression` node. Previously
45 these statements were directly represented as their constituent expression.
46 * The `name` subnode of `Param` has been renamed to `var` and now contains a `Variable` rather than
48 * The `name` subnode of `StaticVar` has been renamed to `var` and now contains a `Variable` rather
50 * The `var` subnode of `ClosureUse` now contains a `Variable` rather than a plain string.
51 * The `var` subnode of `Catch` now contains a `Variable` rather than a plain string.
52 * The `alias` subnode of `UseUse` is now `null` if no explicit alias is given. As such,
53 `use Foo\Bar` and `use Foo\Bar as Bar` are now represented differently. The `getAlias()` method
54 can be used to get the effective alias, even if it is not explicitly given.
58 * The indentation handling in the pretty printer has been changed (this is only relevant if you
59 extend the pretty printer). Previously indentation was automatic, and parts were excluded using
60 `pNoindent()`. Now no-indent is the default and newlines that require indentation should use
63 ### Removed functionality
65 * Removed `type` subnode on `Class`, `ClassMethod` and `Property` nodes. Use `flags` instead.
66 * The `ClassConst::isStatic()` method has been removed. Constants cannot have a static modifier.
67 * The `NodeTraverser` no longer accepts `false` as a return value from a `leaveNode()` method.
68 `NodeTraverser::REMOVE_NODE` should be returned instead.
69 * The `Node::setLine()` method has been removed. If you really need to, you can use `setAttribute()`
71 * The misspelled `Class_::VISIBILITY_MODIFER_MASK` constant has been dropped in favor of
72 `Class_::VISIBILITY_MODIFIER_MASK`.
73 * The XML serializer has been removed. As such, the classes `Serializer\XML`, and
74 `Unserializer\XML`, as well as the interfaces `Serializer` and `Unserializer` no longer exist.
75 * The `BuilderAbstract` class has been removed. It's functionality is moved into `BuilderHelpers`.
76 However, this is an internal class and should not be used directly.
77 * The `Autoloader` class has been removed in favor of relying on the Composer autoloader.