This is a new major version of the PHP-Parser library. The biggest new feature in this release is an experimental pretty-printing mode, which preserves formatting for parts of the code which have not been modified. As such, it should now be much easier to use PHP-Parser for automated code refactorings. See the pretty printer documentation for information on how to use this functionality
The following changelog lists all significant changes relative to PHP-Parser 3.1. For more information on backwards incompatible changes, please see the upgrading guide.
Added
- Added experimental support for format-preserving pretty-printing. In this mode formatting will be preserved for parts of the code which have not been modified.
- Added
replaceNodes
option toNameResolver
, defaulting to true. If this option is disabled, resolved names will be added asresolvedName
attributes, instead of replacing the original names. - Added
NodeFinder
class, which can be used to find nodes based on a callback or class name. This is a utility to avoid custom node visitor implementations for simple search operations. - Added
ClassMethod::isMagic()
method. - Added
BuilderFactory
methods:val()
method for creating an AST for a simple value,concat()
for creating concatenation trees,args()
for preparing function arguments. - Added
NameContext
class, which encapsulates theNameResolver
logic independently of the actual AST traversal. This facilitates use in other context, such as class names in doc comments. Additionally it provides an API for getting the shortest representation of a name. - Added
Node::setAttributes()
method. - Added
JsonDecoder
. This allows conversion JSON back into an AST. - Added
Name
methodstoLowerString()
andisSpecialClassName()
. - Added
Identifier
andVarLikeIdentifier
nodes, which are used in place of simple strings in many places. - Added
getComments()
,getStartLine()
,getEndLine()
,getStartTokenPos()
,getEndTokenPos()
,getStartFilePos()
andgetEndFilePos()
methods toNode
. These provide a more obvious access point for the already existing attributes of the same name. - Added
ConstExprEvaluator
to evaluate constant expressions to PHP values. - Added
Expr\BinaryOp::getOperatorSigil()
, returning+
forExpr\BinaryOp\Plus
, etc. - Added start token offsets to comments.
Changed
- Many subnodes that previously held simple strings now use
Identifier
(orVarLikeIdentifier
) nodes. Please see the UPGRADE-4.0 file for an exhaustive list of affected nodes and some notes on possible impact. - Expression statements (
expr;
) are now represented using aStmt\Expression
node. Previously these statements were directly represented as their constituent expression. - The
name
subnode ofParam
has been renamed tovar
and now contains aVariable
rather than a plain string. - The
name
subnode ofStaticVar
has been renamed tovar
and now contains aVariable
rather than a plain string. - The
var
subnode ofClosureUse
now contains aVariable
rather than a plain string. - The
var
subnode ofCatch
now contains aVariable
rather than a plain string. - The
alias
subnode ofUseUse
is nownull
if no explicit alias is given. As such,use Foo\Bar
anduse Foo\Bar as Bar
are now represented differently. ThegetAlias()
method can be used to get the effective alias, even if it is not explicitly given.
Removed
- Support for running on PHP 5 and HHVM has been removed. You can however still parse code of old PHP versions (such as PHP 5.2), while running on PHP 7.
- Removed
type
subnode onClass
,ClassMethod
andProperty
nodes. Useflags
instead. - The
ClassConst::isStatic()
method has been removed. Constants cannot have a static modifier. - The
NodeTraverser
no longer acceptsfalse
as a return value from aleaveNode()
method.NodeTraverser::REMOVE_NODE
should be returned instead. - The
Node::setLine()
method has been removed. If you really need to, you can usesetAttribute()
instead. - The misspelled
Class_::VISIBILITY_MODIFER_MASK
constant has been dropped in favor ofClass_::VISIBILITY_MODIFIER_MASK
. - The XML serializer has been removed. As such, the classes
Serializer\XML
, andUnserializer\XML
, as well as the interfacesSerializer
andUnserializer
no longer exist. - The
BuilderAbstract
class has been removed. It's functionality is moved intoBuilderHelpers
. However, this is an internal class and should not be used directly. - The
Autoloader
class has been removed. It is now required to use the Composer autoloader.