Implement "Constructor Promotion" - #5291

Closed
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion
Closed

Implement "Constructor Promotion"#5291
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion

Conversation

@nikic

@nikicnikic commented Mar 24, 2020

Copy link
Copy Markdown
Member

RFC: https://wiki.php.net/rfc/constructor_promotion

As recently discussed on list, this implements the following short hand syntax:

class Point {
publicfunction__construct(
publicfloat$x = 0.0,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}

This desugars to:

class Point {
publicfloat$x;
publicfloat$y;
publicfloat$z;
publicfunction__construct(
float$x = 0.0,
float$y = 0.0,
float$z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}

@nikicnikic added the RFC label Mar 24, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 2e86157 to 4200794CompareMarch 26, 2020 11:56
Comment threadZend/zend_compile.c Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could add a test of global functions/closures - I'd guess that the following snippet probably has a misleading error message (not sure what scope->properties_info is)

<?phpfunction__construct(public$x) {}

LGTM otherwise

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a test in 717134e, error message seems fine. Or did you expect something different there?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah sorry, I missed that you had function __construct() in particular in mind here. Changed the name in 7139cdc.

Still works fine though, because is_ctor above includes a check that scope is not null.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, didn't see the scope part of the check

@enumag

Copy link
Copy Markdown

Somehow I'm more interested in the TODO: Allow comma here. 😛

@okdewit

Copy link
Copy Markdown

@nikic Is there a reason to not go a step further, and use a "Kotlin style" syntax?

class Point (
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {
//
}

@nikic
nikicforce-pushed the constructor-promotion branch from 7139cdc to f3dbd18CompareApril 2, 2020 09:41
@TysonAndre

Copy link
Copy Markdown
Contributor
inline_function:
...
|	fn returns_ref '(' parameter_list ')' return_type backup_doc_comment T_DOUBLE_ARROW backup_fn_flags backup_lex_pos expr backup_fn_flags
{ $$ = zend_ast_create_decl(ZEND_AST_ARROW_FUNC, $2 | $12, $1, $7,
zend_string_init("{closure}", sizeof("{closure}") - 1, 0), $4, NULL,
zend_ast_create(ZEND_AST_RETURN, $11), $6);
((zend_ast_decl *) $$)->lex_pos = $10;
CG(extra_fn_flags) = $9; }

After this change, static arrow functions with parameters don't get the doc comments parsed properly in Reflection.

It should be easy to fix by changing fn returns_ref '(' parameter_list ')' return_type backup_doc_comment to fn returns_ref backup_doc_comment '(' parameter_list ')' return_type and renumbering $n, unless there's a reason not to.

An example of affected code: $c = /** doc comment */ static fn(?int... $args): array => $args;

@carusogabrielcarusogabriel added this to the PHP 8.0 milestone May 30, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 150d893 to 1a9dfafCompareJune 5, 2020 10:00
@nikic

nikic commented Jun 5, 2020

Copy link
Copy Markdown
MemberAuthor

@TysonAndre Nice catch! It should be fixed now.

public function __construct(
public float $x = 0.0,
public float $y = 1.0,
public float $z = 2.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the RFC code example the trailing comma is allowed, but not here.

Which is correct?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the subject of different RFC

@TomasVotrubaTomasVotrubaJun 14, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FlorianSteenbuck

Copy link
Copy Markdown

Is there any reflection possibility for visibility ?

@nikic

nikic commented Jan 5, 2021

Copy link
Copy Markdown
MemberAuthor

@FlorianSteenbuck The visibility should be accessible through ReflectionProperty as usual.

@FlorianSteenbuck

FlorianSteenbuck commented Jan 5, 2021

Copy link
Copy Markdown

@nikic ok: https://3v4l.org/JsbXT

<?phpclass Point {
publicfunction__construct(
publicfloat$x,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}
foreach ((newReflectionClass(Point::class))->getProperties() as$property) {
var_dump($property->name);
}
string(1) "x"
string(1) "y"
string(1) "z"

@zlianon

Copy link
Copy Markdown

@nikic what is the reason for which it is not allowed to declare promoted property in an abstract constructor?

interface InstructionInterface
{
/** * InstructionInterface constructor. * * @param mixed $operand */publicfunction__construct(
privatemixed$operand,
);
/** * @param SplStack $stack */publicfunction__invoke(SplStack$stack): void;
}

@nikic

nikic commented May 5, 2021

Copy link
Copy Markdown
MemberAuthor

Promoted properties combine a property declaration with initialization of that property in the constructor. There is no way to initialize the property in an abstract constructor.

Your example is doubly illegal because it would also require declaring a property in an interface, which is not allowed.

franzholz added a commit to franzholz/typo3db_legacy that referenced this pull request Jan 15, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* StrStartsWithRector (https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions)
* NullToStrictStringFuncCallArgRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
georgfranz added a commit to franz-agency/zetacomponents-Database that referenced this pull request Dec 11, 2023
Applied rules:
* LongArrayToShortArrayRector
* TernaryToNullCoalescingRector
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ChangeSwitchToMatchRector (https://wiki.php.net/rfc/match_expression_v2)
* NullToStrictStringFuncCallArgRector
* TypedPropertyFromAssignsRector
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@nikic@enumag@okdewit@TysonAndre@FlorianSteenbuck@zlianon@TomasVotruba@someniatko@carusogabriel
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Implement "Constructor Promotion" - #5291

Closed
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion
Closed

Implement "Constructor Promotion"#5291
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion

Conversation

@nikic

@nikicnikic commented Mar 24, 2020

Copy link
Copy Markdown
Member

RFC: https://wiki.php.net/rfc/constructor_promotion

As recently discussed on list, this implements the following short hand syntax:

class Point {
publicfunction__construct(
publicfloat$x = 0.0,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}

This desugars to:

class Point {
publicfloat$x;
publicfloat$y;
publicfloat$z;
publicfunction__construct(
float$x = 0.0,
float$y = 0.0,
float$z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}

@nikicnikic added the RFC label Mar 24, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 2e86157 to 4200794CompareMarch 26, 2020 11:56
Comment threadZend/zend_compile.c Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could add a test of global functions/closures - I'd guess that the following snippet probably has a misleading error message (not sure what scope->properties_info is)

<?phpfunction__construct(public$x) {}

LGTM otherwise

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a test in 717134e, error message seems fine. Or did you expect something different there?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah sorry, I missed that you had function __construct() in particular in mind here. Changed the name in 7139cdc.

Still works fine though, because is_ctor above includes a check that scope is not null.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, didn't see the scope part of the check

@enumag

Copy link
Copy Markdown

Somehow I'm more interested in the TODO: Allow comma here. 😛

@okdewit

Copy link
Copy Markdown

@nikic Is there a reason to not go a step further, and use a "Kotlin style" syntax?

class Point (
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {
//
}

@nikic
nikicforce-pushed the constructor-promotion branch from 7139cdc to f3dbd18CompareApril 2, 2020 09:41
@TysonAndre

Copy link
Copy Markdown
Contributor
inline_function:
...
|	fn returns_ref '(' parameter_list ')' return_type backup_doc_comment T_DOUBLE_ARROW backup_fn_flags backup_lex_pos expr backup_fn_flags
{ $$ = zend_ast_create_decl(ZEND_AST_ARROW_FUNC, $2 | $12, $1, $7,
zend_string_init("{closure}", sizeof("{closure}") - 1, 0), $4, NULL,
zend_ast_create(ZEND_AST_RETURN, $11), $6);
((zend_ast_decl *) $$)->lex_pos = $10;
CG(extra_fn_flags) = $9; }

After this change, static arrow functions with parameters don't get the doc comments parsed properly in Reflection.

It should be easy to fix by changing fn returns_ref '(' parameter_list ')' return_type backup_doc_comment to fn returns_ref backup_doc_comment '(' parameter_list ')' return_type and renumbering $n, unless there's a reason not to.

An example of affected code: $c = /** doc comment */ static fn(?int... $args): array => $args;

@carusogabrielcarusogabriel added this to the PHP 8.0 milestone May 30, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 150d893 to 1a9dfafCompareJune 5, 2020 10:00
@nikic

nikic commented Jun 5, 2020

Copy link
Copy Markdown
MemberAuthor

@TysonAndre Nice catch! It should be fixed now.

public function __construct(
public float $x = 0.0,
public float $y = 1.0,
public float $z = 2.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the RFC code example the trailing comma is allowed, but not here.

Which is correct?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the subject of different RFC

@TomasVotrubaTomasVotrubaJun 14, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FlorianSteenbuck

Copy link
Copy Markdown

Is there any reflection possibility for visibility ?

@nikic

nikic commented Jan 5, 2021

Copy link
Copy Markdown
MemberAuthor

@FlorianSteenbuck The visibility should be accessible through ReflectionProperty as usual.

@FlorianSteenbuck

FlorianSteenbuck commented Jan 5, 2021

Copy link
Copy Markdown

@nikic ok: https://3v4l.org/JsbXT

<?phpclass Point {
publicfunction__construct(
publicfloat$x,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}
foreach ((newReflectionClass(Point::class))->getProperties() as$property) {
var_dump($property->name);
}
string(1) "x"
string(1) "y"
string(1) "z"

@zlianon

Copy link
Copy Markdown

@nikic what is the reason for which it is not allowed to declare promoted property in an abstract constructor?

interface InstructionInterface
{
/** * InstructionInterface constructor. * * @param mixed $operand */publicfunction__construct(
privatemixed$operand,
);
/** * @param SplStack $stack */publicfunction__invoke(SplStack$stack): void;
}

@nikic

nikic commented May 5, 2021

Copy link
Copy Markdown
MemberAuthor

Promoted properties combine a property declaration with initialization of that property in the constructor. There is no way to initialize the property in an abstract constructor.

Your example is doubly illegal because it would also require declaring a property in an interface, which is not allowed.

franzholz added a commit to franzholz/typo3db_legacy that referenced this pull request Jan 15, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* StrStartsWithRector (https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions)
* NullToStrictStringFuncCallArgRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
georgfranz added a commit to franz-agency/zetacomponents-Database that referenced this pull request Dec 11, 2023
Applied rules:
* LongArrayToShortArrayRector
* TernaryToNullCoalescingRector
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ChangeSwitchToMatchRector (https://wiki.php.net/rfc/match_expression_v2)
* NullToStrictStringFuncCallArgRector
* TypedPropertyFromAssignsRector
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@nikic@enumag@okdewit@TysonAndre@FlorianSteenbuck@zlianon@TomasVotruba@someniatko@carusogabriel
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement "Constructor Promotion" - #5291

Closed
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion
Closed

Implement "Constructor Promotion"#5291
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion

Conversation

@nikic

@nikicnikic commented Mar 24, 2020

Copy link
Copy Markdown
Member

RFC: https://wiki.php.net/rfc/constructor_promotion

As recently discussed on list, this implements the following short hand syntax:

class Point {
publicfunction__construct(
publicfloat$x = 0.0,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}

This desugars to:

class Point {
publicfloat$x;
publicfloat$y;
publicfloat$z;
publicfunction__construct(
float$x = 0.0,
float$y = 0.0,
float$z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}

@nikicnikic added the RFC label Mar 24, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 2e86157 to 4200794CompareMarch 26, 2020 11:56
Comment threadZend/zend_compile.c Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could add a test of global functions/closures - I'd guess that the following snippet probably has a misleading error message (not sure what scope->properties_info is)

<?phpfunction__construct(public$x) {}

LGTM otherwise

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a test in 717134e, error message seems fine. Or did you expect something different there?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah sorry, I missed that you had function __construct() in particular in mind here. Changed the name in 7139cdc.

Still works fine though, because is_ctor above includes a check that scope is not null.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, didn't see the scope part of the check

@enumag

Copy link
Copy Markdown

Somehow I'm more interested in the TODO: Allow comma here. 😛

@okdewit

Copy link
Copy Markdown

@nikic Is there a reason to not go a step further, and use a "Kotlin style" syntax?

class Point (
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {
//
}

@nikic
nikicforce-pushed the constructor-promotion branch from 7139cdc to f3dbd18CompareApril 2, 2020 09:41
@TysonAndre

Copy link
Copy Markdown
Contributor
inline_function:
...
|	fn returns_ref '(' parameter_list ')' return_type backup_doc_comment T_DOUBLE_ARROW backup_fn_flags backup_lex_pos expr backup_fn_flags
{ $$ = zend_ast_create_decl(ZEND_AST_ARROW_FUNC, $2 | $12, $1, $7,
zend_string_init("{closure}", sizeof("{closure}") - 1, 0), $4, NULL,
zend_ast_create(ZEND_AST_RETURN, $11), $6);
((zend_ast_decl *) $$)->lex_pos = $10;
CG(extra_fn_flags) = $9; }

After this change, static arrow functions with parameters don't get the doc comments parsed properly in Reflection.

It should be easy to fix by changing fn returns_ref '(' parameter_list ')' return_type backup_doc_comment to fn returns_ref backup_doc_comment '(' parameter_list ')' return_type and renumbering $n, unless there's a reason not to.

An example of affected code: $c = /** doc comment */ static fn(?int... $args): array => $args;

@carusogabrielcarusogabriel added this to the PHP 8.0 milestone May 30, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 150d893 to 1a9dfafCompareJune 5, 2020 10:00
@nikic

nikic commented Jun 5, 2020

Copy link
Copy Markdown
MemberAuthor

@TysonAndre Nice catch! It should be fixed now.

public function __construct(
public float $x = 0.0,
public float $y = 1.0,
public float $z = 2.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the RFC code example the trailing comma is allowed, but not here.

Which is correct?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the subject of different RFC

@TomasVotrubaTomasVotrubaJun 14, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FlorianSteenbuck

Copy link
Copy Markdown

Is there any reflection possibility for visibility ?

@nikic

nikic commented Jan 5, 2021

Copy link
Copy Markdown
MemberAuthor

@FlorianSteenbuck The visibility should be accessible through ReflectionProperty as usual.

@FlorianSteenbuck

FlorianSteenbuck commented Jan 5, 2021

Copy link
Copy Markdown

@nikic ok: https://3v4l.org/JsbXT

<?phpclass Point {
publicfunction__construct(
publicfloat$x,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}
foreach ((newReflectionClass(Point::class))->getProperties() as$property) {
var_dump($property->name);
}
string(1) "x"
string(1) "y"
string(1) "z"

@zlianon

Copy link
Copy Markdown

@nikic what is the reason for which it is not allowed to declare promoted property in an abstract constructor?

interface InstructionInterface
{
/** * InstructionInterface constructor. * * @param mixed $operand */publicfunction__construct(
privatemixed$operand,
);
/** * @param SplStack $stack */publicfunction__invoke(SplStack$stack): void;
}

@nikic

nikic commented May 5, 2021

Copy link
Copy Markdown
MemberAuthor

Promoted properties combine a property declaration with initialization of that property in the constructor. There is no way to initialize the property in an abstract constructor.

Your example is doubly illegal because it would also require declaring a property in an interface, which is not allowed.

franzholz added a commit to franzholz/typo3db_legacy that referenced this pull request Jan 15, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* StrStartsWithRector (https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions)
* NullToStrictStringFuncCallArgRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
georgfranz added a commit to franz-agency/zetacomponents-Database that referenced this pull request Dec 11, 2023
Applied rules:
* LongArrayToShortArrayRector
* TernaryToNullCoalescingRector
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ChangeSwitchToMatchRector (https://wiki.php.net/rfc/match_expression_v2)
* NullToStrictStringFuncCallArgRector
* TypedPropertyFromAssignsRector
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@nikic@enumag@okdewit@TysonAndre@FlorianSteenbuck@zlianon@TomasVotruba@someniatko@carusogabriel
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement "Constructor Promotion" - #5291

Closed
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion
Closed

Implement "Constructor Promotion"#5291
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion

Conversation

@nikic

@nikicnikic commented Mar 24, 2020

Copy link
Copy Markdown
Member

RFC: https://wiki.php.net/rfc/constructor_promotion

As recently discussed on list, this implements the following short hand syntax:

class Point {
publicfunction__construct(
publicfloat$x = 0.0,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}

This desugars to:

class Point {
publicfloat$x;
publicfloat$y;
publicfloat$z;
publicfunction__construct(
float$x = 0.0,
float$y = 0.0,
float$z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}

@nikicnikic added the RFC label Mar 24, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 2e86157 to 4200794CompareMarch 26, 2020 11:56
Comment threadZend/zend_compile.c Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could add a test of global functions/closures - I'd guess that the following snippet probably has a misleading error message (not sure what scope->properties_info is)

<?phpfunction__construct(public$x) {}

LGTM otherwise

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a test in 717134e, error message seems fine. Or did you expect something different there?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah sorry, I missed that you had function __construct() in particular in mind here. Changed the name in 7139cdc.

Still works fine though, because is_ctor above includes a check that scope is not null.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, didn't see the scope part of the check

@enumag

Copy link
Copy Markdown

Somehow I'm more interested in the TODO: Allow comma here. 😛

@okdewit

Copy link
Copy Markdown

@nikic Is there a reason to not go a step further, and use a "Kotlin style" syntax?

class Point (
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {
//
}

@nikic
nikicforce-pushed the constructor-promotion branch from 7139cdc to f3dbd18CompareApril 2, 2020 09:41
@TysonAndre

Copy link
Copy Markdown
Contributor
inline_function:
...
|	fn returns_ref '(' parameter_list ')' return_type backup_doc_comment T_DOUBLE_ARROW backup_fn_flags backup_lex_pos expr backup_fn_flags
{ $$ = zend_ast_create_decl(ZEND_AST_ARROW_FUNC, $2 | $12, $1, $7,
zend_string_init("{closure}", sizeof("{closure}") - 1, 0), $4, NULL,
zend_ast_create(ZEND_AST_RETURN, $11), $6);
((zend_ast_decl *) $$)->lex_pos = $10;
CG(extra_fn_flags) = $9; }

After this change, static arrow functions with parameters don't get the doc comments parsed properly in Reflection.

It should be easy to fix by changing fn returns_ref '(' parameter_list ')' return_type backup_doc_comment to fn returns_ref backup_doc_comment '(' parameter_list ')' return_type and renumbering $n, unless there's a reason not to.

An example of affected code: $c = /** doc comment */ static fn(?int... $args): array => $args;

@carusogabrielcarusogabriel added this to the PHP 8.0 milestone May 30, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 150d893 to 1a9dfafCompareJune 5, 2020 10:00
@nikic

nikic commented Jun 5, 2020

Copy link
Copy Markdown
MemberAuthor

@TysonAndre Nice catch! It should be fixed now.

public function __construct(
public float $x = 0.0,
public float $y = 1.0,
public float $z = 2.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the RFC code example the trailing comma is allowed, but not here.

Which is correct?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the subject of different RFC

@TomasVotrubaTomasVotrubaJun 14, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FlorianSteenbuck

Copy link
Copy Markdown

Is there any reflection possibility for visibility ?

@nikic

nikic commented Jan 5, 2021

Copy link
Copy Markdown
MemberAuthor

@FlorianSteenbuck The visibility should be accessible through ReflectionProperty as usual.

@FlorianSteenbuck

FlorianSteenbuck commented Jan 5, 2021

Copy link
Copy Markdown

@nikic ok: https://3v4l.org/JsbXT

<?phpclass Point {
publicfunction__construct(
publicfloat$x,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}
foreach ((newReflectionClass(Point::class))->getProperties() as$property) {
var_dump($property->name);
}
string(1) "x"
string(1) "y"
string(1) "z"

@zlianon

Copy link
Copy Markdown

@nikic what is the reason for which it is not allowed to declare promoted property in an abstract constructor?

interface InstructionInterface
{
/** * InstructionInterface constructor. * * @param mixed $operand */publicfunction__construct(
privatemixed$operand,
);
/** * @param SplStack $stack */publicfunction__invoke(SplStack$stack): void;
}

@nikic

nikic commented May 5, 2021

Copy link
Copy Markdown
MemberAuthor

Promoted properties combine a property declaration with initialization of that property in the constructor. There is no way to initialize the property in an abstract constructor.

Your example is doubly illegal because it would also require declaring a property in an interface, which is not allowed.

franzholz added a commit to franzholz/typo3db_legacy that referenced this pull request Jan 15, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* StrStartsWithRector (https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions)
* NullToStrictStringFuncCallArgRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
georgfranz added a commit to franz-agency/zetacomponents-Database that referenced this pull request Dec 11, 2023
Applied rules:
* LongArrayToShortArrayRector
* TernaryToNullCoalescingRector
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ChangeSwitchToMatchRector (https://wiki.php.net/rfc/match_expression_v2)
* NullToStrictStringFuncCallArgRector
* TypedPropertyFromAssignsRector
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@nikic@enumag@okdewit@TysonAndre@FlorianSteenbuck@zlianon@TomasVotruba@someniatko@carusogabriel
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Implement "Constructor Promotion" - #5291

Closed
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion
Closed

Implement "Constructor Promotion"#5291
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion

Conversation

@nikic

@nikicnikic commented Mar 24, 2020

Copy link
Copy Markdown
Member

RFC: https://wiki.php.net/rfc/constructor_promotion

As recently discussed on list, this implements the following short hand syntax:

class Point {
publicfunction__construct(
publicfloat$x = 0.0,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}

This desugars to:

class Point {
publicfloat$x;
publicfloat$y;
publicfloat$z;
publicfunction__construct(
float$x = 0.0,
float$y = 0.0,
float$z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}

@nikicnikic added the RFC label Mar 24, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 2e86157 to 4200794CompareMarch 26, 2020 11:56
Comment threadZend/zend_compile.c Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could add a test of global functions/closures - I'd guess that the following snippet probably has a misleading error message (not sure what scope->properties_info is)

<?phpfunction__construct(public$x) {}

LGTM otherwise

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a test in 717134e, error message seems fine. Or did you expect something different there?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah sorry, I missed that you had function __construct() in particular in mind here. Changed the name in 7139cdc.

Still works fine though, because is_ctor above includes a check that scope is not null.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, didn't see the scope part of the check

@enumag

Copy link
Copy Markdown

Somehow I'm more interested in the TODO: Allow comma here. 😛

@okdewit

Copy link
Copy Markdown

@nikic Is there a reason to not go a step further, and use a "Kotlin style" syntax?

class Point (
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {
//
}

@nikic
nikicforce-pushed the constructor-promotion branch from 7139cdc to f3dbd18CompareApril 2, 2020 09:41
@TysonAndre

Copy link
Copy Markdown
Contributor
inline_function:
...
|	fn returns_ref '(' parameter_list ')' return_type backup_doc_comment T_DOUBLE_ARROW backup_fn_flags backup_lex_pos expr backup_fn_flags
{ $$ = zend_ast_create_decl(ZEND_AST_ARROW_FUNC, $2 | $12, $1, $7,
zend_string_init("{closure}", sizeof("{closure}") - 1, 0), $4, NULL,
zend_ast_create(ZEND_AST_RETURN, $11), $6);
((zend_ast_decl *) $$)->lex_pos = $10;
CG(extra_fn_flags) = $9; }

After this change, static arrow functions with parameters don't get the doc comments parsed properly in Reflection.

It should be easy to fix by changing fn returns_ref '(' parameter_list ')' return_type backup_doc_comment to fn returns_ref backup_doc_comment '(' parameter_list ')' return_type and renumbering $n, unless there's a reason not to.

An example of affected code: $c = /** doc comment */ static fn(?int... $args): array => $args;

@carusogabrielcarusogabriel added this to the PHP 8.0 milestone May 30, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 150d893 to 1a9dfafCompareJune 5, 2020 10:00
@nikic

nikic commented Jun 5, 2020

Copy link
Copy Markdown
MemberAuthor

@TysonAndre Nice catch! It should be fixed now.

public function __construct(
public float $x = 0.0,
public float $y = 1.0,
public float $z = 2.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the RFC code example the trailing comma is allowed, but not here.

Which is correct?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the subject of different RFC

@TomasVotrubaTomasVotrubaJun 14, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FlorianSteenbuck

Copy link
Copy Markdown

Is there any reflection possibility for visibility ?

@nikic

nikic commented Jan 5, 2021

Copy link
Copy Markdown
MemberAuthor

@FlorianSteenbuck The visibility should be accessible through ReflectionProperty as usual.

@FlorianSteenbuck

FlorianSteenbuck commented Jan 5, 2021

Copy link
Copy Markdown

@nikic ok: https://3v4l.org/JsbXT

<?phpclass Point {
publicfunction__construct(
publicfloat$x,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}
foreach ((newReflectionClass(Point::class))->getProperties() as$property) {
var_dump($property->name);
}
string(1) "x"
string(1) "y"
string(1) "z"

@zlianon

Copy link
Copy Markdown

@nikic what is the reason for which it is not allowed to declare promoted property in an abstract constructor?

interface InstructionInterface
{
/** * InstructionInterface constructor. * * @param mixed $operand */publicfunction__construct(
privatemixed$operand,
);
/** * @param SplStack $stack */publicfunction__invoke(SplStack$stack): void;
}

@nikic

nikic commented May 5, 2021

Copy link
Copy Markdown
MemberAuthor

Promoted properties combine a property declaration with initialization of that property in the constructor. There is no way to initialize the property in an abstract constructor.

Your example is doubly illegal because it would also require declaring a property in an interface, which is not allowed.

franzholz added a commit to franzholz/typo3db_legacy that referenced this pull request Jan 15, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* StrStartsWithRector (https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions)
* NullToStrictStringFuncCallArgRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
georgfranz added a commit to franz-agency/zetacomponents-Database that referenced this pull request Dec 11, 2023
Applied rules:
* LongArrayToShortArrayRector
* TernaryToNullCoalescingRector
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ChangeSwitchToMatchRector (https://wiki.php.net/rfc/match_expression_v2)
* NullToStrictStringFuncCallArgRector
* TypedPropertyFromAssignsRector
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@nikic@enumag@okdewit@TysonAndre@FlorianSteenbuck@zlianon@TomasVotruba@someniatko@carusogabriel
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement "Constructor Promotion" - #5291

Closed
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion
Closed

Implement "Constructor Promotion"#5291
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion

Conversation

@nikic

@nikicnikic commented Mar 24, 2020

Copy link
Copy Markdown
Member

RFC: https://wiki.php.net/rfc/constructor_promotion

As recently discussed on list, this implements the following short hand syntax:

class Point {
publicfunction__construct(
publicfloat$x = 0.0,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}

This desugars to:

class Point {
publicfloat$x;
publicfloat$y;
publicfloat$z;
publicfunction__construct(
float$x = 0.0,
float$y = 0.0,
float$z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}

@nikicnikic added the RFC label Mar 24, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 2e86157 to 4200794CompareMarch 26, 2020 11:56
Comment threadZend/zend_compile.c Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could add a test of global functions/closures - I'd guess that the following snippet probably has a misleading error message (not sure what scope->properties_info is)

<?phpfunction__construct(public$x) {}

LGTM otherwise

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a test in 717134e, error message seems fine. Or did you expect something different there?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah sorry, I missed that you had function __construct() in particular in mind here. Changed the name in 7139cdc.

Still works fine though, because is_ctor above includes a check that scope is not null.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, didn't see the scope part of the check

@enumag

Copy link
Copy Markdown

Somehow I'm more interested in the TODO: Allow comma here. 😛

@okdewit

Copy link
Copy Markdown

@nikic Is there a reason to not go a step further, and use a "Kotlin style" syntax?

class Point (
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {
//
}

@nikic
nikicforce-pushed the constructor-promotion branch from 7139cdc to f3dbd18CompareApril 2, 2020 09:41
@TysonAndre

Copy link
Copy Markdown
Contributor
inline_function:
...
|	fn returns_ref '(' parameter_list ')' return_type backup_doc_comment T_DOUBLE_ARROW backup_fn_flags backup_lex_pos expr backup_fn_flags
{ $$ = zend_ast_create_decl(ZEND_AST_ARROW_FUNC, $2 | $12, $1, $7,
zend_string_init("{closure}", sizeof("{closure}") - 1, 0), $4, NULL,
zend_ast_create(ZEND_AST_RETURN, $11), $6);
((zend_ast_decl *) $$)->lex_pos = $10;
CG(extra_fn_flags) = $9; }

After this change, static arrow functions with parameters don't get the doc comments parsed properly in Reflection.

It should be easy to fix by changing fn returns_ref '(' parameter_list ')' return_type backup_doc_comment to fn returns_ref backup_doc_comment '(' parameter_list ')' return_type and renumbering $n, unless there's a reason not to.

An example of affected code: $c = /** doc comment */ static fn(?int... $args): array => $args;

@carusogabrielcarusogabriel added this to the PHP 8.0 milestone May 30, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 150d893 to 1a9dfafCompareJune 5, 2020 10:00
@nikic

nikic commented Jun 5, 2020

Copy link
Copy Markdown
MemberAuthor

@TysonAndre Nice catch! It should be fixed now.

public function __construct(
public float $x = 0.0,
public float $y = 1.0,
public float $z = 2.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the RFC code example the trailing comma is allowed, but not here.

Which is correct?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the subject of different RFC

@TomasVotrubaTomasVotrubaJun 14, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FlorianSteenbuck

Copy link
Copy Markdown

Is there any reflection possibility for visibility ?

@nikic

nikic commented Jan 5, 2021

Copy link
Copy Markdown
MemberAuthor

@FlorianSteenbuck The visibility should be accessible through ReflectionProperty as usual.

@FlorianSteenbuck

FlorianSteenbuck commented Jan 5, 2021

Copy link
Copy Markdown

@nikic ok: https://3v4l.org/JsbXT

<?phpclass Point {
publicfunction__construct(
publicfloat$x,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}
foreach ((newReflectionClass(Point::class))->getProperties() as$property) {
var_dump($property->name);
}
string(1) "x"
string(1) "y"
string(1) "z"

@zlianon

Copy link
Copy Markdown

@nikic what is the reason for which it is not allowed to declare promoted property in an abstract constructor?

interface InstructionInterface
{
/** * InstructionInterface constructor. * * @param mixed $operand */publicfunction__construct(
privatemixed$operand,
);
/** * @param SplStack $stack */publicfunction__invoke(SplStack$stack): void;
}

@nikic

nikic commented May 5, 2021

Copy link
Copy Markdown
MemberAuthor

Promoted properties combine a property declaration with initialization of that property in the constructor. There is no way to initialize the property in an abstract constructor.

Your example is doubly illegal because it would also require declaring a property in an interface, which is not allowed.

franzholz added a commit to franzholz/typo3db_legacy that referenced this pull request Jan 15, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* StrStartsWithRector (https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions)
* NullToStrictStringFuncCallArgRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
georgfranz added a commit to franz-agency/zetacomponents-Database that referenced this pull request Dec 11, 2023
Applied rules:
* LongArrayToShortArrayRector
* TernaryToNullCoalescingRector
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ChangeSwitchToMatchRector (https://wiki.php.net/rfc/match_expression_v2)
* NullToStrictStringFuncCallArgRector
* TypedPropertyFromAssignsRector
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@nikic@enumag@okdewit@TysonAndre@FlorianSteenbuck@zlianon@TomasVotruba@someniatko@carusogabriel
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement "Constructor Promotion" - #5291

Closed
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion
Closed

Implement "Constructor Promotion"#5291
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion

Conversation

@nikic

@nikicnikic commented Mar 24, 2020

Copy link
Copy Markdown
Member

RFC: https://wiki.php.net/rfc/constructor_promotion

As recently discussed on list, this implements the following short hand syntax:

class Point {
publicfunction__construct(
publicfloat$x = 0.0,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}

This desugars to:

class Point {
publicfloat$x;
publicfloat$y;
publicfloat$z;
publicfunction__construct(
float$x = 0.0,
float$y = 0.0,
float$z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}

@nikicnikic added the RFC label Mar 24, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 2e86157 to 4200794CompareMarch 26, 2020 11:56
Comment threadZend/zend_compile.c Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could add a test of global functions/closures - I'd guess that the following snippet probably has a misleading error message (not sure what scope->properties_info is)

<?phpfunction__construct(public$x) {}

LGTM otherwise

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a test in 717134e, error message seems fine. Or did you expect something different there?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah sorry, I missed that you had function __construct() in particular in mind here. Changed the name in 7139cdc.

Still works fine though, because is_ctor above includes a check that scope is not null.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, didn't see the scope part of the check

@enumag

Copy link
Copy Markdown

Somehow I'm more interested in the TODO: Allow comma here. 😛

@okdewit

Copy link
Copy Markdown

@nikic Is there a reason to not go a step further, and use a "Kotlin style" syntax?

class Point (
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {
//
}

@nikic
nikicforce-pushed the constructor-promotion branch from 7139cdc to f3dbd18CompareApril 2, 2020 09:41
@TysonAndre

Copy link
Copy Markdown
Contributor
inline_function:
...
|	fn returns_ref '(' parameter_list ')' return_type backup_doc_comment T_DOUBLE_ARROW backup_fn_flags backup_lex_pos expr backup_fn_flags
{ $$ = zend_ast_create_decl(ZEND_AST_ARROW_FUNC, $2 | $12, $1, $7,
zend_string_init("{closure}", sizeof("{closure}") - 1, 0), $4, NULL,
zend_ast_create(ZEND_AST_RETURN, $11), $6);
((zend_ast_decl *) $$)->lex_pos = $10;
CG(extra_fn_flags) = $9; }

After this change, static arrow functions with parameters don't get the doc comments parsed properly in Reflection.

It should be easy to fix by changing fn returns_ref '(' parameter_list ')' return_type backup_doc_comment to fn returns_ref backup_doc_comment '(' parameter_list ')' return_type and renumbering $n, unless there's a reason not to.

An example of affected code: $c = /** doc comment */ static fn(?int... $args): array => $args;

@carusogabrielcarusogabriel added this to the PHP 8.0 milestone May 30, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 150d893 to 1a9dfafCompareJune 5, 2020 10:00
@nikic

nikic commented Jun 5, 2020

Copy link
Copy Markdown
MemberAuthor

@TysonAndre Nice catch! It should be fixed now.

public function __construct(
public float $x = 0.0,
public float $y = 1.0,
public float $z = 2.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the RFC code example the trailing comma is allowed, but not here.

Which is correct?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the subject of different RFC

@TomasVotrubaTomasVotrubaJun 14, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FlorianSteenbuck

Copy link
Copy Markdown

Is there any reflection possibility for visibility ?

@nikic

nikic commented Jan 5, 2021

Copy link
Copy Markdown
MemberAuthor

@FlorianSteenbuck The visibility should be accessible through ReflectionProperty as usual.

@FlorianSteenbuck

FlorianSteenbuck commented Jan 5, 2021

Copy link
Copy Markdown

@nikic ok: https://3v4l.org/JsbXT

<?phpclass Point {
publicfunction__construct(
publicfloat$x,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}
foreach ((newReflectionClass(Point::class))->getProperties() as$property) {
var_dump($property->name);
}
string(1) "x"
string(1) "y"
string(1) "z"

@zlianon

Copy link
Copy Markdown

@nikic what is the reason for which it is not allowed to declare promoted property in an abstract constructor?

interface InstructionInterface
{
/** * InstructionInterface constructor. * * @param mixed $operand */publicfunction__construct(
privatemixed$operand,
);
/** * @param SplStack $stack */publicfunction__invoke(SplStack$stack): void;
}

@nikic

nikic commented May 5, 2021

Copy link
Copy Markdown
MemberAuthor

Promoted properties combine a property declaration with initialization of that property in the constructor. There is no way to initialize the property in an abstract constructor.

Your example is doubly illegal because it would also require declaring a property in an interface, which is not allowed.

franzholz added a commit to franzholz/typo3db_legacy that referenced this pull request Jan 15, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* StrStartsWithRector (https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions)
* NullToStrictStringFuncCallArgRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
georgfranz added a commit to franz-agency/zetacomponents-Database that referenced this pull request Dec 11, 2023
Applied rules:
* LongArrayToShortArrayRector
* TernaryToNullCoalescingRector
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ChangeSwitchToMatchRector (https://wiki.php.net/rfc/match_expression_v2)
* NullToStrictStringFuncCallArgRector
* TypedPropertyFromAssignsRector
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@nikic@enumag@okdewit@TysonAndre@FlorianSteenbuck@zlianon@TomasVotruba@someniatko@carusogabriel
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Implement "Constructor Promotion" - #5291

Closed
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion
Closed

Implement "Constructor Promotion"#5291
nikic wants to merge 8 commits into
php:masterfrom
nikic:constructor-promotion

Conversation

@nikic

@nikicnikic commented Mar 24, 2020

Copy link
Copy Markdown
Member

RFC: https://wiki.php.net/rfc/constructor_promotion

As recently discussed on list, this implements the following short hand syntax:

class Point {
publicfunction__construct(
publicfloat$x = 0.0,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}

This desugars to:

class Point {
publicfloat$x;
publicfloat$y;
publicfloat$z;
publicfunction__construct(
float$x = 0.0,
float$y = 0.0,
float$z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}

@nikicnikic added the RFC label Mar 24, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 2e86157 to 4200794CompareMarch 26, 2020 11:56
Comment threadZend/zend_compile.c Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could add a test of global functions/closures - I'd guess that the following snippet probably has a misleading error message (not sure what scope->properties_info is)

<?phpfunction__construct(public$x) {}

LGTM otherwise

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a test in 717134e, error message seems fine. Or did you expect something different there?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah sorry, I missed that you had function __construct() in particular in mind here. Changed the name in 7139cdc.

Still works fine though, because is_ctor above includes a check that scope is not null.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, didn't see the scope part of the check

@enumag

Copy link
Copy Markdown

Somehow I'm more interested in the TODO: Allow comma here. 😛

@okdewit

Copy link
Copy Markdown

@nikic Is there a reason to not go a step further, and use a "Kotlin style" syntax?

class Point (
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {
//
}

@nikic
nikicforce-pushed the constructor-promotion branch from 7139cdc to f3dbd18CompareApril 2, 2020 09:41
@TysonAndre

Copy link
Copy Markdown
Contributor
inline_function:
...
|	fn returns_ref '(' parameter_list ')' return_type backup_doc_comment T_DOUBLE_ARROW backup_fn_flags backup_lex_pos expr backup_fn_flags
{ $$ = zend_ast_create_decl(ZEND_AST_ARROW_FUNC, $2 | $12, $1, $7,
zend_string_init("{closure}", sizeof("{closure}") - 1, 0), $4, NULL,
zend_ast_create(ZEND_AST_RETURN, $11), $6);
((zend_ast_decl *) $$)->lex_pos = $10;
CG(extra_fn_flags) = $9; }

After this change, static arrow functions with parameters don't get the doc comments parsed properly in Reflection.

It should be easy to fix by changing fn returns_ref '(' parameter_list ')' return_type backup_doc_comment to fn returns_ref backup_doc_comment '(' parameter_list ')' return_type and renumbering $n, unless there's a reason not to.

An example of affected code: $c = /** doc comment */ static fn(?int... $args): array => $args;

@carusogabrielcarusogabriel added this to the PHP 8.0 milestone May 30, 2020
@nikic
nikicforce-pushed the constructor-promotion branch from 150d893 to 1a9dfafCompareJune 5, 2020 10:00
@nikic

nikic commented Jun 5, 2020

Copy link
Copy Markdown
MemberAuthor

@TysonAndre Nice catch! It should be fixed now.

public function __construct(
public float $x = 0.0,
public float $y = 1.0,
public float $z = 2.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the RFC code example the trailing comma is allowed, but not here.

Which is correct?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the subject of different RFC

@TomasVotrubaTomasVotrubaJun 14, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FlorianSteenbuck

Copy link
Copy Markdown

Is there any reflection possibility for visibility ?

@nikic

nikic commented Jan 5, 2021

Copy link
Copy Markdown
MemberAuthor

@FlorianSteenbuck The visibility should be accessible through ReflectionProperty as usual.

@FlorianSteenbuck

FlorianSteenbuck commented Jan 5, 2021

Copy link
Copy Markdown

@nikic ok: https://3v4l.org/JsbXT

<?phpclass Point {
publicfunction__construct(
publicfloat$x,
publicfloat$y = 0.0,
publicfloat$z = 0.0,
) {}
}
foreach ((newReflectionClass(Point::class))->getProperties() as$property) {
var_dump($property->name);
}
string(1) "x"
string(1) "y"
string(1) "z"

@zlianon

Copy link
Copy Markdown

@nikic what is the reason for which it is not allowed to declare promoted property in an abstract constructor?

interface InstructionInterface
{
/** * InstructionInterface constructor. * * @param mixed $operand */publicfunction__construct(
privatemixed$operand,
);
/** * @param SplStack $stack */publicfunction__invoke(SplStack$stack): void;
}

@nikic

nikic commented May 5, 2021

Copy link
Copy Markdown
MemberAuthor

Promoted properties combine a property declaration with initialization of that property in the constructor. There is no way to initialize the property in an abstract constructor.

Your example is doubly illegal because it would also require declaring a property in an interface, which is not allowed.

franzholz added a commit to franzholz/typo3db_legacy that referenced this pull request Jan 15, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Davidmattei added a commit to Davidmattei/elasticms that referenced this pull request Dec 1, 2022
Applied rules:
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* StrStartsWithRector (https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions)
* NullToStrictStringFuncCallArgRector
* ReadOnlyPropertyRector (https://wiki.php.net/rfc/readonly_properties_v2)
georgfranz added a commit to franz-agency/zetacomponents-Database that referenced this pull request Dec 11, 2023
Applied rules:
* LongArrayToShortArrayRector
* TernaryToNullCoalescingRector
* ClassPropertyAssignToConstructorPromotionRector (https://wiki.php.net/rfc/constructor_promotionphp/php-src#5291)
* MixedTypeRector
* ChangeSwitchToMatchRector (https://wiki.php.net/rfc/match_expression_v2)
* NullToStrictStringFuncCallArgRector
* TypedPropertyFromAssignsRector
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@nikic@enumag@okdewit@TysonAndre@FlorianSteenbuck@zlianon@TomasVotruba@someniatko@carusogabriel