Allow using readonly as function name - #7468

Closed
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword
Closed

Allow using readonly as function name#7468
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword

Conversation

@nikic

@nikicnikic commented Sep 6, 2021

Copy link
Copy Markdown
Member

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.

This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:

class Test {
public ReadOnly $foo;
}

This should now be interpreted as a readonly property, not as a
read-write property with type ReadOnly. As such, a class with
name ReadOnly, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.

Based on the recent Twitter discussion, cc @jrfnl@ramsey@derickr. Unfortunately this is not such a clean case as enum, because we can only fully support the function case.

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.
This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:
class Test {
public ReadOnly $foo;
}
This should now be interpreted as a readonly property, not as a
read-write property with type `ReadOnly`. As such, a class with
name `ReadOnly`, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.
@jrfnl

jrfnl commented Sep 6, 2021

Copy link
Copy Markdown
Contributor

@nikic I, for one, very much appreciate this PR. This will significantly lessen the risk of "white screens of death" for end-users of WordPress, so would be great if this PR gets accepted.

@mvorisek

Copy link
Copy Markdown
Contributor

This should target PHP-8.1 otherwise it is quite useless.

@ramsey

Copy link
Copy Markdown
Member

This should target PHP-8.1 otherwise it is quite useless.

I'll discuss with the other 8.1 RMs.

@patrickallaert

Copy link
Copy Markdown
Contributor

We can't declare global functions:

publicfunctiontry() {}
publicfunctionthrow() {}
publicfunctiongoto() {}
publicfunctionpublic() {}
publicfunctionprotected() {}
publicfunctionprivate() {}
publicfunctiongoto() {}
publicfunctionglobal() {}
publicfunctionvar() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
  3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

@Girgias

Copy link
Copy Markdown
Member

We can't declare global functions:

public function try() {}
public function throw() {}
public function goto() {}
public function public() {}
public function protected() {}
public function private() {}
public function goto() {}
public function global() {}
public function var() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

1. Should it be allowed for now **and** in the future (PHP 8.2+)?
2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a `reserved keyword`?

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

@patrickallaert

Copy link
Copy Markdown
Contributor

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Unless I misunderstood something, we (RMs) are OK with this for PHP 8.1. (/cc @krakjoe / @ramsey)

@kamil-tekiela

Copy link
Copy Markdown
Member

Could we allow readonly only temporarily and with a deprecation message? I don't feel like this is the right solution in the long term.

@ramsey

Copy link
Copy Markdown
Member

As @patrickallaert said, this is approved to target PHP-8.1.

@jrfnl

jrfnl commented Sep 9, 2021

Copy link
Copy Markdown
Contributor

I can't speak for WordPress, only for myself, however:

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?

I fully support this being a temporary exception and for a deprecation warning to be added together with this change.

Removing the exception in PHP 8.2 may be a bit soon. Would it be acceptable to remove it in PHP 9.0, similar to other deprecated functionality from the 8.x series?

For context:
I know WP has created an alternative function name (in the global namespace, but prefixed with wp_) and will actively encourage plugin/theme authors to update their code.

Having said that, not all plugins/themes are still actively maintained, so having some more time will allow a) enough actively maintained plugins/themes to be fixed up and b) enough end-users to find alternative plugins/themes if the plugin/themes is no longer maintained.

  1. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

As an active maintainer of various PHPCS based coding standards as well as contributor to PHPCS itself, I agree, yes, this will make it more difficult.
Then again, there are already multiple different sets of rules in place for different types of keywords, so this is just one more to add to that list.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Actually I did raise this same concern before: #7089 (comment)

@krakjoe

Copy link
Copy Markdown
Member

Merged as 76348f3

Thanks.

@krakjoekrakjoe closed this Sep 13, 2021
@jrfnl

Copy link
Copy Markdown
Contributor

Thank you all for still making this change this late in the cycle 🙏🏻 💞

jrfnl added a commit to PHPCompatibility/PHPCompatibility that referenced this pull request Dec 4, 2022
… names
PHP 8.0 introduced `match` as a new reserved keyword and `mixed` as a new "other" reserved keyword.
PHP 8.1 introduced `readonly` as a new reserved keyword, `never` as an "other" reserved keyword and `enum` as a soft reserved keyword.
Note: `readonly` has an exception for when it is used as a function declaration name.
Includes regenerated test case files.
Refs:
* https://wiki.php.net/rfc/match_expression_v2
* https://wiki.php.net/rfc/mixed_type_v2#backward_incompatible_changes
* https://wiki.php.net/rfc/readonly_properties_v2
* https://wiki.php.net/rfc/enumerations
* https://wiki.php.net/rfc/noreturn_type#backwards_incompatible_changes
* php/php-src#7468 (readonly exception in PHP 8.1)
* php/php-src#9512 (readonly exception PHP 8.2 follow-up)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@nikic@jrfnl@mvorisek@ramsey@patrickallaert@Girgias@kamil-tekiela@krakjoe
, '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

Allow using readonly as function name - #7468

Closed
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword
Closed

Allow using readonly as function name#7468
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword

Conversation

@nikic

@nikicnikic commented Sep 6, 2021

Copy link
Copy Markdown
Member

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.

This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:

class Test {
public ReadOnly $foo;
}

This should now be interpreted as a readonly property, not as a
read-write property with type ReadOnly. As such, a class with
name ReadOnly, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.

Based on the recent Twitter discussion, cc @jrfnl@ramsey@derickr. Unfortunately this is not such a clean case as enum, because we can only fully support the function case.

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.
This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:
class Test {
public ReadOnly $foo;
}
This should now be interpreted as a readonly property, not as a
read-write property with type `ReadOnly`. As such, a class with
name `ReadOnly`, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.
@jrfnl

jrfnl commented Sep 6, 2021

Copy link
Copy Markdown
Contributor

@nikic I, for one, very much appreciate this PR. This will significantly lessen the risk of "white screens of death" for end-users of WordPress, so would be great if this PR gets accepted.

@mvorisek

Copy link
Copy Markdown
Contributor

This should target PHP-8.1 otherwise it is quite useless.

@ramsey

Copy link
Copy Markdown
Member

This should target PHP-8.1 otherwise it is quite useless.

I'll discuss with the other 8.1 RMs.

@patrickallaert

Copy link
Copy Markdown
Contributor

We can't declare global functions:

publicfunctiontry() {}
publicfunctionthrow() {}
publicfunctiongoto() {}
publicfunctionpublic() {}
publicfunctionprotected() {}
publicfunctionprivate() {}
publicfunctiongoto() {}
publicfunctionglobal() {}
publicfunctionvar() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
  3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

@Girgias

Copy link
Copy Markdown
Member

We can't declare global functions:

public function try() {}
public function throw() {}
public function goto() {}
public function public() {}
public function protected() {}
public function private() {}
public function goto() {}
public function global() {}
public function var() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

1. Should it be allowed for now **and** in the future (PHP 8.2+)?
2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a `reserved keyword`?

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

@patrickallaert

Copy link
Copy Markdown
Contributor

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Unless I misunderstood something, we (RMs) are OK with this for PHP 8.1. (/cc @krakjoe / @ramsey)

@kamil-tekiela

Copy link
Copy Markdown
Member

Could we allow readonly only temporarily and with a deprecation message? I don't feel like this is the right solution in the long term.

@ramsey

Copy link
Copy Markdown
Member

As @patrickallaert said, this is approved to target PHP-8.1.

@jrfnl

jrfnl commented Sep 9, 2021

Copy link
Copy Markdown
Contributor

I can't speak for WordPress, only for myself, however:

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?

I fully support this being a temporary exception and for a deprecation warning to be added together with this change.

Removing the exception in PHP 8.2 may be a bit soon. Would it be acceptable to remove it in PHP 9.0, similar to other deprecated functionality from the 8.x series?

For context:
I know WP has created an alternative function name (in the global namespace, but prefixed with wp_) and will actively encourage plugin/theme authors to update their code.

Having said that, not all plugins/themes are still actively maintained, so having some more time will allow a) enough actively maintained plugins/themes to be fixed up and b) enough end-users to find alternative plugins/themes if the plugin/themes is no longer maintained.

  1. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

As an active maintainer of various PHPCS based coding standards as well as contributor to PHPCS itself, I agree, yes, this will make it more difficult.
Then again, there are already multiple different sets of rules in place for different types of keywords, so this is just one more to add to that list.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Actually I did raise this same concern before: #7089 (comment)

@krakjoe

Copy link
Copy Markdown
Member

Merged as 76348f3

Thanks.

@krakjoekrakjoe closed this Sep 13, 2021
@jrfnl

Copy link
Copy Markdown
Contributor

Thank you all for still making this change this late in the cycle 🙏🏻 💞

jrfnl added a commit to PHPCompatibility/PHPCompatibility that referenced this pull request Dec 4, 2022
… names
PHP 8.0 introduced `match` as a new reserved keyword and `mixed` as a new "other" reserved keyword.
PHP 8.1 introduced `readonly` as a new reserved keyword, `never` as an "other" reserved keyword and `enum` as a soft reserved keyword.
Note: `readonly` has an exception for when it is used as a function declaration name.
Includes regenerated test case files.
Refs:
* https://wiki.php.net/rfc/match_expression_v2
* https://wiki.php.net/rfc/mixed_type_v2#backward_incompatible_changes
* https://wiki.php.net/rfc/readonly_properties_v2
* https://wiki.php.net/rfc/enumerations
* https://wiki.php.net/rfc/noreturn_type#backwards_incompatible_changes
* php/php-src#7468 (readonly exception in PHP 8.1)
* php/php-src#9512 (readonly exception PHP 8.2 follow-up)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@nikic@jrfnl@mvorisek@ramsey@patrickallaert@Girgias@kamil-tekiela@krakjoe
, '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

Allow using readonly as function name - #7468

Closed
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword
Closed

Allow using readonly as function name#7468
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword

Conversation

@nikic

@nikicnikic commented Sep 6, 2021

Copy link
Copy Markdown
Member

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.

This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:

class Test {
public ReadOnly $foo;
}

This should now be interpreted as a readonly property, not as a
read-write property with type ReadOnly. As such, a class with
name ReadOnly, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.

Based on the recent Twitter discussion, cc @jrfnl@ramsey@derickr. Unfortunately this is not such a clean case as enum, because we can only fully support the function case.

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.
This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:
class Test {
public ReadOnly $foo;
}
This should now be interpreted as a readonly property, not as a
read-write property with type `ReadOnly`. As such, a class with
name `ReadOnly`, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.
@jrfnl

jrfnl commented Sep 6, 2021

Copy link
Copy Markdown
Contributor

@nikic I, for one, very much appreciate this PR. This will significantly lessen the risk of "white screens of death" for end-users of WordPress, so would be great if this PR gets accepted.

@mvorisek

Copy link
Copy Markdown
Contributor

This should target PHP-8.1 otherwise it is quite useless.

@ramsey

Copy link
Copy Markdown
Member

This should target PHP-8.1 otherwise it is quite useless.

I'll discuss with the other 8.1 RMs.

@patrickallaert

Copy link
Copy Markdown
Contributor

We can't declare global functions:

publicfunctiontry() {}
publicfunctionthrow() {}
publicfunctiongoto() {}
publicfunctionpublic() {}
publicfunctionprotected() {}
publicfunctionprivate() {}
publicfunctiongoto() {}
publicfunctionglobal() {}
publicfunctionvar() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
  3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

@Girgias

Copy link
Copy Markdown
Member

We can't declare global functions:

public function try() {}
public function throw() {}
public function goto() {}
public function public() {}
public function protected() {}
public function private() {}
public function goto() {}
public function global() {}
public function var() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

1. Should it be allowed for now **and** in the future (PHP 8.2+)?
2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a `reserved keyword`?

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

@patrickallaert

Copy link
Copy Markdown
Contributor

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Unless I misunderstood something, we (RMs) are OK with this for PHP 8.1. (/cc @krakjoe / @ramsey)

@kamil-tekiela

Copy link
Copy Markdown
Member

Could we allow readonly only temporarily and with a deprecation message? I don't feel like this is the right solution in the long term.

@ramsey

Copy link
Copy Markdown
Member

As @patrickallaert said, this is approved to target PHP-8.1.

@jrfnl

jrfnl commented Sep 9, 2021

Copy link
Copy Markdown
Contributor

I can't speak for WordPress, only for myself, however:

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?

I fully support this being a temporary exception and for a deprecation warning to be added together with this change.

Removing the exception in PHP 8.2 may be a bit soon. Would it be acceptable to remove it in PHP 9.0, similar to other deprecated functionality from the 8.x series?

For context:
I know WP has created an alternative function name (in the global namespace, but prefixed with wp_) and will actively encourage plugin/theme authors to update their code.

Having said that, not all plugins/themes are still actively maintained, so having some more time will allow a) enough actively maintained plugins/themes to be fixed up and b) enough end-users to find alternative plugins/themes if the plugin/themes is no longer maintained.

  1. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

As an active maintainer of various PHPCS based coding standards as well as contributor to PHPCS itself, I agree, yes, this will make it more difficult.
Then again, there are already multiple different sets of rules in place for different types of keywords, so this is just one more to add to that list.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Actually I did raise this same concern before: #7089 (comment)

@krakjoe

Copy link
Copy Markdown
Member

Merged as 76348f3

Thanks.

@krakjoekrakjoe closed this Sep 13, 2021
@jrfnl

Copy link
Copy Markdown
Contributor

Thank you all for still making this change this late in the cycle 🙏🏻 💞

jrfnl added a commit to PHPCompatibility/PHPCompatibility that referenced this pull request Dec 4, 2022
… names
PHP 8.0 introduced `match` as a new reserved keyword and `mixed` as a new "other" reserved keyword.
PHP 8.1 introduced `readonly` as a new reserved keyword, `never` as an "other" reserved keyword and `enum` as a soft reserved keyword.
Note: `readonly` has an exception for when it is used as a function declaration name.
Includes regenerated test case files.
Refs:
* https://wiki.php.net/rfc/match_expression_v2
* https://wiki.php.net/rfc/mixed_type_v2#backward_incompatible_changes
* https://wiki.php.net/rfc/readonly_properties_v2
* https://wiki.php.net/rfc/enumerations
* https://wiki.php.net/rfc/noreturn_type#backwards_incompatible_changes
* php/php-src#7468 (readonly exception in PHP 8.1)
* php/php-src#9512 (readonly exception PHP 8.2 follow-up)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@nikic@jrfnl@mvorisek@ramsey@patrickallaert@Girgias@kamil-tekiela@krakjoe
, '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

Allow using readonly as function name - #7468

Closed
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword
Closed

Allow using readonly as function name#7468
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword

Conversation

@nikic

@nikicnikic commented Sep 6, 2021

Copy link
Copy Markdown
Member

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.

This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:

class Test {
public ReadOnly $foo;
}

This should now be interpreted as a readonly property, not as a
read-write property with type ReadOnly. As such, a class with
name ReadOnly, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.

Based on the recent Twitter discussion, cc @jrfnl@ramsey@derickr. Unfortunately this is not such a clean case as enum, because we can only fully support the function case.

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.
This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:
class Test {
public ReadOnly $foo;
}
This should now be interpreted as a readonly property, not as a
read-write property with type `ReadOnly`. As such, a class with
name `ReadOnly`, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.
@jrfnl

jrfnl commented Sep 6, 2021

Copy link
Copy Markdown
Contributor

@nikic I, for one, very much appreciate this PR. This will significantly lessen the risk of "white screens of death" for end-users of WordPress, so would be great if this PR gets accepted.

@mvorisek

Copy link
Copy Markdown
Contributor

This should target PHP-8.1 otherwise it is quite useless.

@ramsey

Copy link
Copy Markdown
Member

This should target PHP-8.1 otherwise it is quite useless.

I'll discuss with the other 8.1 RMs.

@patrickallaert

Copy link
Copy Markdown
Contributor

We can't declare global functions:

publicfunctiontry() {}
publicfunctionthrow() {}
publicfunctiongoto() {}
publicfunctionpublic() {}
publicfunctionprotected() {}
publicfunctionprivate() {}
publicfunctiongoto() {}
publicfunctionglobal() {}
publicfunctionvar() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
  3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

@Girgias

Copy link
Copy Markdown
Member

We can't declare global functions:

public function try() {}
public function throw() {}
public function goto() {}
public function public() {}
public function protected() {}
public function private() {}
public function goto() {}
public function global() {}
public function var() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

1. Should it be allowed for now **and** in the future (PHP 8.2+)?
2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a `reserved keyword`?

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

@patrickallaert

Copy link
Copy Markdown
Contributor

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Unless I misunderstood something, we (RMs) are OK with this for PHP 8.1. (/cc @krakjoe / @ramsey)

@kamil-tekiela

Copy link
Copy Markdown
Member

Could we allow readonly only temporarily and with a deprecation message? I don't feel like this is the right solution in the long term.

@ramsey

Copy link
Copy Markdown
Member

As @patrickallaert said, this is approved to target PHP-8.1.

@jrfnl

jrfnl commented Sep 9, 2021

Copy link
Copy Markdown
Contributor

I can't speak for WordPress, only for myself, however:

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?

I fully support this being a temporary exception and for a deprecation warning to be added together with this change.

Removing the exception in PHP 8.2 may be a bit soon. Would it be acceptable to remove it in PHP 9.0, similar to other deprecated functionality from the 8.x series?

For context:
I know WP has created an alternative function name (in the global namespace, but prefixed with wp_) and will actively encourage plugin/theme authors to update their code.

Having said that, not all plugins/themes are still actively maintained, so having some more time will allow a) enough actively maintained plugins/themes to be fixed up and b) enough end-users to find alternative plugins/themes if the plugin/themes is no longer maintained.

  1. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

As an active maintainer of various PHPCS based coding standards as well as contributor to PHPCS itself, I agree, yes, this will make it more difficult.
Then again, there are already multiple different sets of rules in place for different types of keywords, so this is just one more to add to that list.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Actually I did raise this same concern before: #7089 (comment)

@krakjoe

Copy link
Copy Markdown
Member

Merged as 76348f3

Thanks.

@krakjoekrakjoe closed this Sep 13, 2021
@jrfnl

Copy link
Copy Markdown
Contributor

Thank you all for still making this change this late in the cycle 🙏🏻 💞

jrfnl added a commit to PHPCompatibility/PHPCompatibility that referenced this pull request Dec 4, 2022
… names
PHP 8.0 introduced `match` as a new reserved keyword and `mixed` as a new "other" reserved keyword.
PHP 8.1 introduced `readonly` as a new reserved keyword, `never` as an "other" reserved keyword and `enum` as a soft reserved keyword.
Note: `readonly` has an exception for when it is used as a function declaration name.
Includes regenerated test case files.
Refs:
* https://wiki.php.net/rfc/match_expression_v2
* https://wiki.php.net/rfc/mixed_type_v2#backward_incompatible_changes
* https://wiki.php.net/rfc/readonly_properties_v2
* https://wiki.php.net/rfc/enumerations
* https://wiki.php.net/rfc/noreturn_type#backwards_incompatible_changes
* php/php-src#7468 (readonly exception in PHP 8.1)
* php/php-src#9512 (readonly exception PHP 8.2 follow-up)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@nikic@jrfnl@mvorisek@ramsey@patrickallaert@Girgias@kamil-tekiela@krakjoe
, '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

Allow using readonly as function name - #7468

Closed
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword
Closed

Allow using readonly as function name#7468
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword

Conversation

@nikic

@nikicnikic commented Sep 6, 2021

Copy link
Copy Markdown
Member

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.

This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:

class Test {
public ReadOnly $foo;
}

This should now be interpreted as a readonly property, not as a
read-write property with type ReadOnly. As such, a class with
name ReadOnly, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.

Based on the recent Twitter discussion, cc @jrfnl@ramsey@derickr. Unfortunately this is not such a clean case as enum, because we can only fully support the function case.

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.
This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:
class Test {
public ReadOnly $foo;
}
This should now be interpreted as a readonly property, not as a
read-write property with type `ReadOnly`. As such, a class with
name `ReadOnly`, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.
@jrfnl

jrfnl commented Sep 6, 2021

Copy link
Copy Markdown
Contributor

@nikic I, for one, very much appreciate this PR. This will significantly lessen the risk of "white screens of death" for end-users of WordPress, so would be great if this PR gets accepted.

@mvorisek

Copy link
Copy Markdown
Contributor

This should target PHP-8.1 otherwise it is quite useless.

@ramsey

Copy link
Copy Markdown
Member

This should target PHP-8.1 otherwise it is quite useless.

I'll discuss with the other 8.1 RMs.

@patrickallaert

Copy link
Copy Markdown
Contributor

We can't declare global functions:

publicfunctiontry() {}
publicfunctionthrow() {}
publicfunctiongoto() {}
publicfunctionpublic() {}
publicfunctionprotected() {}
publicfunctionprivate() {}
publicfunctiongoto() {}
publicfunctionglobal() {}
publicfunctionvar() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
  3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

@Girgias

Copy link
Copy Markdown
Member

We can't declare global functions:

public function try() {}
public function throw() {}
public function goto() {}
public function public() {}
public function protected() {}
public function private() {}
public function goto() {}
public function global() {}
public function var() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

1. Should it be allowed for now **and** in the future (PHP 8.2+)?
2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a `reserved keyword`?

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

@patrickallaert

Copy link
Copy Markdown
Contributor

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Unless I misunderstood something, we (RMs) are OK with this for PHP 8.1. (/cc @krakjoe / @ramsey)

@kamil-tekiela

Copy link
Copy Markdown
Member

Could we allow readonly only temporarily and with a deprecation message? I don't feel like this is the right solution in the long term.

@ramsey

Copy link
Copy Markdown
Member

As @patrickallaert said, this is approved to target PHP-8.1.

@jrfnl

jrfnl commented Sep 9, 2021

Copy link
Copy Markdown
Contributor

I can't speak for WordPress, only for myself, however:

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?

I fully support this being a temporary exception and for a deprecation warning to be added together with this change.

Removing the exception in PHP 8.2 may be a bit soon. Would it be acceptable to remove it in PHP 9.0, similar to other deprecated functionality from the 8.x series?

For context:
I know WP has created an alternative function name (in the global namespace, but prefixed with wp_) and will actively encourage plugin/theme authors to update their code.

Having said that, not all plugins/themes are still actively maintained, so having some more time will allow a) enough actively maintained plugins/themes to be fixed up and b) enough end-users to find alternative plugins/themes if the plugin/themes is no longer maintained.

  1. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

As an active maintainer of various PHPCS based coding standards as well as contributor to PHPCS itself, I agree, yes, this will make it more difficult.
Then again, there are already multiple different sets of rules in place for different types of keywords, so this is just one more to add to that list.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Actually I did raise this same concern before: #7089 (comment)

@krakjoe

Copy link
Copy Markdown
Member

Merged as 76348f3

Thanks.

@krakjoekrakjoe closed this Sep 13, 2021
@jrfnl

Copy link
Copy Markdown
Contributor

Thank you all for still making this change this late in the cycle 🙏🏻 💞

jrfnl added a commit to PHPCompatibility/PHPCompatibility that referenced this pull request Dec 4, 2022
… names
PHP 8.0 introduced `match` as a new reserved keyword and `mixed` as a new "other" reserved keyword.
PHP 8.1 introduced `readonly` as a new reserved keyword, `never` as an "other" reserved keyword and `enum` as a soft reserved keyword.
Note: `readonly` has an exception for when it is used as a function declaration name.
Includes regenerated test case files.
Refs:
* https://wiki.php.net/rfc/match_expression_v2
* https://wiki.php.net/rfc/mixed_type_v2#backward_incompatible_changes
* https://wiki.php.net/rfc/readonly_properties_v2
* https://wiki.php.net/rfc/enumerations
* https://wiki.php.net/rfc/noreturn_type#backwards_incompatible_changes
* php/php-src#7468 (readonly exception in PHP 8.1)
* php/php-src#9512 (readonly exception PHP 8.2 follow-up)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@nikic@jrfnl@mvorisek@ramsey@patrickallaert@Girgias@kamil-tekiela@krakjoe
, '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

Allow using readonly as function name - #7468

Closed
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword
Closed

Allow using readonly as function name#7468
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword

Conversation

@nikic

@nikicnikic commented Sep 6, 2021

Copy link
Copy Markdown
Member

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.

This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:

class Test {
public ReadOnly $foo;
}

This should now be interpreted as a readonly property, not as a
read-write property with type ReadOnly. As such, a class with
name ReadOnly, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.

Based on the recent Twitter discussion, cc @jrfnl@ramsey@derickr. Unfortunately this is not such a clean case as enum, because we can only fully support the function case.

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.
This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:
class Test {
public ReadOnly $foo;
}
This should now be interpreted as a readonly property, not as a
read-write property with type `ReadOnly`. As such, a class with
name `ReadOnly`, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.
@jrfnl

jrfnl commented Sep 6, 2021

Copy link
Copy Markdown
Contributor

@nikic I, for one, very much appreciate this PR. This will significantly lessen the risk of "white screens of death" for end-users of WordPress, so would be great if this PR gets accepted.

@mvorisek

Copy link
Copy Markdown
Contributor

This should target PHP-8.1 otherwise it is quite useless.

@ramsey

Copy link
Copy Markdown
Member

This should target PHP-8.1 otherwise it is quite useless.

I'll discuss with the other 8.1 RMs.

@patrickallaert

Copy link
Copy Markdown
Contributor

We can't declare global functions:

publicfunctiontry() {}
publicfunctionthrow() {}
publicfunctiongoto() {}
publicfunctionpublic() {}
publicfunctionprotected() {}
publicfunctionprivate() {}
publicfunctiongoto() {}
publicfunctionglobal() {}
publicfunctionvar() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
  3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

@Girgias

Copy link
Copy Markdown
Member

We can't declare global functions:

public function try() {}
public function throw() {}
public function goto() {}
public function public() {}
public function protected() {}
public function private() {}
public function goto() {}
public function global() {}
public function var() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

1. Should it be allowed for now **and** in the future (PHP 8.2+)?
2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a `reserved keyword`?

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

@patrickallaert

Copy link
Copy Markdown
Contributor

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Unless I misunderstood something, we (RMs) are OK with this for PHP 8.1. (/cc @krakjoe / @ramsey)

@kamil-tekiela

Copy link
Copy Markdown
Member

Could we allow readonly only temporarily and with a deprecation message? I don't feel like this is the right solution in the long term.

@ramsey

Copy link
Copy Markdown
Member

As @patrickallaert said, this is approved to target PHP-8.1.

@jrfnl

jrfnl commented Sep 9, 2021

Copy link
Copy Markdown
Contributor

I can't speak for WordPress, only for myself, however:

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?

I fully support this being a temporary exception and for a deprecation warning to be added together with this change.

Removing the exception in PHP 8.2 may be a bit soon. Would it be acceptable to remove it in PHP 9.0, similar to other deprecated functionality from the 8.x series?

For context:
I know WP has created an alternative function name (in the global namespace, but prefixed with wp_) and will actively encourage plugin/theme authors to update their code.

Having said that, not all plugins/themes are still actively maintained, so having some more time will allow a) enough actively maintained plugins/themes to be fixed up and b) enough end-users to find alternative plugins/themes if the plugin/themes is no longer maintained.

  1. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

As an active maintainer of various PHPCS based coding standards as well as contributor to PHPCS itself, I agree, yes, this will make it more difficult.
Then again, there are already multiple different sets of rules in place for different types of keywords, so this is just one more to add to that list.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Actually I did raise this same concern before: #7089 (comment)

@krakjoe

Copy link
Copy Markdown
Member

Merged as 76348f3

Thanks.

@krakjoekrakjoe closed this Sep 13, 2021
@jrfnl

Copy link
Copy Markdown
Contributor

Thank you all for still making this change this late in the cycle 🙏🏻 💞

jrfnl added a commit to PHPCompatibility/PHPCompatibility that referenced this pull request Dec 4, 2022
… names
PHP 8.0 introduced `match` as a new reserved keyword and `mixed` as a new "other" reserved keyword.
PHP 8.1 introduced `readonly` as a new reserved keyword, `never` as an "other" reserved keyword and `enum` as a soft reserved keyword.
Note: `readonly` has an exception for when it is used as a function declaration name.
Includes regenerated test case files.
Refs:
* https://wiki.php.net/rfc/match_expression_v2
* https://wiki.php.net/rfc/mixed_type_v2#backward_incompatible_changes
* https://wiki.php.net/rfc/readonly_properties_v2
* https://wiki.php.net/rfc/enumerations
* https://wiki.php.net/rfc/noreturn_type#backwards_incompatible_changes
* php/php-src#7468 (readonly exception in PHP 8.1)
* php/php-src#9512 (readonly exception PHP 8.2 follow-up)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@nikic@jrfnl@mvorisek@ramsey@patrickallaert@Girgias@kamil-tekiela@krakjoe
, '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

Allow using readonly as function name - #7468

Closed
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword
Closed

Allow using readonly as function name#7468
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword

Conversation

@nikic

@nikicnikic commented Sep 6, 2021

Copy link
Copy Markdown
Member

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.

This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:

class Test {
public ReadOnly $foo;
}

This should now be interpreted as a readonly property, not as a
read-write property with type ReadOnly. As such, a class with
name ReadOnly, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.

Based on the recent Twitter discussion, cc @jrfnl@ramsey@derickr. Unfortunately this is not such a clean case as enum, because we can only fully support the function case.

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.
This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:
class Test {
public ReadOnly $foo;
}
This should now be interpreted as a readonly property, not as a
read-write property with type `ReadOnly`. As such, a class with
name `ReadOnly`, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.
@jrfnl

jrfnl commented Sep 6, 2021

Copy link
Copy Markdown
Contributor

@nikic I, for one, very much appreciate this PR. This will significantly lessen the risk of "white screens of death" for end-users of WordPress, so would be great if this PR gets accepted.

@mvorisek

Copy link
Copy Markdown
Contributor

This should target PHP-8.1 otherwise it is quite useless.

@ramsey

Copy link
Copy Markdown
Member

This should target PHP-8.1 otherwise it is quite useless.

I'll discuss with the other 8.1 RMs.

@patrickallaert

Copy link
Copy Markdown
Contributor

We can't declare global functions:

publicfunctiontry() {}
publicfunctionthrow() {}
publicfunctiongoto() {}
publicfunctionpublic() {}
publicfunctionprotected() {}
publicfunctionprivate() {}
publicfunctiongoto() {}
publicfunctionglobal() {}
publicfunctionvar() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
  3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

@Girgias

Copy link
Copy Markdown
Member

We can't declare global functions:

public function try() {}
public function throw() {}
public function goto() {}
public function public() {}
public function protected() {}
public function private() {}
public function goto() {}
public function global() {}
public function var() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

1. Should it be allowed for now **and** in the future (PHP 8.2+)?
2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a `reserved keyword`?

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

@patrickallaert

Copy link
Copy Markdown
Contributor

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Unless I misunderstood something, we (RMs) are OK with this for PHP 8.1. (/cc @krakjoe / @ramsey)

@kamil-tekiela

Copy link
Copy Markdown
Member

Could we allow readonly only temporarily and with a deprecation message? I don't feel like this is the right solution in the long term.

@ramsey

Copy link
Copy Markdown
Member

As @patrickallaert said, this is approved to target PHP-8.1.

@jrfnl

jrfnl commented Sep 9, 2021

Copy link
Copy Markdown
Contributor

I can't speak for WordPress, only for myself, however:

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?

I fully support this being a temporary exception and for a deprecation warning to be added together with this change.

Removing the exception in PHP 8.2 may be a bit soon. Would it be acceptable to remove it in PHP 9.0, similar to other deprecated functionality from the 8.x series?

For context:
I know WP has created an alternative function name (in the global namespace, but prefixed with wp_) and will actively encourage plugin/theme authors to update their code.

Having said that, not all plugins/themes are still actively maintained, so having some more time will allow a) enough actively maintained plugins/themes to be fixed up and b) enough end-users to find alternative plugins/themes if the plugin/themes is no longer maintained.

  1. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

As an active maintainer of various PHPCS based coding standards as well as contributor to PHPCS itself, I agree, yes, this will make it more difficult.
Then again, there are already multiple different sets of rules in place for different types of keywords, so this is just one more to add to that list.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Actually I did raise this same concern before: #7089 (comment)

@krakjoe

Copy link
Copy Markdown
Member

Merged as 76348f3

Thanks.

@krakjoekrakjoe closed this Sep 13, 2021
@jrfnl

Copy link
Copy Markdown
Contributor

Thank you all for still making this change this late in the cycle 🙏🏻 💞

jrfnl added a commit to PHPCompatibility/PHPCompatibility that referenced this pull request Dec 4, 2022
… names
PHP 8.0 introduced `match` as a new reserved keyword and `mixed` as a new "other" reserved keyword.
PHP 8.1 introduced `readonly` as a new reserved keyword, `never` as an "other" reserved keyword and `enum` as a soft reserved keyword.
Note: `readonly` has an exception for when it is used as a function declaration name.
Includes regenerated test case files.
Refs:
* https://wiki.php.net/rfc/match_expression_v2
* https://wiki.php.net/rfc/mixed_type_v2#backward_incompatible_changes
* https://wiki.php.net/rfc/readonly_properties_v2
* https://wiki.php.net/rfc/enumerations
* https://wiki.php.net/rfc/noreturn_type#backwards_incompatible_changes
* php/php-src#7468 (readonly exception in PHP 8.1)
* php/php-src#9512 (readonly exception PHP 8.2 follow-up)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@nikic@jrfnl@mvorisek@ramsey@patrickallaert@Girgias@kamil-tekiela@krakjoe
, '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

Allow using readonly as function name - #7468

Closed
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword
Closed

Allow using readonly as function name#7468
nikic wants to merge 1 commit into
php:masterfrom
nikic:readonly-keyword

Conversation

@nikic

@nikicnikic commented Sep 6, 2021

Copy link
Copy Markdown
Member

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.

This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:

class Test {
public ReadOnly $foo;
}

This should now be interpreted as a readonly property, not as a
read-write property with type ReadOnly. As such, a class with
name ReadOnly, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.

Based on the recent Twitter discussion, cc @jrfnl@ramsey@derickr. Unfortunately this is not such a clean case as enum, because we can only fully support the function case.

Don't treat "readonly" as a keyword if followed by "(". This
allows using it as a global function name. In particular, this
function has been used by WordPress.
This does not allow other uses of "readonly", in particular it
cannot be used as a class name, unlike "enum". The reason is that
we'd still have to recognize it as a keyword when using in a type
position:
class Test {
public ReadOnly $foo;
}
This should now be interpreted as a readonly property, not as a
read-write property with type `ReadOnly`. As such, a class with
name `ReadOnly`, while unambiguous in most other circumstances,
would not be usable as property or parameter type. For that
reason, we do not support it at all.
@jrfnl

jrfnl commented Sep 6, 2021

Copy link
Copy Markdown
Contributor

@nikic I, for one, very much appreciate this PR. This will significantly lessen the risk of "white screens of death" for end-users of WordPress, so would be great if this PR gets accepted.

@mvorisek

Copy link
Copy Markdown
Contributor

This should target PHP-8.1 otherwise it is quite useless.

@ramsey

Copy link
Copy Markdown
Member

This should target PHP-8.1 otherwise it is quite useless.

I'll discuss with the other 8.1 RMs.

@patrickallaert

Copy link
Copy Markdown
Contributor

We can't declare global functions:

publicfunctiontry() {}
publicfunctionthrow() {}
publicfunctiongoto() {}
publicfunctionpublic() {}
publicfunctionprotected() {}
publicfunctionprivate() {}
publicfunctiongoto() {}
publicfunctionglobal() {}
publicfunctionvar() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
  3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

@Girgias

Copy link
Copy Markdown
Member

We can't declare global functions:

public function try() {}
public function throw() {}
public function goto() {}
public function public() {}
public function protected() {}
public function private() {}
public function goto() {}
public function global() {}
public function var() {}
...

While we actually could as none of those keywords are used with a following (.

This would make the keyword readonly somewhat apart, also as being the only one allowed for a function in the global namespace but disallowed as a class in the same global namespace‽

This and being past RC1 doesn't make me super enthusiast about it.

1. Should it be allowed for now **and** in the future (PHP 8.2+)?
2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?
3. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a `reserved keyword`?

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

@patrickallaert

Copy link
Copy Markdown
Contributor

Counter-point the enum keyword is already apart and a function can be called enum in PHP 8.1.

I think allowing readonly is pretty much mandatory except if we want to leave the whole of WP behind, which ain't a good idea. Now if we should emit a deprecation notice in the future for these cases, this is up to debate and should follow the standard RFC process.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Unless I misunderstood something, we (RMs) are OK with this for PHP 8.1. (/cc @krakjoe / @ramsey)

@kamil-tekiela

Copy link
Copy Markdown
Member

Could we allow readonly only temporarily and with a deprecation message? I don't feel like this is the right solution in the long term.

@ramsey

Copy link
Copy Markdown
Member

As @patrickallaert said, this is approved to target PHP-8.1.

@jrfnl

jrfnl commented Sep 9, 2021

Copy link
Copy Markdown
Contributor

I can't speak for WordPress, only for myself, however:

  1. Should it be allowed for now and in the future (PHP 8.2+)?
  2. If allowed, shouldn't this exception generate a deprecation notice so that we can have something more consistent across keywords as of PHP 8.2 (meaning: disallowing it)?

I fully support this being a temporary exception and for a deprecation warning to be added together with this change.

Removing the exception in PHP 8.2 may be a bit soon. Would it be acceptable to remove it in PHP 9.0, similar to other deprecated functionality from the 8.x series?

For context:
I know WP has created an alternative function name (in the global namespace, but prefixed with wp_) and will actively encourage plugin/theme authors to update their code.

Having said that, not all plugins/themes are still actively maintained, so having some more time will allow a) enough actively maintained plugins/themes to be fixed up and b) enough end-users to find alternative plugins/themes if the plugin/themes is no longer maintained.

  1. Doesn't it make it more complex for IDE, static analyzers, parsers,... to have multiple notions of being a reserved keyword?

As an active maintainer of various PHPCS based coding standards as well as contributor to PHPCS itself, I agree, yes, this will make it more difficult.
Then again, there are already multiple different sets of rules in place for different types of keywords, so this is just one more to add to that list.

Ok, I regret the WP community haven't raised concerns while in alpha/beta, but I feel we haven't much choice and this is not the most critical thing in terms of decision.

Actually I did raise this same concern before: #7089 (comment)

@krakjoe

Copy link
Copy Markdown
Member

Merged as 76348f3

Thanks.

@krakjoekrakjoe closed this Sep 13, 2021
@jrfnl

Copy link
Copy Markdown
Contributor

Thank you all for still making this change this late in the cycle 🙏🏻 💞

jrfnl added a commit to PHPCompatibility/PHPCompatibility that referenced this pull request Dec 4, 2022
… names
PHP 8.0 introduced `match` as a new reserved keyword and `mixed` as a new "other" reserved keyword.
PHP 8.1 introduced `readonly` as a new reserved keyword, `never` as an "other" reserved keyword and `enum` as a soft reserved keyword.
Note: `readonly` has an exception for when it is used as a function declaration name.
Includes regenerated test case files.
Refs:
* https://wiki.php.net/rfc/match_expression_v2
* https://wiki.php.net/rfc/mixed_type_v2#backward_incompatible_changes
* https://wiki.php.net/rfc/readonly_properties_v2
* https://wiki.php.net/rfc/enumerations
* https://wiki.php.net/rfc/noreturn_type#backwards_incompatible_changes
* php/php-src#7468 (readonly exception in PHP 8.1)
* php/php-src#9512 (readonly exception PHP 8.2 follow-up)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@nikic@jrfnl@mvorisek@ramsey@patrickallaert@Girgias@kamil-tekiela@krakjoe