-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Implement readonly properties #7089
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Hi all, |
@matthieu88160 Constants are by definition readonly. Not sure how that would make sense. Also note that the mailing list is the primary tool for feedback when it comes to specification. |
My bad, I was thinking modification was allowed. |
@nikic Here are two more tests for useful use-cases of overriding a --TEST--
Visibility can change in readonly property
--FILE--
<?php
class A {
protected readonly int $prop;
public function __construct() {
$this->prop = 42;
}
}
class B extends A {
public readonly int $prop;
}
$a = new A();
try {
var_dump($a->prop);
} catch (\Error $error) {
echo $error->getMessage() . "\n";
}
$b = new B();
var_dump($b->prop);
?>
--EXPECT--
Cannot access protected property A::$prop
int(42) --TEST--
Can override readonly property with attributes
--FILE--
<?php
#[Attribute]
class FooAttribute {}
class A {
public readonly int $prop;
public function __construct() {
$this->prop = 42;
}
}
class B extends A {
#[FooAttribute]
public readonly int $prop;
}
var_dump((new ReflectionProperty(B::class, 'prop'))->getAttributes()[0]->newInstance());
?>
--EXPECT--
object(FooAttribute)#1 (0) {
} |
Method parameters can be readonly: |
Hey guys, I would like to add my few objections you might want to consider:
Of course there is option to merge both behaviors by adding modifier to readonly - so having Thank you for your attention and considering this opinions :) |
Please note that the feature is currently in voting, so any change should be warranted very much. Points 3 and 4 have already been discussed to death, I believe the RFC provides background information why the Implementing an Point 1 would render the feature broken, since any property value could be changed in private scope at any time, simply by unsetting it first. |
is_initialized() was recently discussed and declined (https://externals.io/message/114607). |
OK guys, thanks for your reply and sorry to bother you :) |
1bc5f49
to
c890185
Compare
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Please keep these comments to the mailing list, the PR is not a forum for such |
Noted.
…On Fri, Jul 16, 2021 at 9:28 AM Kalle Sommer Nielsen < ***@***.***> wrote:
Please keep these comments to the mailing list, the PR is not a forum for
such
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#7089 (comment)>, or
unsubscribe
<https://github.com/notifications/unsubscribe-auth/AJ5JVLQ7DVUE2BCE2EGBXLLTX7GRFANCNFSM456ZXYQQ>
.
|
fe4c9e0
to
2137465
Compare
There was a test checking this, but it didn't actually have the correct result, duh.
There's only one possible set of flags for objects, and the assigned type is hardcoded anyway.
8af4aae
to
968a399
Compare
Hi, @nikic just tried this out, is it intentional that it's now possible to skip the public visibility modifer in promoted properties and regular class ClassName
{
readonly int $prop1;
function __construct(
readonly array $prop2,
) {
$this->prop1 = \count($prop2);
}
}
\var_dump(new ClassName([1,2])); |
Just FYI as I didn't see mention of the impact of If nothing else, this affects WordPress - and by extension potentially all plugins and themes in its ecosphere. So far, the impact is estimated to be relatively small as the function (to add the |
This comment has been minimized.
This comment has been minimized.
Please use the mailing list for these discussions. The repercussions of a keyword are clear to voters. The suggestion of no $ was mentioned on the mailing list and not well received. While it avoids the BC break it's very subtle and doesn't communicate intent well. It's also way to late for this discussion in the first place. This RFC was in discussion for months. |
Includes unit tests. Refs: * https://wiki.php.net/rfc/readonly_properties_v2 * php/php-src#7089 * php/php-src@6780aaa
* PHP 8.1 | MigrationGuide/New constants: add missing constants [1] > * Added CURLOPT_DOH_URL option > * Added certificate blob options when for libcurl >= 7.71.0: > > CURLOPT_ISSUERCERT_BLOB > CURLOPT_PROXY_ISSUERCERT > CURLOPT_PROXY_ISSUERCERT_BLOB > CURLOPT_PROXY_SSLCERT_BLOB > CURLOPT_PROXY_SSLKEY_BLOB > CURLOPT_SSLCERT_BLOB > CURLOPT_SSLKEY_BLOB Refs: * https://github.com/php/php-src/blob/f67986a9218f4889d9352a87c29337a5b6eaa4bd/UPGRADING#L220-L229 * php/php-src#6612 * php/php-src@3dad63b * php/php-src#7194 * php/php-src@b11785c * PHP 8.1 | MigrationGuide/New constants: add missing constants [2] > GD: > * Avif support is now available through the `imagecreatefromavif()` and > `imageavif()` functions, if libgd has been built with avif support. While not mentioned in the changelog entry, the commit to PHP does contain a new constant declaration... Refs: * https://github.com/php/php-src/blob/f67986a9218f4889d9352a87c29337a5b6eaa4bd/UPGRADING#L245-L247 * php/php-src#7026 * php/php-src@81f6d36#diff-00d1efef2247b288c86a6c3bfefac111a4774fbc5453fdc02dcf36c4a23da283R373 > GD: > * `imagewebp()` can do lossless WebP encoding by passing `IMG_WEBP_LOSSLESS` as > quality. This constant is only defined, if a libgd is used which supports > lossless WebP encoding. Refs: * https://github.com/php/php-src/blob/3a71fcf5caf042a4ce8a586a6b554fd70432e1e2/UPGRADING#L568-L571 * php/php-src#7348 * php/php-src@eb6c9eb * PHP 8.1 | MigrationGuide/New constants: add missing constants [3] > Added `POSIX_RLIMIT_KQUEUES` and `POSIX_RLIMIT_NPTS`. These rlimits are only available on FreeBSD. Refs: * https://www.php.net/manual/en/migration81.new-features.php#migration81.new-features.posix * php/php-src#6608 * php/php-src@ebca8de * PHP 8.1 | MigrationGuide/New constants: add missing constants [4] Refs: * https://wiki.php.net/rfc/readonly_properties_v2 * php/php-src#7089 * php/php-src@6780aaa * PHP 8.1 | MigrationGuide/New constants: add missing constants [5] While not mentioned anywhere at all, the commit to PHP itself adding support for the Sodium xchacha* functions, does declare a couple of new constants as well... Refs: * php/php-src#6868 * php/php-src@f7f1f7f#diff-3fe4027560fd299248af1dc1efe04287cc2b6418e8f01755c05c9db64b668b1eR352-R357 While not mentioned anywhere at all, the commit to PHP itself adding support for the Sodium ristretto255* functions, also declares a number of new constants as well... Refs: * php/php-src#6922 * php/php-src@9b794f8#diff-3fe4027560fd299248af1dc1efe04287cc2b6418e8f01755c05c9db64b668b1eR368-R381 Co-authored-by: jrfnl <[email protected]> Closes GH-1449.
> Readonly properties > > Support for `readonly` has been added. Refs: * https://www.php.net/manual/en/migration81.new-features.php#migration81.new-features.core.readonly * https://wiki.php.net/rfc/readonly_properties_v2 * php/php-src#7089 * php/php-src@6780aaa Includes unit tests. Includes sniff documentation.
* PHP 8.1 | MigrationGuide/New constants: add missing constants [1] > * Added CURLOPT_DOH_URL option > * Added certificate blob options when for libcurl >= 7.71.0: > > CURLOPT_ISSUERCERT_BLOB > CURLOPT_PROXY_ISSUERCERT > CURLOPT_PROXY_ISSUERCERT_BLOB > CURLOPT_PROXY_SSLCERT_BLOB > CURLOPT_PROXY_SSLKEY_BLOB > CURLOPT_SSLCERT_BLOB > CURLOPT_SSLKEY_BLOB Refs: * https://github.com/php/php-src/blob/f67986a9218f4889d9352a87c29337a5b6eaa4bd/UPGRADING#L220-L229 * php/php-src#6612 * php/php-src@3dad63b * php/php-src#7194 * php/php-src@b11785c * PHP 8.1 | MigrationGuide/New constants: add missing constants [2] > GD: > * Avif support is now available through the `imagecreatefromavif()` and > `imageavif()` functions, if libgd has been built with avif support. While not mentioned in the changelog entry, the commit to PHP does contain a new constant declaration... Refs: * https://github.com/php/php-src/blob/f67986a9218f4889d9352a87c29337a5b6eaa4bd/UPGRADING#L245-L247 * php/php-src#7026 * php/php-src@81f6d36#diff-00d1efef2247b288c86a6c3bfefac111a4774fbc5453fdc02dcf36c4a23da283R373 > GD: > * `imagewebp()` can do lossless WebP encoding by passing `IMG_WEBP_LOSSLESS` as > quality. This constant is only defined, if a libgd is used which supports > lossless WebP encoding. Refs: * https://github.com/php/php-src/blob/3a71fcf5caf042a4ce8a586a6b554fd70432e1e2/UPGRADING#L568-L571 * php/php-src#7348 * php/php-src@eb6c9eb * PHP 8.1 | MigrationGuide/New constants: add missing constants [3] > Added `POSIX_RLIMIT_KQUEUES` and `POSIX_RLIMIT_NPTS`. These rlimits are only available on FreeBSD. Refs: * https://www.php.net/manual/en/migration81.new-features.php#migration81.new-features.posix * php/php-src#6608 * php/php-src@ebca8de * PHP 8.1 | MigrationGuide/New constants: add missing constants [4] Refs: * https://wiki.php.net/rfc/readonly_properties_v2 * php/php-src#7089 * php/php-src@6780aaa * PHP 8.1 | MigrationGuide/New constants: add missing constants [5] While not mentioned anywhere at all, the commit to PHP itself adding support for the Sodium xchacha* functions, does declare a couple of new constants as well... Refs: * php/php-src#6868 * php/php-src@f7f1f7f#diff-3fe4027560fd299248af1dc1efe04287cc2b6418e8f01755c05c9db64b668b1eR352-R357 While not mentioned anywhere at all, the commit to PHP itself adding support for the Sodium ristretto255* functions, also declares a number of new constants as well... Refs: * php/php-src#6922 * php/php-src@9b794f8#diff-3fe4027560fd299248af1dc1efe04287cc2b6418e8f01755c05c9db64b668b1eR368-R381 Co-authored-by: jrfnl <[email protected]> Closes phpGH-1449.
RFC: https://wiki.php.net/rfc/readonly_properties_v2