(php_tag) @tag
"?>" @tag

; Types

(primitive_type) @type.builtin
(cast_type) @type.builtin
(named_type (name) @type) @type
(named_type (qualified_name) @type) @type

(namespace_definition
  name: (namespace_name (name) @namespace))

; Superglobals
(subscript_expression
  (variable_name(name) @constant.builtin
    (#match? @constant.builtin "^_?[A-Z][A-Z\\d_]+$")))

; Functions

(array_creation_expression "array" @function.builtin)
(list_literal "list" @function.builtin)

(method_declaration
  name: (name) @function.method)

(function_call_expression
  function: (_) @function)

(scoped_call_expression
  name: (name) @function)

(member_call_expression
  name: (name) @function.method)

(function_definition
  name: (name) @function)


; Member

(property_element
  (variable_name) @variable.other.member)

(member_access_expression
  name: (variable_name (name)) @variable.other.member)
(member_access_expression
  name: (name) @variable.other.member)

; Variables

(relative_scope) @variable.builtin

((name) @constant
 (#match? @constant "^_?[A-Z][A-Z\\d_]+$"))

((name) @constructor
 (#match? @constructor "^[A-Z]"))

((name) @variable.builtin
 (#eq? @variable.builtin "this"))

(variable_name) @variable

; Basic tokens

(string) @string
(heredoc) @string
(boolean) @constant.builtin.boolean
(null) @constant.builtin
(integer) @constant.numeric.integer
(float) @constant.numeric.float
(comment) @comment

"$" @operator

; Keywords

[
  "abstract" 
  "as" 
  "break" 
  "case" 
  "catch" 
  "class" 
  "const" 
  "continue" 
  "declare" 
  "default" 
  "do" 
  "echo" 
  "else" 
  "elseif" 
  "enddeclare" 
  "endforeach" 
  "endif" 
  "endswitch" 
  "endwhile" 
  "enum" 
  "extends" 
  "final" 
  "finally" 
  "foreach" 
  "fn" 
  "function" 
  "global" 
  "if" 
  "implements" 
  "include_once" 
  "include" 
  "insteadof" 
  "interface" 
  "match" 
  "namespace" 
  "new" 
  "private" 
  "protected" 
  "public" 
  "require_once" 
  "require" 
  "return" 
  "static" 
  "switch" 
  "throw" 
  "trait" 
  "try" 
  "use" 
  "while" 
] @keyword