// SYNTAX TEST "Packages/PHP/PHP.sublime-syntax" $arr['key']['key2'] // ^ meta.item-access punctuation.section.brackets.begin.php // ^^^^^ meta.item-access.arguments // ^ meta.item-access punctuation.section.brackets.end.php // ^ meta.item-access.php punctuation.section.brackets.begin.php // ^^^^^^ meta.item-access.arguments // ^ meta.item-access punctuation.section.brackets.end.php ]; $array[ ]; // ^^^^ meta.item-access // ^ punctuation.section.brackets.begin.php // ^ punctuation.section.brackets.end.php $var->meth()[10]; // ^^^^ meta.item-access // ^ punctuation.section.brackets.begin.php // ^ punctuation.section.brackets.end.php /** No longer a phpdoc comment since no leading * * @return // ^ comment.block - keyword.other.phpdoc */ // ^ source - comment.block /** * @return // ^ keyword.other.phpdoc */ /* No phpdoc highlight since there are not two * after the opening / * @return // ^ comment.block - keyword.other.phpdoc */ class Test1 extends stdClass implements Countable {} // ^ storage.type.class.php // ^ entity.name.class.php // ^ storage.modifier.extends.php // ^^^^^^^^ meta.path // ^ entity.other.inherited-class.php // ^ storage.modifier.implements.php // ^^^^^^^^^ meta.path // ^ entity.other.inherited-class.php class ClassName extends /* */ \MyNamespace\Foo implements \MyNamespace\Baz { // ^ entity.name.class // ^ storage.modifier // ^ comment.block // ^^^^^^^^^^^^^^^^ meta.path // ^^^^^^^^^^^^^^^^ entity.other.inherited-class // ^ punctuation.separator.namespace // ^ punctuation.separator.namespace // ^ storage.modifier // ^^^^^^^^^^^^^^^^ meta.path // ^^^^^^^^^^^^^^^^ entity.other.inherited-class // ^ punctuation.separator.namespace // ^ punctuation.separator.namespace } interface MyInter {} // <- storage.type // ^ entity.name.interface interface MyInter2 extends \MyNamespace\Foo { // <- storage.type // ^ entity.name.interface // ^ storage.modifier // ^^^^^^^^^^^^^^^^ meta.path // ^^^^^^^^^^^^^^^^ entity.other.inherited-class // ^ punctuation.separator.namespace // ^ punctuation.separator.namespace } if ($foo instanceof \Mynamespace\ClassName) { // ^ variable.other // ^ keyword.operator // ^^^^^^^^^^^^^^^^^^^^^^ meta.path // ^ punctuation.separator.namespace // ^ support.other.namespace // ^ punctuation.separator.namespace // ^^^^^^^^^ support.class } $var = new \MyNamespce\ClassName(); // <- variable.other // ^ keyword.other // ^^^^^^^^^^^^^^^^^^^^^ meta.path // ^ punctuation.separator.namespace // ^ support.other.namespace // ^ punctuation.separator.namespace // ^ support.class \MyNamespace\Foo::BAR; // <- punctuation.separator.namespace // <- support.other.namespace //^^^^^^^^^^^^^^ meta.path // ^ punctuation.separator.namespace // ^ support.class // ^^ punctuation.accessor // ^^^ constant.other \MyNamespace\Foo::bar(); // <- punctuation.separator.namespace // <- support.other.namespace //^^^^^^^^^^^^^^ meta.path // ^ punctuation.separator.namespace // ^^^ support.class // ^^ punctuation.accessor // ^^^^^ meta.function-call // ^^^ variable.function // ^^ meta.group // ^ punctuation.section.group.begin // ^ punctuation.section.group.end \MyNamespace\Foo(); //^^^^^^^^^^^^^^^^ meta.function-call // <- punctuation.separator.namespace // <- support.other.namespace //^^^^^^^^^^^^^^ meta.path // ^ punctuation.separator.namespace // ^^^ variable.function // ^^ meta.group // ^ punctuation.section.group.begin // ^ punctuation.section.group.end \MyNamespace\Foo; // <- punctuation.separator.namespace // <- support.other.namespace //^^^^^^^^^^^^^^ meta.path // ^ punctuation.separator.namespace // ^ constant.other func_call(true, 1, "string"); //^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.function-call // ^ - meta.function-call //^^^^^^^ variable.function // ^^^^^^^^^^^^^^^^^^^ meta.group // ^ - meta.group // ^ punctuation.section.group.begin // ^ punctuation.section.group.end // ^^^^ constant.language // ^ punctuation.separator.php // ^ constant.numeric // ^ punctuation.separator.php // ^^^^^^^^ string.quoted.double $object->method(func_call()); // ^^^^^^^^^^^^^^^^^^^^^ meta.function-call // ^^^^^^ variable.function // ^^^^^^^^^^^^^ meta.group // ^^^^^^^^^^^ meta.function-call meta.function-call // ^^^^^^^^^ variable.function // ^^ meta.group meta.group strval($foo); //^^^^^^^^^^ meta.function-call //^^^^ support.function.var - variable.function // ^^^^^^ meta.group $test = new Test1; // ^ keyword.other.new.php // ^^^^^ meta.path // ^ support.class.php $anon = new class{}; // ^^^^^^^^^^^ meta.class // ^ keyword.other.new.php // ^ storage.type.class.php // ^^ meta.block.php // ^ punctuation.section.block.php - meta.class meta.class // ^ punctuation.section.block.php $anon = new class extends Test1 implements Countable {}; // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.class - meta.class meta.class // ^ keyword.other.new.php // ^ storage.type.class.php // ^ storage.modifier.extends.php // ^^^^^ meta.path // ^ entity.other.inherited-class.php // ^ storage.modifier.implements.php // ^^^^^^^^^ meta.path // ^ entity.other.inherited-class.php // ^^ meta.block.php function noReturnType(array $param1, int $param2) {} // ^ storage.type.function.php // ^ entity.name.function.php // ^ punctuation.section.group.begin.php // ^ meta.function.parameters // ^ punctuation.definition.variable.php // ^ meta.function.parameters // ^ punctuation.definition.variable.php // ^ punctuation.section.group.end.php // ^^ meta.block.php // ^ punctuation.section.block.begin.php // ^ punctuation.section.block.end.php function scalarReturnType($param1): bool {} // ^ storage.type.function.php // ^ entity.name.function.php // ^ punctuation.section.group.begin.php // ^ punctuation.section.group.end.php // ^ storage.type.php function classReturnType($param1): stringSpace\Test1 {} // ^ storage.type.function.php // ^ entity.name.function.php // ^ punctuation.section.group.begin.php // ^ punctuation.section.group.end.php // ^^^^^^^^^^^^^^^^^ meta.path // ^ support.other.namespace.php // ^ support.class.php $test = "\0 \12 \345g \x0f \u{a} \u{9999} \u{999}"; // ^^ constant.character.escape.octal.php // ^^^ constant.character.escape.octal.php // ^^^^ constant.character.escape.octal.php // ^ meta.string-contents.quoted.double.php // ^^^^ constant.character.escape.hex.php // ^^^^^ constant.character.escape.unicodepoint.php // ^^^^^^^^ constant.character.escape.unicodepoint.php // ^^^^^^^ meta.string-contents.quoted.double.php "$a then $b->c or ${d} with {$e} then $f[0] followed by $g[$h] or $i[k] and finally {$l . $m->n . o}" // <- variable.other punctuation.definition.variable //^ variable.other // ^^ variable.other // ^ punctuation.definition.variable // ^^ punctuation.accessor // ^ variable.other.member // ^^^^ variable.other // ^^ punctuation.definition.variable // ^ punctuation.definition.variable // ^ punctuation.definition.expression // ^^ variable.other // ^ punctuation.definition.variable // ^ punctuation.definition.expression // ^^ variable.other // ^ punctuation.definition.variable // ^ punctuation.section.brackets.begin // ^ constant.numeric // ^ punctuation.section.brackets.end // ^^ variable.other // ^ punctuation.definition.variable // ^ punctuation.section.brackets.begin // ^^ variable.other // ^ punctuation.definition.variable // ^ punctuation.section.brackets.end // ^^ variable.other // ^ punctuation.definition.variable // ^ punctuation.section.brackets.begin // ^ constant.other // ^ punctuation.section.brackets.end // ^ punctuation.definition.expression // ^^ variable.other // ^ punctuation.definition.variable // ^ keyword.operator // ^^ variable.other // ^ punctuation.definition.variable // ^^ punctuation.accessor // ^ variable.other.member // ^ keyword.operator // ^ constant.other `$a then $b->c or ${d} with {$e} then $f[0] followed by $g[$h] or $i[k] and finally {$l . $m->n . o}` // <- variable.other punctuation.definition.variable //^ variable.other // ^^ variable.other // ^ punctuation.definition.variable // ^^ punctuation.accessor // ^ variable.other.member // ^^^^ variable.other // ^^ punctuation.definition.variable // ^ punctuation.definition.variable // ^ punctuation.definition.expression // ^^ variable.other // ^ punctuation.definition.variable // ^ punctuation.definition.expression // ^^ variable.other // ^ punctuation.definition.variable // ^ punctuation.section.brackets.begin // ^ constant.numeric // ^ punctuation.section.brackets.end // ^^ variable.other // ^ punctuation.definition.variable // ^ punctuation.section.brackets.begin // ^^ variable.other // ^ punctuation.definition.variable // ^ punctuation.section.brackets.end // ^^ variable.other // ^ punctuation.definition.variable // ^ punctuation.section.brackets.begin // ^ constant.other // ^ punctuation.section.brackets.end // ^ punctuation.definition.expression // ^^ variable.other // ^ punctuation.definition.variable // ^ keyword.operator // ^^ variable.other // ^ punctuation.definition.variable // ^^ punctuation.accessor // ^ variable.other.member // ^ keyword.operator // ^ constant.other trait A // ^ storage.type.trait // ^ entity.name.trait { } class B // ^ entity.name.class { use MyNamespace\Xyz, // ^^^^^^^^^^^^^^^^^^^^ meta.use // ^^^^^^^^^^^^^^^ meta.path // ^^^^^^^^^^^^^^^ entity.other.inherited-class // ^ punctuation.separator.namespace Y, // ^ meta.use meta.path entity.other.inherited-class Z { // ^^^ meta.use // ^ meta.path // ^ meta.block punctuation.section.block X::method1 as another1; // ^^^^^^^^^^^^^^^^^^^^^^^ meta.use meta.block // ^^ punctuation.accessor // ^ keyword.other.use-as Y::method2 insteadof X; // ^ keyword.other.insteadof X::method2 as another2; // ^ keyword.other.use-as } protected $pro1; // ^ meta.use meta.block punctuation.section.block // ^ - meta.use // ^ storage.modifier public function abc(callable $var, int $var2, string $var3) // ^^^ entity.name.function // ^ storage.type // ^ storage.type // ^ storage.type { echo B::class; // ^ constant.class parent::abc($var, $var2, $var3); // ^^^^^^ variable.language // ^^ punctuation.accessor $this->undo(); // ^^^^^ variable.language // ^ punctuation.definition.variable $var2 = 'test'; // ^^^^^ variable.other // ^ punctuation.definition.variable return new self(); // ^^^^ variable.language } } try { // <- keyword.control.exception echo inverse(5) . "\n"; throw new \Exception('Error!'); // ^ keyword.control.exception // ^^^^^^^^^^ meta.path.php // ^ punctuation.separator.namespace.php - support.class // ^^^^^^^^^ support.class throw new \Custom\Exception('Error!'); // ^ keyword.control.exception // ^^^^^^^^^^^^^^^^^ meta.path.php // ^ punctuation.separator.namespace.php // ^^^^^^ support.other.namespace.php // ^ punctuation.separator.namespace.php // ^^^^^^^^^ support.class } catch (Exception $e) { //^ keyword.control.exception // ^^^^^^^^^ meta.path.php // ^^^^^^^^^ support.class.exception.php // ^^ variable.other.php echo 'Caught exception: ', $e->getMessage(), "\n"; } catch (\Exception $e) { //^ keyword.control.exception // ^^^^^^^^^^ meta.path.php // ^ punctuation.separator.namespace.php // ^^^^^^^^^ support.class.exception.php // ^^ variable.other.php echo 'Caught exception: ', $e->getMessage(), "\n"; } catch (\Custom\Exception $e) { //^ keyword.control.exception // ^^^^^^^^^^^^^^^^^ meta.path.php // ^ punctuation.separator.namespace.php // ^^^^^^ support.other.namespace.php // ^ punctuation.separator.namespace.php // ^^^^^^^^^ support.class.exception.php // ^^ variable.other.php echo 'Caught exception: ', $e->getMessage(), "\n"; } finally { //^ keyword.control.exception echo "First finally.\n"; } function generate() { yield 1; // ^ keyword.control } $var = 0; // ^ constant.numeric $var2 = -123.456e10; // ^^^^^^^^^^ constant.numeric $var3 = 0x0f; // ^^^^ constant.numeric $var4 = 0b0111; // ^^^^^^ constant.numeric foo_bar: //^^^^^^^ entity.name.label.php - keyword.control.php if (): else: // <- keyword.control - entity.name.label endif; switch (1) { //^ keyword.control case 1: //^^^^ keyword.control.php - entity.name.label.php default: //^^^^^^^ keyword.control.php - entity.name.label.php } $non_sql = "NO SELECT HIGHLIGHTING!"; // ^ string.quoted.double punctuation.definition.string.begin - meta.string-contents // ^^^^^^^^^^^^^^^^^^^^^^^ meta.string-contents // ^ - source.sql // ^ string.quoted.double punctuation.definition.string.end - meta.string-contents $sql = "CREATE TABLE version"; // ^^^^^^ keyword.other.create.sql $sql = " CREATE TABLE `version`... // ^^^^^^ keyword.other.create.sql "; $sql = "SELECT * FROM users WHERE first_name = 'Eric'"; // ^ string.quoted.double punctuation.definition.string.begin - meta.string-contents // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.string-contents source.sql // ^ keyword.other.DML // ^^^^^^ string.quoted.single.sql // ^ string.quoted.double punctuation.definition.string.end - meta.string-contents // Ensure we properly exist from SQL when hitting PHP end-of-string $sql = "SELECT * FROM users WHERE first_name = 'Eric"; // ^ string.quoted.double punctuation.definition.string.begin - meta.string-contents // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.string-contents source.sql // ^ keyword.other.DML // ^^^^^ string.quoted.single.sql // ^ string.quoted.double punctuation.definition.string.end - meta.string-contents $sql = " SELECT * FROM users WHERE first_name = 'Eric' //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.string-contents source.sql // ^ keyword.other.DML // ^^^^^^ string.quoted.single.sql "; // <- string.quoted.double punctuation.definition.string.end - meta.string-contents $non_sql = 'NO SELECT HIGHLIGHTING!'; // ^ string.quoted.single punctuation.definition.string.begin - meta.string-contents // ^^^^^^^^^^^^^^^^^^^^^^^ meta.string-contents // ^ - source.sql // ^ string.quoted.single punctuation.definition.string.end - meta.string-contents $sql = 'SELECT * FROM users WHERE first_name = \'Eric\''; // ^ string.quoted.single punctuation.definition.string.begin - meta.string-contents // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.string-contents source.sql // ^ keyword.other.DML // ^^ constant.character.escape.php // ^ string.quoted.single punctuation.definition.string.end - meta.string-contents $sql = ' SELECT * FROM users WHERE first_name = \'Eric\' //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.string-contents source.sql // ^ keyword.other.DML // ^^ constant.character.escape.php '; // <- string.quoted.single punctuation.definition.string.end - meta.string-contents preg_replace('/(foo|bar)a{1,4}[a-z]*\'\n/m'); // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.regexp.single-quoted // ^ keyword.operator preg_replace("/(foo|bar)a{1,4}[a-z]*\'\n/m"); // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.regexp.double-quoted // ^ keyword.operator echo << //^^^^^^^^^^^^^^^^^^^^^^^^^ meta.embedded.html text.html // <- punctuation.definition.tag.begin //^^ entity.name.tag.block // ^^^^^ entity.other.attribute-name // ^^^^^^^^^ string.quoted.double HTML; // <- punctuation.section.embedded.end keyword.operator.heredoc echo <<< JAVASCRIPT // ^^^^^^^^^^^^^^ punctuation.section.embedded.begin punctuation.definition.string // ^^^^^^^^^^ keyword.operator.heredoc var foo = 1; //^^^^^^^^^^ meta.embedded.js source.js // <- storage.type // ^^^ variable.other.readwrite // ^ constant.numeric $var // <- variable.other.php //^^ variable.other.php JAVASCRIPT; // <- punctuation.section.embedded.end keyword.operator.heredoc echo << // ^^ punctuation.section.embedded.end // ^^^^^^ meta.tag - source.php // ^^ punctuation.section.embedded.end - source.php // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.tag // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - source.php // ^^^^^ meta.attribute-with-value // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.embedded.line.nested.php // ^^^^^^^^^^^^^^^^^^ - source.php // ^^^^^ punctuation.section.embedded.begin - source.php // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.php // ^^ punctuation.section.embedded.end - source.php // ^^^^^^^^^ meta.attribute-with-value // ^ punctuation.definition.string.begin.html // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.quoted.double.html // ^ punctuation.definition.string.end.html // ^^ punctuation.section.embedded.end - source.php // ^^ punctuation.section.embedded.end - source.php // ^^^^^^ meta.tag - source.php
// ^^^^^^^^^^^ meta.tag - source.php
// ^^^^^^^^^^^ meta.tag - source.php // ^^ punctuation.section.embedded.end - source.php // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.tag // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - source.php // ^^^^^ meta.attribute-with-value // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.embedded.line.nested.php // ^^^^^^^^^^^^^^^^^^ - source.php // ^^^^^ punctuation.section.embedded.begin // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.php // ^^ punctuation.section.embedded.end // ^^^^^^^^^ meta.attribute-with-value // ^ punctuation.definition.string.begin.html // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.quoted.double.html // ^ punctuation.definition.string.end.html // ^^ punctuation.section.embedded.end
// ^^^^^ meta.tag - source.php
prop = $val; } public function __debugInfo() { // ^^^^^^^^^^^ entity.name.function.php support.function.magic.php return [ 'propSquared' => $this->prop ** 2, ]; } public function __toString() // ^^^^^^^^^^ entity.name.function.php support.function.magic.php // ^^ meta.function.parameters.php punctuation.section.group { return $this->prop; } public function __toStringTest() // ^^^^^^^^^^^^^^ entity.name.function.php - support.function.magic.php // ^^ - entity.name.function.php - support.function.magic.php { return $this->prop; } public function __test() // ^^^^^^ entity.name.function.php - support.function.magic.php { } } var_dump(new C(42)); // ^ meta.path support.class ?>
// ^^^^^^^^^^^^^^^^^^^^^^^^ meta.attribute-with-value.class.html // ^ punctuation.definition.string.begin.html // ^^^^^^^^^^^^^^^^^^ string.quoted.double.html // ^ punctuation.definition.string.end.html // ^^^^^^^^^^^ meta.embedded.line // ^^^ punctuation.section.embedded.begin - source.php // ^^^^^^ source.php // ^^^^ variable.other // ^^ punctuation.section.embedded.end - source.php // ^ punctuation.definition.tag.end.html