-
-
Save beberlei/a2aba25b7f8356a80db4d3f114182ffc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/Zend/tests/attributes/001_placement.phpt b/Zend/tests/attributes/001_placement.phpt | |
index cf7bcd4504..7de2210460 100644 | |
--- a/Zend/tests/attributes/001_placement.phpt | |
+++ b/Zend/tests/attributes/001_placement.phpt | |
@@ -3,27 +3,27 @@ Attributes can be placed on all supported elements. | |
--FILE-- | |
<?php | |
-<<A1(1)>> | |
+#[A1(1)] | |
class Foo | |
{ | |
- <<A1(2)>> | |
+ #[A1(2)] | |
public const FOO = 'foo'; | |
- | |
- <<A1(3)>> | |
+ | |
+ #[A1(3)] | |
public $x; | |
- | |
- <<A1(4)>> | |
- public function foo(<<A1(5)>> $a, <<A1(6)>> $b) { } | |
+ | |
+ #[A1(4)] | |
+ public function foo(#[A1(5)] $a, #[A1(6)] $b) { } | |
} | |
-$object = new <<A1(7)>> class () { }; | |
+$object = new #[A1(7)] class () { }; | |
-<<A1(8)>> | |
+#[A1(8)] | |
function f1() { } | |
-$f2 = <<A1(9)>> function () { }; | |
+$f2 = #[A1(9)] function () { }; | |
-$f3 = <<A1(10)>> fn () => 1; | |
+$f3 = #[A1(10)] fn () => 1; | |
$ref = new \ReflectionClass(Foo::class); | |
@@ -43,11 +43,11 @@ $sources = [ | |
foreach ($sources as $r) { | |
$attr = $r->getAttributes(); | |
var_dump(get_class($r), count($attr)); | |
- | |
+ | |
foreach ($attr as $a) { | |
var_dump($a->getName(), $a->getArguments()); | |
} | |
- | |
+ | |
echo "\n"; | |
} | |
diff --git a/Zend/tests/attributes/002_rfcexample.phpt b/Zend/tests/attributes/002_rfcexample.phpt | |
index 6d1028436d..8a0abf7878 100644 | |
--- a/Zend/tests/attributes/002_rfcexample.phpt | |
+++ b/Zend/tests/attributes/002_rfcexample.phpt | |
@@ -6,7 +6,7 @@ Attributes: Example from Attributes RFC | |
namespace My\Attributes { | |
use Attribute; | |
- <<Attribute>> | |
+ #[Attribute] | |
class SingleArgument { | |
public $argumentValue; | |
@@ -19,7 +19,7 @@ namespace My\Attributes { | |
namespace { | |
use My\Attributes\SingleArgument; | |
- <<SingleArgument("Hello World")>> | |
+ #[SingleArgument("Hello World")] | |
class Foo { | |
} | |
diff --git a/Zend/tests/attributes/003_ast_nodes.phpt b/Zend/tests/attributes/003_ast_nodes.phpt | |
index afdab838f8..0177804dcc 100644 | |
--- a/Zend/tests/attributes/003_ast_nodes.phpt | |
+++ b/Zend/tests/attributes/003_ast_nodes.phpt | |
@@ -5,7 +5,7 @@ Attributes can deal with AST nodes. | |
define('V1', strtoupper(php_sapi_name())); | |
-<<A1([V1 => V1])>> | |
+#[A1([V1 => V1])] | |
class C1 | |
{ | |
public const BAR = 'bar'; | |
@@ -20,7 +20,7 @@ var_dump(count($args), $args[0][V1] === V1); | |
echo "\n"; | |
-<<A1(V1, 1 + 2, C1::class)>> | |
+#[A1(V1, 1 + 2, C1::class)] | |
class C2 { } | |
$ref = new \ReflectionClass(C2::class); | |
@@ -35,7 +35,7 @@ var_dump($args[2] === C1::class); | |
echo "\n"; | |
-<<A1(self::FOO, C1::BAR)>> | |
+#[A1(self::FOO, C1::BAR)] | |
class C3 | |
{ | |
private const FOO = 'foo'; | |
@@ -52,20 +52,20 @@ var_dump($args[1] === C1::BAR); | |
echo "\n"; | |
-<<ExampleWithShift(4 >> 1)>> | |
+#[ExampleWithShift(4 >> 1)] | |
class C4 {} | |
$ref = new \ReflectionClass(C4::class); | |
var_dump($ref->getAttributes()[0]->getArguments()); | |
echo "\n"; | |
-<<Attribute>> | |
+#[Attribute] | |
class C5 | |
{ | |
public function __construct() { } | |
} | |
-$ref = new \ReflectionFunction(<<C5(MissingClass::SOME_CONST)>> function () { }); | |
+$ref = new \ReflectionFunction(#[C5(MissingClass::SOME_CONST)] function () { }); | |
$attr = $ref->getAttributes(); | |
var_dump(count($attr)); | |
diff --git a/Zend/tests/attributes/004_name_resolution.phpt b/Zend/tests/attributes/004_name_resolution.phpt | |
index 30537e2c12..6f266908b5 100644 | |
--- a/Zend/tests/attributes/004_name_resolution.phpt | |
+++ b/Zend/tests/attributes/004_name_resolution.phpt | |
@@ -25,11 +25,11 @@ namespace Foo { | |
use Doctrine\ORM\Mapping as ORM; | |
use Doctrine\ORM\Attributes; | |
- <<Entity("imported class")>> | |
- <<ORM\Entity("imported namespace")>> | |
- <<\Doctrine\ORM\Mapping\Entity("absolute from namespace")>> | |
- <<\Entity("import absolute from global")>> | |
- <<Attributes\Table()>> | |
+ #[Entity("imported class")] | |
+ #[ORM\Entity("imported namespace")] | |
+ #[\Doctrine\ORM\Mapping\Entity("absolute from namespace")] | |
+ #[\Entity("import absolute from global")] | |
+ #[Attributes\Table()] | |
function foo() { | |
} | |
} | |
diff --git a/Zend/tests/attributes/005_objects.phpt b/Zend/tests/attributes/005_objects.phpt | |
index 712ec93bea..206d89fa10 100644 | |
--- a/Zend/tests/attributes/005_objects.phpt | |
+++ b/Zend/tests/attributes/005_objects.phpt | |
@@ -3,7 +3,7 @@ Attributes can be converted into objects. | |
--FILE-- | |
<?php | |
-<<Attribute(Attribute::TARGET_FUNCTION)>> | |
+#[Attribute(Attribute::TARGET_FUNCTION)] | |
class A1 | |
{ | |
public string $name; | |
@@ -16,7 +16,7 @@ class A1 | |
} | |
} | |
-$ref = new \ReflectionFunction(<<A1('test')>> function () { }); | |
+$ref = new \ReflectionFunction(#[A1('test')] function () { }); | |
foreach ($ref->getAttributes() as $attr) { | |
$obj = $attr->newInstance(); | |
@@ -26,7 +26,7 @@ foreach ($ref->getAttributes() as $attr) { | |
echo "\n"; | |
-$ref = new \ReflectionFunction(<<A1>> function () { }); | |
+$ref = new \ReflectionFunction(#[A1] function () { }); | |
try { | |
$ref->getAttributes()[0]->newInstance(); | |
@@ -36,7 +36,7 @@ try { | |
echo "\n"; | |
-$ref = new \ReflectionFunction(<<A1([])>> function () { }); | |
+$ref = new \ReflectionFunction(#[A1([])] function () { }); | |
try { | |
$ref->getAttributes()[0]->newInstance(); | |
@@ -46,7 +46,7 @@ try { | |
echo "\n"; | |
-$ref = new \ReflectionFunction(<<A2>> function () { }); | |
+$ref = new \ReflectionFunction(#[A2] function () { }); | |
try { | |
$ref->getAttributes()[0]->newInstance(); | |
@@ -56,13 +56,13 @@ try { | |
echo "\n"; | |
-<<Attribute>> | |
+#[Attribute] | |
class A3 | |
{ | |
private function __construct() { } | |
} | |
-$ref = new \ReflectionFunction(<<A3>> function () { }); | |
+$ref = new \ReflectionFunction(#[A3] function () { }); | |
try { | |
$ref->getAttributes()[0]->newInstance(); | |
@@ -72,10 +72,10 @@ try { | |
echo "\n"; | |
-<<Attribute>> | |
+#[Attribute] | |
class A4 { } | |
-$ref = new \ReflectionFunction(<<A4(1)>> function () { }); | |
+$ref = new \ReflectionFunction(#[A4(1)] function () { }); | |
try { | |
$ref->getAttributes()[0]->newInstance(); | |
@@ -87,7 +87,7 @@ echo "\n"; | |
class A5 { } | |
-$ref = new \ReflectionFunction(<<A5>> function () { }); | |
+$ref = new \ReflectionFunction(#[A5] function () { }); | |
try { | |
$ref->getAttributes()[0]->newInstance(); | |
diff --git a/Zend/tests/attributes/006_filter.phpt b/Zend/tests/attributes/006_filter.phpt | |
index 49c02d6e35..8da1ec9bde 100644 | |
--- a/Zend/tests/attributes/006_filter.phpt | |
+++ b/Zend/tests/attributes/006_filter.phpt | |
@@ -3,17 +3,17 @@ Attributes can be filtered by name and base type. | |
--FILE-- | |
<?php | |
-$ref = new \ReflectionFunction(<<A1>> <<A2>> function () { }); | |
+$ref = new \ReflectionFunction(#[A1] #[A2] function () { }); | |
$attr = $ref->getAttributes(A3::class); | |
var_dump(count($attr)); | |
-$ref = new \ReflectionFunction(<<A1>> <<A2>> function () { }); | |
+$ref = new \ReflectionFunction(#[A1] #[A2] function () { }); | |
$attr = $ref->getAttributes(A2::class); | |
var_dump(count($attr), $attr[0]->getName()); | |
-$ref = new \ReflectionFunction(<<A1>> <<A2>> <<A2>> function () { }); | |
+$ref = new \ReflectionFunction(#[A1] #[A2] #[A2] function () { }); | |
$attr = $ref->getAttributes(A2::class); | |
var_dump(count($attr), $attr[0]->getName(), $attr[1]->getName()); | |
@@ -25,27 +25,27 @@ class A1 implements Base { } | |
class A2 implements Base { } | |
class A3 extends A2 { } | |
-$ref = new \ReflectionFunction(<<A1>> <<A2>> <<A5>> function () { }); | |
+$ref = new \ReflectionFunction(#[A1] #[A2] #[A5] function () { }); | |
$attr = $ref->getAttributes(\stdClass::class, \ReflectionAttribute::IS_INSTANCEOF); | |
var_dump(count($attr)); | |
print_r(array_map(fn ($a) => $a->getName(), $attr)); | |
-$ref = new \ReflectionFunction(<<A1>> <<A2>> function () { }); | |
+$ref = new \ReflectionFunction(#[A1] #[A2] function () { }); | |
$attr = $ref->getAttributes(A1::class, \ReflectionAttribute::IS_INSTANCEOF); | |
var_dump(count($attr)); | |
print_r(array_map(fn ($a) => $a->getName(), $attr)); | |
-$ref = new \ReflectionFunction(<<A1>> <<A2>> function () { }); | |
+$ref = new \ReflectionFunction(#[A1] #[A2] function () { }); | |
$attr = $ref->getAttributes(Base::class, \ReflectionAttribute::IS_INSTANCEOF); | |
var_dump(count($attr)); | |
print_r(array_map(fn ($a) => $a->getName(), $attr)); | |
-$ref = new \ReflectionFunction(<<A1>> <<A2>> <<A3>> function () { }); | |
+$ref = new \ReflectionFunction(#[A1] #[A2] #[A3] function () { }); | |
$attr = $ref->getAttributes(A2::class, \ReflectionAttribute::IS_INSTANCEOF); | |
var_dump(count($attr)); | |
print_r(array_map(fn ($a) => $a->getName(), $attr)); | |
-$ref = new \ReflectionFunction(<<A1>> <<A2>> <<A3>> function () { }); | |
+$ref = new \ReflectionFunction(#[A1] #[A2] #[A3] function () { }); | |
$attr = $ref->getAttributes(Base::class, \ReflectionAttribute::IS_INSTANCEOF); | |
var_dump(count($attr)); | |
print_r(array_map(fn ($a) => $a->getName(), $attr)); | |
diff --git a/Zend/tests/attributes/008_wrong_attribution.phpt b/Zend/tests/attributes/008_wrong_attribution.phpt | |
index 20a800b9a7..55fb5b8c1a 100644 | |
--- a/Zend/tests/attributes/008_wrong_attribution.phpt | |
+++ b/Zend/tests/attributes/008_wrong_attribution.phpt | |
@@ -3,7 +3,7 @@ Attributes: Prevent Attribute on non classes | |
--FILE-- | |
<?php | |
-<<Attribute>> | |
+#[Attribute] | |
function foo() {} | |
--EXPECTF-- | |
Fatal error: Attribute "Attribute" cannot target function (allowed targets: class) in %s | |
diff --git a/Zend/tests/attributes/009_doctrine_annotations_example.phpt b/Zend/tests/attributes/009_doctrine_annotations_example.phpt | |
index 38fc6389e0..fe59f8fde3 100644 | |
--- a/Zend/tests/attributes/009_doctrine_annotations_example.phpt | |
+++ b/Zend/tests/attributes/009_doctrine_annotations_example.phpt | |
@@ -25,20 +25,20 @@ namespace { | |
use Doctrine\ORM\Attributes as ORM; | |
use Symfony\Component\Validator\Constraints as Assert; | |
-<<ORM\Entity>> | |
+#[ORM\Entity] | |
/** @ORM\Entity */ | |
class User | |
{ | |
/** @ORM\Id @ORM\Column(type="integer"*) @ORM\GeneratedValue */ | |
- <<ORM\Id>><<ORM\Column("integer")>><<ORM\GeneratedValue>> | |
+ #[ORM\Id]#[ORM\Column("integer")]#[ORM\GeneratedValue] | |
private $id; | |
/** | |
* @ORM\Column(type="string", unique=true) | |
* @Assert\Email(message="The email '{{ value }}' is not a valid email.") | |
*/ | |
- <<ORM\Column("string", ORM\Column::UNIQUE)>> | |
- <<Assert\Email(array("message" => "The email '{{ value }}' is not a valid email."))>> | |
+ #[ORM\Column("string", ORM\Column::UNIQUE)] | |
+ #[Assert\Email(array("message" => "The email '{{ value }}' is not a valid email."))] | |
private $email; | |
/** | |
@@ -50,8 +50,8 @@ class User | |
* maxMessage = "You cannot be taller than {{ limit }}cm to enter" | |
* ) | |
*/ | |
- <<Assert\Range(["min" => 120, "max" => 180, "minMessage" => "You must be at least {{ limit }}cm tall to enter"])>> | |
- <<ORM\Column(ORM\Column::T_INTEGER)>> | |
+ #[Assert\Range(["min" => 120, "max" => 180, "minMessage" => "You must be at least {{ limit }}cm tall to enter"])] | |
+ #[ORM\Column(ORM\Column::T_INTEGER)] | |
protected $height; | |
/** | |
@@ -61,10 +61,10 @@ class User | |
* inverseJoinColumns={@ORM\JoinColumn(name="phonenumber_id", referencedColumnName="id", unique=true)} | |
* ) | |
*/ | |
- <<ORM\ManyToMany(Phonenumber::class)>> | |
- <<ORM\JoinTable("users_phonenumbers")>> | |
- <<ORM\JoinColumn("user_id", "id")>> | |
- <<ORM\InverseJoinColumn("phonenumber_id", "id", ORM\JoinColumn::UNIQUE)>> | |
+ #[ORM\ManyToMany(Phonenumber::class)] | |
+ #[ORM\JoinTable("users_phonenumbers")] | |
+ #[ORM\JoinColumn("user_id", "id")] | |
+ #[ORM\InverseJoinColumn("phonenumber_id", "id", ORM\JoinColumn::UNIQUE)] | |
private $phonenumbers; | |
} | |
diff --git a/Zend/tests/attributes/010_unsupported_const_expression.phpt b/Zend/tests/attributes/010_unsupported_const_expression.phpt | |
index 50afa6c4f6..498898379d 100644 | |
--- a/Zend/tests/attributes/010_unsupported_const_expression.phpt | |
+++ b/Zend/tests/attributes/010_unsupported_const_expression.phpt | |
@@ -3,7 +3,7 @@ Attribute arguments support only const expressions. | |
--FILE-- | |
<?php | |
-<<A1(foo())>> | |
+#[A1(foo())] | |
class C1 { } | |
?> | |
diff --git a/Zend/tests/attributes/011_inheritance.phpt b/Zend/tests/attributes/011_inheritance.phpt | |
index 007cd5991e..36ee3fa47a 100644 | |
--- a/Zend/tests/attributes/011_inheritance.phpt | |
+++ b/Zend/tests/attributes/011_inheritance.phpt | |
@@ -3,10 +3,10 @@ Attributes comply with inheritance rules. | |
--FILE-- | |
<?php | |
-<<A2>> | |
+#[A2] | |
class C1 | |
{ | |
- <<A1>> | |
+ #[A1] | |
public function foo() { } | |
} | |
@@ -17,7 +17,7 @@ class C2 extends C1 | |
class C3 extends C1 | |
{ | |
- <<A1>> | |
+ #[A1] | |
public function bar() { } | |
} | |
@@ -37,7 +37,7 @@ echo "\n"; | |
trait T1 | |
{ | |
- <<A2>> | |
+ #[A2] | |
public $a; | |
} | |
@@ -49,7 +49,7 @@ class C4 | |
class C5 | |
{ | |
use T1; | |
- | |
+ | |
public $a; | |
} | |
diff --git a/Zend/tests/attributes/012_ast_export.phpt b/Zend/tests/attributes/012_ast_export.phpt | |
index fe3539c8a9..acf9ca63fa 100644 | |
--- a/Zend/tests/attributes/012_ast_export.phpt | |
+++ b/Zend/tests/attributes/012_ast_export.phpt | |
@@ -3,51 +3,51 @@ Attributes AST can be exported. | |
--FILE-- | |
<?php | |
-assert(0 && ($a = <<A1>><<A2>> function ($a, <<A3(1)>> $b) { })); | |
+assert(0 && ($a = #[A1]#[A2] function ($a, #[A3(1)] $b) { })); | |
-assert(0 && ($a = <<A1(1, 2, 1 + 2)>> fn () => 1)); | |
+assert(0 && ($a = #[A1(1, 2, 1 + 2)] fn () => 1)); | |
-assert(0 && ($a = new <<A1>> class() { | |
- <<A1>><<A2>> const FOO = 'foo'; | |
- <<A2>> public $x; | |
- <<A3>> function a() { } | |
+assert(0 && ($a = new #[A1] class() { | |
+ #[A1]#[A2] const FOO = 'foo'; | |
+ #[A2] public $x; | |
+ #[A3] function a() { } | |
})); | |
assert(0 && ($a = function () { | |
- <<A1>> class Test1 { } | |
- <<A2>> interface Test2 { } | |
- <<A3>> trait Test3 { } | |
+ #[A1] class Test1 { } | |
+ #[A2] interface Test2 { } | |
+ #[A3] trait Test3 { } | |
})); | |
?> | |
--EXPECTF-- | |
-Warning: assert(): assert(0 && ($a = <<A1>> <<A2>> function ($a, <<A3(1)>> $b) { | |
+Warning: assert(): assert(0 && ($a = #[A1] #[A2] function ($a, #[A3(1)] $b) { | |
})) failed in %s on line %d | |
-Warning: assert(): assert(0 && ($a = <<A1(1, 2, 1 + 2)>> fn() => 1)) failed in %s on line %d | |
+Warning: assert(): assert(0 && ($a = #[A1(1, 2, 1 + 2)] fn() => 1)) failed in %s on line %d | |
-Warning: assert(): assert(0 && ($a = new <<A1>> class { | |
- <<A1>> | |
- <<A2>> | |
+Warning: assert(): assert(0 && ($a = new #[A1] class { | |
+ #[A1] | |
+ #[A2] | |
public const FOO = 'foo'; | |
- <<A2>> | |
+ #[A2] | |
public $x; | |
- <<A3>> | |
+ #[A3] | |
public function a() { | |
} | |
})) failed in %s on line %d | |
Warning: assert(): assert(0 && ($a = function () { | |
- <<A1>> | |
+ #[A1] | |
class Test1 { | |
} | |
- <<A2>> | |
+ #[A2] | |
interface Test2 { | |
} | |
- <<A3>> | |
+ #[A3] | |
trait Test3 { | |
} | |
diff --git a/Zend/tests/attributes/013_class_scope.phpt b/Zend/tests/attributes/013_class_scope.phpt | |
index 94764c2d69..61dd9f594c 100644 | |
--- a/Zend/tests/attributes/013_class_scope.phpt | |
+++ b/Zend/tests/attributes/013_class_scope.phpt | |
@@ -3,17 +3,17 @@ Attributes make use of class scope. | |
--FILE-- | |
<?php | |
-<<A1(self::class, self::FOO)>> | |
+#[A1(self::class, self::FOO)] | |
class C1 | |
{ | |
- <<A1(self::class, self::FOO)>> | |
+ #[A1(self::class, self::FOO)] | |
private const FOO = 'foo'; | |
- <<A1(self::class, self::FOO)>> | |
+ #[A1(self::class, self::FOO)] | |
public $a; | |
- <<A1(self::class, self::FOO)>> | |
- public function bar(<<A1(self::class, self::FOO)>> $p) { } | |
+ #[A1(self::class, self::FOO)] | |
+ public function bar(#[A1(self::class, self::FOO)] $p) { } | |
} | |
$ref = new \ReflectionClass(C1::class); | |
@@ -27,7 +27,7 @@ echo "\n"; | |
trait T1 | |
{ | |
- <<A1(self::class, self::FOO)>> | |
+ #[A1(self::class, self::FOO)] | |
public function foo() { } | |
} | |
@@ -58,10 +58,10 @@ class C3 | |
public static function foo() | |
{ | |
- return new <<A1(self::class, self::FOO)>> class() { | |
+ return new #[A1(self::class, self::FOO)] class() { | |
private const FOO = 'bar'; | |
- <<A1(self::class, self::FOO)>> | |
+ #[A1(self::class, self::FOO)] | |
public function bar() { } | |
}; | |
} | |
diff --git a/Zend/tests/attributes/014_class_const_group.phpt b/Zend/tests/attributes/014_class_const_group.phpt | |
index 18ff93683a..a53ed09c0a 100644 | |
--- a/Zend/tests/attributes/014_class_const_group.phpt | |
+++ b/Zend/tests/attributes/014_class_const_group.phpt | |
@@ -5,7 +5,7 @@ Attributes cannot be applied to groups of class constants. | |
class C1 | |
{ | |
- <<A1>> | |
+ #[A1] | |
public const A = 1, B = 2; | |
} | |
diff --git a/Zend/tests/attributes/015_property_group.phpt b/Zend/tests/attributes/015_property_group.phpt | |
index 493e4ae260..484d4154cf 100644 | |
--- a/Zend/tests/attributes/015_property_group.phpt | |
+++ b/Zend/tests/attributes/015_property_group.phpt | |
@@ -5,7 +5,7 @@ Attributes cannot be applied to groups of properties. | |
class C1 | |
{ | |
- <<A1>> | |
+ #[A1] | |
public $x, $y; | |
} | |
diff --git a/Zend/tests/attributes/016_target_resolution_compiler_attributes.phpt b/Zend/tests/attributes/016_target_resolution_compiler_attributes.phpt | |
index c96b49cbd7..6982220336 100644 | |
--- a/Zend/tests/attributes/016_target_resolution_compiler_attributes.phpt | |
+++ b/Zend/tests/attributes/016_target_resolution_compiler_attributes.phpt | |
@@ -8,8 +8,8 @@ if (!extension_loaded('zend-test')) { | |
--FILE-- | |
<?php | |
-<<ZendTestAttribute>> | |
+#[ZendTestAttribute] | |
function foo() { | |
} | |
--EXPECTF-- | |
-Fatal error: Only classes can be marked with <<ZendTestAttribute>> in %s | |
+Fatal error: Only classes can be marked with #[ZendTestAttribute] in %s | |
diff --git a/Zend/tests/attributes/017_closure_scope.phpt b/Zend/tests/attributes/017_closure_scope.phpt | |
index f57b4b73b3..af7de8e2e8 100644 | |
--- a/Zend/tests/attributes/017_closure_scope.phpt | |
+++ b/Zend/tests/attributes/017_closure_scope.phpt | |
@@ -14,7 +14,7 @@ class C1 | |
public static function foo() | |
{ | |
- return <<A1(self::class, self::FOO)>> function (<<A1(self::class, self::FOO)>> $p) { }; | |
+ return #[A1(self::class, self::FOO)] function (#[A1(self::class, self::FOO)] $p) { }; | |
} | |
} | |
diff --git a/Zend/tests/attributes/018_fatal_error_in_argument.phpt b/Zend/tests/attributes/018_fatal_error_in_argument.phpt | |
index a950c8658a..fd031f5c2c 100644 | |
--- a/Zend/tests/attributes/018_fatal_error_in_argument.phpt | |
+++ b/Zend/tests/attributes/018_fatal_error_in_argument.phpt | |
@@ -3,7 +3,7 @@ Don't free uninitialized memory if a fatal error occurs in an attribute argument | |
--FILE-- | |
<?php | |
-<<Attr(a->b::c)>> | |
+#[Attr(a->b::c)] | |
function test() {} | |
?> | |
diff --git a/Zend/tests/attributes/019_variable_attribute_name.phpt b/Zend/tests/attributes/019_variable_attribute_name.phpt | |
index a259c06f3f..fe96459bb3 100644 | |
--- a/Zend/tests/attributes/019_variable_attribute_name.phpt | |
+++ b/Zend/tests/attributes/019_variable_attribute_name.phpt | |
@@ -3,7 +3,7 @@ Attribute name cannot be a variable | |
--FILE-- | |
<?php | |
-<<$x>> | |
+#[$x] | |
class A {} | |
?> | |
diff --git a/Zend/tests/attributes/020_userland_attribute_validation.phpt b/Zend/tests/attributes/020_userland_attribute_validation.phpt | |
index 48c5e2651b..14a10c39b2 100644 | |
--- a/Zend/tests/attributes/020_userland_attribute_validation.phpt | |
+++ b/Zend/tests/attributes/020_userland_attribute_validation.phpt | |
@@ -3,17 +3,17 @@ Attributes expose and verify target and repeatable data. | |
--FILE-- | |
<?php | |
-<<Attribute(Attribute::TARGET_FUNCTION | Attribute::TARGET_METHOD)>> | |
+#[Attribute(Attribute::TARGET_FUNCTION | Attribute::TARGET_METHOD)] | |
class A1 { } | |
-$ref = new \ReflectionFunction(<<A1>> function () { }); | |
+$ref = new \ReflectionFunction(#[A1] function () { }); | |
$attr = $ref->getAttributes()[0]; | |
var_dump($attr->getName(), $attr->getTarget() == Attribute::TARGET_FUNCTION, $attr->isRepeated()); | |
var_dump(get_class($attr->newInstance())); | |
echo "\n"; | |
-$ref = new \ReflectionObject(new <<A1>> class() { }); | |
+$ref = new \ReflectionObject(new #[A1] class() { }); | |
$attr = $ref->getAttributes()[0]; | |
var_dump($attr->getName(), $attr->getTarget() == Attribute::TARGET_CLASS, $attr->isRepeated()); | |
@@ -25,7 +25,7 @@ try { | |
echo "\n"; | |
-$ref = new \ReflectionFunction(<<A1>> <<A1>> function () { }); | |
+$ref = new \ReflectionFunction(#[A1] #[A1] function () { }); | |
$attr = $ref->getAttributes()[0]; | |
var_dump($attr->getName(), $attr->getTarget() == Attribute::TARGET_FUNCTION, $attr->isRepeated()); | |
@@ -37,10 +37,10 @@ try { | |
echo "\n"; | |
-<<Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)>> | |
+#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)] | |
class A2 { } | |
-$ref = new \ReflectionObject(new <<A2>> <<A2>> class() { }); | |
+$ref = new \ReflectionObject(new #[A2] #[A2] class() { }); | |
$attr = $ref->getAttributes()[0]; | |
var_dump($attr->getName(), $attr->getTarget() == Attribute::TARGET_CLASS, $attr->isRepeated()); | |
var_dump(get_class($attr->newInstance())); | |
diff --git a/Zend/tests/attributes/021_attribute_flags_type_is_validated.phpt b/Zend/tests/attributes/021_attribute_flags_type_is_validated.phpt | |
index 06ed4d08fd..7c1bfd2da7 100644 | |
--- a/Zend/tests/attributes/021_attribute_flags_type_is_validated.phpt | |
+++ b/Zend/tests/attributes/021_attribute_flags_type_is_validated.phpt | |
@@ -3,7 +3,7 @@ Attribute flags type is validated. | |
--FILE-- | |
<?php | |
-<<Attribute("foo")>> | |
+#[Attribute("foo")] | |
class A1 { } | |
?> | |
diff --git a/Zend/tests/attributes/022_attribute_flags_value_is_validated.phpt b/Zend/tests/attributes/022_attribute_flags_value_is_validated.phpt | |
index 1deb81e4d5..72433a9f13 100644 | |
--- a/Zend/tests/attributes/022_attribute_flags_value_is_validated.phpt | |
+++ b/Zend/tests/attributes/022_attribute_flags_value_is_validated.phpt | |
@@ -3,7 +3,7 @@ Attribute flags value is validated. | |
--FILE-- | |
<?php | |
-<<Attribute(-1)>> | |
+#[Attribute(-1)] | |
class A1 { } | |
?> | |
diff --git a/Zend/tests/attributes/023_ast_node_in_validation.phpt b/Zend/tests/attributes/023_ast_node_in_validation.phpt | |
index 57a7287cae..332d83fe86 100644 | |
--- a/Zend/tests/attributes/023_ast_node_in_validation.phpt | |
+++ b/Zend/tests/attributes/023_ast_node_in_validation.phpt | |
@@ -3,7 +3,7 @@ Attribute flags value is validated. | |
--FILE-- | |
<?php | |
-<<Attribute(Foo::BAR)>> | |
+#[Attribute(Foo::BAR)] | |
class A1 { } | |
?> | |
diff --git a/Zend/tests/attributes/024_internal_target_validation.phpt b/Zend/tests/attributes/024_internal_target_validation.phpt | |
index 746ceb3c69..e941cf6132 100644 | |
--- a/Zend/tests/attributes/024_internal_target_validation.phpt | |
+++ b/Zend/tests/attributes/024_internal_target_validation.phpt | |
@@ -3,7 +3,7 @@ Internal attribute targets are validated. | |
--FILE-- | |
<?php | |
-<<Attribute>> | |
+#[Attribute] | |
function a1() { } | |
?> | |
diff --git a/Zend/tests/attributes/025_internal_repeatable_validation.phpt b/Zend/tests/attributes/025_internal_repeatable_validation.phpt | |
index 631f0b5054..671a15fba3 100644 | |
--- a/Zend/tests/attributes/025_internal_repeatable_validation.phpt | |
+++ b/Zend/tests/attributes/025_internal_repeatable_validation.phpt | |
@@ -3,8 +3,8 @@ Internal attribute targets are validated. | |
--FILE-- | |
<?php | |
-<<Attribute>> | |
-<<Attribute>> | |
+#[Attribute] | |
+#[Attribute] | |
class A1 { } | |
?> | |
diff --git a/Zend/tests/attributes/026_unpack_in_args.phpt b/Zend/tests/attributes/026_unpack_in_args.phpt | |
index 04a038d3e5..d7528b5114 100644 | |
--- a/Zend/tests/attributes/026_unpack_in_args.phpt | |
+++ b/Zend/tests/attributes/026_unpack_in_args.phpt | |
@@ -3,7 +3,7 @@ Cannot use unpacking in attribute argument list | |
--FILE-- | |
<?php | |
-<<MyAttribute(...[1, 2, 3])>> | |
+#[MyAttribute(...[1, 2, 3])] | |
class Foo { } | |
?> | |
diff --git a/Zend/tests/attributes/027_trailing_comma_args.phpt b/Zend/tests/attributes/027_trailing_comma_args.phpt | |
index c8f6adf0e8..226025f359 100644 | |
--- a/Zend/tests/attributes/027_trailing_comma_args.phpt | |
+++ b/Zend/tests/attributes/027_trailing_comma_args.phpt | |
@@ -3,12 +3,12 @@ Trailing comma in attribute argument list | |
--FILE-- | |
<?php | |
-<<MyAttribute( | |
+#[MyAttribute( | |
"there", | |
"are", | |
"many", | |
"arguments", | |
-)>> | |
+)] | |
class Foo { } | |
$ref = new \ReflectionClass(Foo::class); | |
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c | |
index b1e564b5e9..55131815e3 100644 | |
--- a/Zend/zend_ast.c | |
+++ b/Zend/zend_ast.c | |
@@ -1356,7 +1356,7 @@ static ZEND_COLD void zend_ast_export_attributes(smart_str *str, zend_ast *ast, | |
for (i = 0; i < list->children; i++) { | |
zend_ast *attr = list->child[i]; | |
- smart_str_appends(str, "<<"); | |
+ smart_str_appends(str, "#["); | |
zend_ast_export_ns_name(str, attr->child[0], 0, indent); | |
if (attr->child[1]) { | |
@@ -1373,7 +1373,7 @@ static ZEND_COLD void zend_ast_export_attributes(smart_str *str, zend_ast *ast, | |
smart_str_appendc(str, ')'); | |
} | |
- smart_str_appends(str, ">>"); | |
+ smart_str_appends(str, "]"); | |
if (newlines) { | |
smart_str_appendc(str, '\n'); | |
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y | |
index acb7a3d954..c990b3b264 100644 | |
--- a/Zend/zend_language_parser.y | |
+++ b/Zend/zend_language_parser.y | |
@@ -129,6 +129,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); | |
%token <ident> T_DECLARE "'declare'" | |
%token <ident> T_ENDDECLARE "'enddeclare'" | |
%token <ident> T_AS "'as'" | |
+%token <ident> T_ATTRIBUTE "'#[ (T_ATTRIBUTE)'" | |
%token <ident> T_SWITCH "'switch'" | |
%token <ident> T_ENDSWITCH "'endswitch'" | |
%token <ident> T_CASE "'case'" | |
@@ -344,7 +345,7 @@ attribute_decl: | |
; | |
attribute: | |
- T_SL attribute_decl T_SR { $$ = $2; } | |
+ T_ATTRIBUTE attribute_decl ']' { $$ = $2; } | |
; | |
attributes: | |
diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l | |
index 2ebe92e6bd..d48b7d2bc2 100644 | |
--- a/Zend/zend_language_scanner.l | |
+++ b/Zend/zend_language_scanner.l | |
@@ -1508,6 +1508,11 @@ NEWLINE ("\r"|"\n"|"\r\n") | |
RETURN_TOKEN_WITH_IDENT(T_AS); | |
} | |
+<ST_IN_SCRIPTING>"#[" { | |
+ enter_nesting(yytext[1]); | |
+ RETURN_TOKEN(T_ATTRIBUTE); | |
+} | |
+ | |
<ST_IN_SCRIPTING>"switch" { | |
RETURN_TOKEN_WITH_IDENT(T_SWITCH); | |
} | |
diff --git a/ext/tokenizer/tokenizer_data.c b/ext/tokenizer/tokenizer_data.c | |
index 9ed027920c..ce6db13fe7 100644 | |
--- a/ext/tokenizer/tokenizer_data.c | |
+++ b/ext/tokenizer/tokenizer_data.c | |
@@ -102,6 +102,7 @@ void tokenizer_register_constants(INIT_FUNC_ARGS) { | |
REGISTER_LONG_CONSTANT("T_DECLARE", T_DECLARE, CONST_CS | CONST_PERSISTENT); | |
REGISTER_LONG_CONSTANT("T_ENDDECLARE", T_ENDDECLARE, CONST_CS | CONST_PERSISTENT); | |
REGISTER_LONG_CONSTANT("T_AS", T_AS, CONST_CS | CONST_PERSISTENT); | |
+ REGISTER_LONG_CONSTANT("T_ATTRIBUTE", T_ATTRIBUTE, CONST_CS | CONST_PERSISTENT); | |
REGISTER_LONG_CONSTANT("T_SWITCH", T_SWITCH, CONST_CS | CONST_PERSISTENT); | |
REGISTER_LONG_CONSTANT("T_ENDSWITCH", T_ENDSWITCH, CONST_CS | CONST_PERSISTENT); | |
REGISTER_LONG_CONSTANT("T_CASE", T_CASE, CONST_CS | CONST_PERSISTENT); | |
@@ -249,6 +250,7 @@ char *get_token_type_name(int token_type) | |
case T_DECLARE: return "T_DECLARE"; | |
case T_ENDDECLARE: return "T_ENDDECLARE"; | |
case T_AS: return "T_AS"; | |
+ case T_ATTRIBUTE: return "T_ATTRIBUTE"; | |
case T_SWITCH: return "T_SWITCH"; | |
case T_ENDSWITCH: return "T_ENDSWITCH"; | |
case T_CASE: return "T_CASE"; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment