-
Notifications
You must be signed in to change notification settings - Fork 7.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
16 changed files
with
345 additions
and
10 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
--TEST-- | ||
Constructor promotion cannot be used inside an abstract constructor | ||
--FILE-- | ||
<?php | ||
|
||
abstract class Test { | ||
abstract public function __construct(public int $x); | ||
} | ||
|
||
?> | ||
--EXPECTF-- | ||
Fatal error: Cannot declare promoted property in an abstract constructor in %s on line %d |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
--TEST-- | ||
Constructor promotion only permits visibility modifiers | ||
--FILE-- | ||
<?php | ||
|
||
class Test { | ||
public function __construct(public static $x) {} | ||
} | ||
|
||
?> | ||
--EXPECTF-- | ||
Parse error: syntax error, unexpected 'static' (T_STATIC), expecting variable (T_VARIABLE) in %s on line %d |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
--TEST-- | ||
Constructor promotion (basic example) | ||
--FILE-- | ||
<?php | ||
|
||
class Point { | ||
public function __construct(public int $x, public int $y, public int $z) {} | ||
} | ||
|
||
$point = new Point(1, 2, 3); | ||
|
||
// Check that properties really are typed. | ||
try { | ||
$point->x = "foo"; | ||
} catch (TypeError $e) { | ||
echo $e->getMessage(), "\n"; | ||
} | ||
|
||
?> | ||
--EXPECT-- | ||
Cannot assign string to property Point::$x of type int |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
--TEST-- | ||
Constructor promotion of by-ref parameter | ||
--FILE-- | ||
<?php | ||
|
||
class Ary { | ||
public function __construct(public array &$array) {} | ||
} | ||
|
||
$array = []; | ||
$ary = new Ary($array); | ||
$array[] = 42; | ||
var_dump($ary->array); | ||
|
||
?> | ||
--EXPECT-- | ||
array(1) { | ||
[0]=> | ||
int(42) | ||
} |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
--TEST-- | ||
Type of promoted property may not be callable | ||
--FILE-- | ||
<?php | ||
|
||
class Test { | ||
public function __construct(public callable $callable) {} | ||
} | ||
|
||
?> | ||
--EXPECTF-- | ||
Fatal error: Property Test::$callable cannot have type callable in %s on line %d |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
--TEST-- | ||
Constructor promotion with default values | ||
--FILE-- | ||
<?php | ||
|
||
class Point { | ||
public function __construct( | ||
public float $x = 0.0, | ||
public float $y = 1.0, | ||
public float $z = 2.0 | ||
) {} | ||
} | ||
|
||
var_dump(new Point(10.0)); | ||
var_dump(new Point(10.0, 11.0)); | ||
var_dump(new Point(10.0, 11.0, 12.0)); | ||
|
||
?> | ||
--EXPECT-- | ||
object(Point)#1 (3) { | ||
["x"]=> | ||
float(10) | ||
["y"]=> | ||
float(1) | ||
["z"]=> | ||
float(2) | ||
} | ||
object(Point)#1 (3) { | ||
["x"]=> | ||
float(10) | ||
["y"]=> | ||
float(11) | ||
["z"]=> | ||
float(2) | ||
} | ||
object(Point)#1 (3) { | ||
["x"]=> | ||
float(10) | ||
["y"]=> | ||
float(11) | ||
["z"]=> | ||
float(12) | ||
} |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
--TEST-- | ||
Constructor promotion cannot be used inside an abstract constructor (interface variant) | ||
--FILE-- | ||
<?php | ||
|
||
interface Test { | ||
public function __construct(public int $x); | ||
} | ||
|
||
?> | ||
--EXPECTF-- | ||
Fatal error: Cannot declare promoted property in an abstract constructor in %s on line %d |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
--TEST-- | ||
Constructor promotiong mixed with other properties, parameters and code | ||
--FILE-- | ||
<?php | ||
|
||
class Test { | ||
public string $prop2; | ||
|
||
public function __construct(public string $prop1 = "", $param2 = "") { | ||
$this->prop2 = $prop1 . $param2; | ||
} | ||
} | ||
|
||
var_dump(new Test("Foo", "Bar")); | ||
echo "\n"; | ||
echo new ReflectionClass(Test::class), "\n"; | ||
|
||
?> | ||
--EXPECTF-- | ||
object(Test)#1 (2) { | ||
["prop2"]=> | ||
string(6) "FooBar" | ||
["prop1"]=> | ||
string(3) "Foo" | ||
} | ||
|
||
Class [ <user> class Test ] { | ||
@@ %s | ||
|
||
- Constants [0] { | ||
} | ||
|
||
- Static properties [0] { | ||
} | ||
|
||
- Static methods [0] { | ||
} | ||
|
||
- Properties [2] { | ||
Property [ <default> public $prop2 ] | ||
Property [ <default> public $prop1 ] | ||
} | ||
|
||
- Methods [1] { | ||
Method [ <user, ctor> public method __construct ] { | ||
@@ %s | ||
|
||
- Parameters [2] { | ||
Parameter #0 [ <optional> string $prop1 = '' ] | ||
Parameter #1 [ <optional> $param2 = '' ] | ||
} | ||
} | ||
} | ||
} |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
--TEST-- | ||
Constructor promotion can only be used in constructors ... duh | ||
--FILE-- | ||
<?php | ||
|
||
class Test { | ||
public function foobar(public int $x, public int $y) {} | ||
} | ||
|
||
?> | ||
--EXPECTF-- | ||
Fatal error: Cannot declare promoted property outside a constructor in %s on line %d |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
--TEST-- | ||
Constructor promotion with null default, requires an explicitly nullable type | ||
--FILE-- | ||
<?php | ||
|
||
class Test { | ||
public function __construct(public int $x = null) {} | ||
} | ||
|
||
?> | ||
--EXPECTF-- | ||
Fatal error: Cannot use null as default value for parameter $x of type int in %s on line %d |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
--TEST-- | ||
Clash between promoted and explicit property | ||
--FILE-- | ||
<?php | ||
|
||
class Test { | ||
public $prop; | ||
|
||
public function __construct(public $prop) {} | ||
} | ||
|
||
?> | ||
--EXPECTF-- | ||
Fatal error: Cannot redeclare Test::$prop in %s on line %d |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
--TEST-- | ||
Constructor promotion can be used inside a trait | ||
--FILE-- | ||
<?php | ||
|
||
trait Test { | ||
public function __construct(public $prop) {} | ||
} | ||
|
||
class Test2 { | ||
use Test; | ||
} | ||
|
||
var_dump(new Test2(42)); | ||
|
||
?> | ||
--EXPECT-- | ||
object(Test2)#1 (1) { | ||
["prop"]=> | ||
int(42) | ||
} |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
--TEST-- | ||
Cannot use constructor promotion with variadic parameter | ||
--FILE-- | ||
<?php | ||
|
||
class Test { | ||
public function __construct(public string ...$strings) {} | ||
} | ||
|
||
?> | ||
--EXPECTF-- | ||
Fatal error: Cannot declare variadic promoted property in %s on line %d |
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
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
Oops, something went wrong.